Does the code flash can not write the datas in the adds in the MPC5604B?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Does the code flash can not write the datas in the adds in the MPC5604B?

801 Views
ananan
Contributor III

when I writes the data in the add which can not exact division for 8 ,the program is error ,like nextpastedImage_1.png

this is my flash program code 

uint32_t IFlash_Program(uint32_t *P_u32_FlashAddr,uint32_t *P_u32_DataBuf,uint32_t L_u32_Size)
{
uint32_t L_32_FlashArray;
uint32_t L_u32_DataLen;
uint32_t *P_u32_Data;
uint32_t *P_u32_Flash;
uint32_t L_u32_i,L_u32_LoopNum;
uint32_t L_u32_BlockNO;
L_32_FlashArray = Iflash_Addr_Check(P_u32_FlashAddr); //检测flash地址是哪个块,获取编程地址所在flash块(code/data)
if(L_32_FlashArray == STATUS_FAILED) //0 - 失败 ,6 - Code区,7 - Data区
{
return IFlash_ERR_ADDR_OVERRANGE; //地址不在code/data区
}
L_u32_DataLen = L_u32_Size; //编程数据长度
P_u32_Data = P_u32_DataBuf; //编程数据存储区地址
P_u32_Flash = P_u32_FlashAddr; //编程的flash起始地址
L_u32_LoopNum = (L_u32_DataLen)/sizeof(uint32_t); //计算32位字个数,不足32位补齐
if(L_u32_DataLen % sizeof(uint32_t))
{
L_u32_LoopNum++;
}
for(L_u32_i = 0;L_u32_i<L_u32_LoopNum;L_u32_i++)
{
L_u32_BlockNO = IFlash_Addr_To_Block((uint32_t*)P_u32_Flash+L_u32_i);//检测FLash地址所在模块扇区地址
//IFlash_B1F0_BASE
//L_u32_BlockNO = IFlash_Addr_To_Block((uint32_t*)IFlash_B1F0_BASE);
if(L_u32_BlockNO == IFlash_ERR_BLOCK_MATCH_FAILED) //0xFFFF - 失败 ,其他 -- 地址所在的扇区号
{
return IFlash_ERR_BLOCK_MATCH_FAILED;
}
if(IFlash_Get_Lock_State(L_u32_BlockNO,L_32_FlashArray)) //检测FLash扇区是否上锁,0 - 失败 ,1 - 成功
{
return IFlash_ERR_BLOCK_LOCKED;
}
}
while(L_u32_DataLen >=4) //开始编程,最小3字节字编程
{
if(L_32_FlashArray == IFlash_CODE_ARRAY) {CFLASH.MCR.B.PGM = 1;}//如果是CODE区,则闪存CFLASH执行编程序列操作
else {DFLASH.MCR.B.PGM = 1;}//如果是DATA区,则闪存DFLASH执行编程序列操作
if((Flash_st_IFconfig.m_u32ProgramWide == 64)&&(L_u32_DataLen>=8&&(((uint32_t)P_u32_Flash%8)==0)))//64
{
*P_u32_Flash++=*P_u32_Data++;
*P_u32_Flash++=*P_u32_Data++;
L_u32_DataLen = L_u32_DataLen-8;
}
else if((Flash_st_IFconfig.m_u32ProgramWide == 128)&&(L_u32_DataLen>=16&&(((uint32_t)P_u32_Flash%16)==0)))//128
{
*P_u32_Flash++=*P_u32_Data++;
*P_u32_Flash++=*P_u32_Data++;
*P_u32_Flash++=*P_u32_Data++;
*P_u32_Flash++=*P_u32_Data++;
L_u32_DataLen = L_u32_DataLen-16;
}
else //32
{
*P_u32_Flash++=*P_u32_Data++;
L_u32_DataLen = L_u32_DataLen-4;
}
if(L_32_FlashArray==IFlash_CODE_ARRAY) //如果是CODE区
{
CFLASH.MCR.B.EHV = 1; //EHV 位为闪存模块的一个高电压程序擦除操作。开高压,开擦
while(CFLASH.MCR.B.DONE == 0){}; //修改操作完成,等待完成
for(L_u32_i=0;L_u32_i<300;L_u32_i++){};
CFLASH.MCR.B.EHV = 0; //不执行高压操作
if(CFLASH.MCR.B.PEG == 0) //编程/擦除 是否成功 0失败 1成功
{
//CFLASH.MCR.B.PGM = 0;
return IFlash_ERR_PROGRAM; //编程错误
}
CFLASH.MCR.B.PGM = 0;
}
else //如果是DATA区
{
DFLASH.MCR.B.EHV = 1; //EHV 位为闪存模块的一个高电压程序擦除操作。开高压,开擦
while(DFLASH.MCR.B.DONE == 0){};
for(L_u32_i=0;L_u32_i<300;L_u32_i++){};
DFLASH.MCR.B.EHV = 0; //不执行高压操作
if(DFLASH.MCR.B.PEG == 0)
{
//DFLASH.MCR.B.PGM = 0;
return IFlash_ERR_PROGRAM; //编程错误
}
DFLASH.MCR.B.PGM = 0;
}
}
return IFlash_ERR_NULL; //返回值:无错误
}

pastedImage_1.png

pastedImage_2.png

pastedImage_3.png

0 Kudos
4 Replies

748 Views
lukaszadrapa
NXP TechSupport
NXP TechSupport

Hi,

it looks like this is the source of your troubles:

pastedImage_1.png

Regards,

Lukas

748 Views
ananan
Contributor III

I get another question in my new message 5 minutes befor,if you know,please tell me ,thankyou!

0 Kudos

748 Views
ananan
Contributor III

thank you!

0 Kudos

748 Views
ananan
Contributor III

I get another question in my new message 5 minutes befor,if you know,please tell me ,thankyou!

0 Kudos