打印

ucos操作系统下,临界区里用软件IIC写EEPROM出错,求帮助

[复制链接]
247|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本人在用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端口的时序啊!

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

377

主题

377

帖子

0

粉丝