硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4194|回复: 2
收起左侧

[有问必答] eeprom写操作中运行bsp_DelayMS就死机

[复制链接]

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 2017-10-24 08:55:54 | 显示全部楼层 |阅读模式
由于eeprom写操作时候必须加入延时,否则写入有些数据会失败,但是用了demo里面的bsp_DelayMS()函数,运行到这个函数就死机,硬件仿真发现一只在这个函数的while循环里面出不去,此时滴答定时中断SysTick_ISR()也进不去,就在bsp_DelayMS这里死循环,不知道什么原因。难道是I2C里面不能用这个bsp_DelayMS函数吗?或者说是软件的BUG。找了 N天实在没办法,才来发帖。

//在AT24CXX指定地址写入一个数据
//WriteAddr  :写入数据的目的地址   
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u8 msb, u16 WriteAddr,u8 DataToWrite)
{   
#ifdef AT24C1024
    //最高位仅适用于24C1024
    if(msb==0x01) msb=0x02;
    else msb=0;
#endif

    i2c_Start();  
    if (EE_ADDR_BYTES == 2)
    {
        #ifdef AT24C1024
        i2c_SendByte(0XA0 | msb);       //发送写命令
        #else
        i2c_SendByte(0XA0);       //发送写命令
        #endif
        i2c_WaitAck();
        i2c_SendByte(WriteAddr>>8);//发送高地址
     }
    else
    {
        i2c_SendByte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据
    }     
    i2c_WaitAck();      
        i2c_SendByte(WriteAddr%256);   //发送低地址
    i2c_WaitAck();                                                           
    i2c_SendByte(DataToWrite);     //发送字节                              
    i2c_WaitAck();                     
       i2c_Stop();//产生一个停止条件
    bsp_DelayMS(10); //用这个延时会死机不知道什么原因
}
回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
发表于 2017-10-24 14:00:33 | 显示全部楼层
是不是别的地方也用了滴答定时器,冲突了?
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2017-10-24 19:20:48 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:是不是别的地方也用了滴答定时器,冲突了? (2017-10-24 14:00) 
问题找到了,我错把写eeprom的函数放在了void bsp_RunPer10ms(void) 。之前想实现的是设备通信超时存储故障记录的。用了这个函数判断超时时间。结果在这个函数里面运行了延时函数,造成滴答定时器冲突,进不了中断。现在已经修改了软件,运行正常。谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 23:24 , Processed in 0.276894 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表