本人在用407开发过程中,要将设备配置参数写入EEPROM,但是在ucos操作下,如果在临界区里使用AT24CXX_Write()会导致写入数据出错,读取出来的数据与写入的不一样,CRC校验通过不了。
BOOLEAN_MINE SaveDefaultToEeprom(void)
{
DATA_SAVE_TO_EEPROM savedata_backup;
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL();
data_save_to_eeprom.EEP_Calibration=Common_CRC16_Check((u8 *)&data_save_to_eeprom,sizeof(DATA_SAVE_TO_EEPROM)-2);
AT24CXX_Read(EEP_STARTADDR,(u8*)&savedata_backup,sizeof(DATA_SAVE_TO_EEPROM));
if(memcmp(&data_save_to_eeprom,&savedata_backup,sizeof(DATA_SAVE_TO_EEPROM))) //如果发现EEPROM里的数据和要写入的数据不一样
{
AT24CXX_Write(EEP_STARTADDR,(u8*)&data_save_to_eeprom,sizeof(DATA_SAVE_TO_EEPROM));
}
OS_EXIT_CRITICAL();
return TRUE;
}
但是将临界区注释掉之后,写入就没有问题,读取出来的数据也是对的。
BOOLEAN_MINE SaveDefaultToEeprom(void)
{
DATA_SAVE_TO_EEPROM savedata_backup;
// OS_CPU_SR cpu_sr;
// OS_ENTER_CRITICAL();
data_save_to_eeprom.EEP_Calibration=Common_CRC16_Check((u8 *)&data_save_to_eeprom,sizeof(DATA_SAVE_TO_EEPROM)-2);
AT24CXX_Read(EEP_STARTADDR,(u8*)&savedata_backup,sizeof(DATA_SAVE_TO_EEPROM));
if(memcmp(&data_save_to_eeprom,&savedata_backup,sizeof(DATA_SAVE_TO_EEPROM))) //如果发现EEPROM里的数据和要写入的数据不一样
{
AT24CXX_Write(EEP_STARTADDR,(u8*)&data_save_to_eeprom,sizeof(DATA_SAVE_TO_EEPROM));
}
// OS_EXIT_CRITICAL();
return TRUE;
}
我又单独做了一份程序来验证的,只有EEPROM读写一个任务,没有用到中断。请问这是什么原因导致的,感觉进临界区不会影响软件模拟IIC端口的时序啊! |