MC9S12P128单片机写DFLASH时,每次所写的数据都写到0X010A和0x010B两个字节中去了,本意是要写到0x4400为首地址的后续地址空间的,请各位帮帮忙看问题出在哪了
u16 Test;
u16 Buffer[4] = {0x0001,0x0002,0x0003,0x0004} ;
u16 *ptr;
void main(void)
{
__asm SEI; //可屏蔽中断禁止
ptr = Buffer;
MCU_GPIO_Init();
MCU_CPMU_Init();
PORTA_PA0 = 1;
PORTA_PA1 = 0;
DFlashInit();
DFlashEraseSector(DFLASH_START);
DFlashWrite(DFLASH_START,4,ptr);
Test = DFlashRead(DFLASH_START);
if(Test == 0xFFFF)
{
PORTA_PA0 = 0;
PORTA_PA1 = 0;
}
else
{
PORTA_PA0 = 1;
PORTA_PA1 = 1;
}
__asm CLI; //可屏蔽中断使能
for(;;)
{
//_FEED_COP(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
void DFlashWrite(u32 u32DFlashAddress,u8 u8DataLen,u16 *pu16tr)
{
u8 i;
__asm SEI; // 可屏蔽中断禁止
__RESET_WATCHDOG(); // 软件喂狗
while((FSTAT & FSTAT_CCIF_MASK) == 0); // 等待FLASH命令操作完成
FSTAT = 0x30; // 清除ACCERR and PVIOL标识
// Flash存储Data数据长度最长为4个16bit数据
if (u8DataLen > 4)
{
__asm CLI; // 中断使能
//return FlashProgramError; // 本次 Flash Program失败
}
else if (u8DataLen == 4)
{
// 存储FCCOB参数
FCCOBIX = 0x00;
FCCOB = 0x1100; // FCMD = 0x11rogram D-Flash
//FCCOB = 0x1100 | ((u32DFlashAddress & 0x00004400)>>16); // FCMD = 0x11rogram D-Flash
FCCOBIX = 0x01;
FCCOB = (u32DFlashAddress & 0x0000FFFF);
for(i=0; i<u8DataLen; i++) // 填充4个words给FCCOB寄存器,可能有效数据长度不足4words,这时用0xFFFF进行填充
{
FCCOBIX = i+2;
FCCOB = *pu16tr;
pu16tr++;
}
}
else
{
// 存储FCCOB参数
FCCOBIX = 0x00;
FCCOB = 0x1100; // FCMD = 0x11rogram D-Flash
//FCCOB = 0x1100 | ((u32DFlashAddress & 0x00004400)>>16); // FCMD = 0x11rogram D-Flash
FCCOBIX = 0x01;
FCCOB = (u32DFlashAddress & 0x0000FFFF);
for(i=0; i<u8DataLen; i++) // 填充4个words给FCCOB寄存器,可能有效数据长度不足4words,这时用0xFFFF进行填充
{
FCCOBIX = i+2;
FCCOB = *pu16tr;
pu16tr++;
}
for(i=0; i<4-u8DataLen; i++) // 可能有效数据长度不足4words,这时用0xFFFF进行填充
{
FCCOBIX = i+u8DataLen+2;
FCCOB = 0xFFFF;
}
}
FSTAT |= FSTAT_CCIF_MASK; // CCIF清零
while((FSTAT & FSTAT_CCIF_MASK) == 0); // 等待Flash command命令完成
// 返回是否成功操作标识
if ((FSTAT & (FSTAT_ACCERR_MASK|FSTAT_FPVIOL_MASK)) != 0)
{
__asm CLI; // 中断使能
//return FlashProgramError; // 本次 Flash Program失败
}
else
{
__asm CLI; // 中断使能
//return noErr; // 本次 Flash Program成功
}
}
void DFlashEraseSector(u32 u32DFlashAddress)
{
__asm SEI; // 可屏蔽中断禁止
while((FSTAT & FSTAT_CCIF_MASK) == 0); // 等待FLASH命令操作完成
FSTAT = 0x30; // 清除ACCERR and PVIOL标识
FCCOBIX = 0x00;
if (!(u32DFlashAddress & 0x00004400))
{
u32DFlashAddress |= 0x00004400;
}
//FCCOB = 0x1200 | ((u32DFlashAddress & 0x00004400)>>16);
FCCOB = 0x1200;
FCCOBIX = 0x01;
FCCOB = (u32DFlashAddress & 0x0000FFFF);
FSTAT |= FSTAT_CCIF_MASK; // CCIF清零
// FSTAT = 0x80; // 开始执行Flash command命令
while((FSTAT & FSTAT_CCIF_MASK) == 0); // 等待Flash command命令完成
if((FSTAT & (FSTAT_ACCERR_MASK | FSTAT_FPVIOL_MASK)) != 0)
{
__asm CLI; // 中断使能
//return FlashEraseError; // Flash Program失败
}
else
{
__asm CLI; // 中断使能
//return noErr; // Flash Program成功
}
}
void DFlashInit(void)
{
while((FSTAT & FSTAT_CCIF_MASK) == 0); // 等待FLASH命令操作完成
if (FSTAT&0x30) // Check to see if FACCERR or PVIOL are set
{
FSTAT |= 0x30; // 清除ACCERR and PVIOL标识
}
DFPROT = 0xFF;
FCLKDIV = 0x17; // fBus = 24MHz , So set flash prescaler
if (FSTAT&0x30) // Check to see if FACCERR or PVIOL are set
{
FSTAT |= 0x30; // 清除ACCERR and PVIOL标识
}
} |