[N32L4xx] N32L403的I2C有BUG?

[复制链接]
1704|6
 楼主| desertsailor 发表于 2025-6-11 20:27 | 显示全部楼层 |阅读模式
使用N32L403的I2C,通过查询方式读写AT24C256,单次读或写多个字节,存在卡死的情况,而且这种现象的出现似乎与代码对齐有关系,当出现卡死的情况时,在相关代码前增加一条无关指令后又能稳定工作了,删去这条无关指令稳定出现卡死的现象。大家有遇到这种情况吗?原厂的技术人员能否解答一下?
chenqianqian 发表于 2025-6-11 22:00 来自手机 | 显示全部楼层
IIC本身也简单,不会存在bug吧。
dffzh 发表于 2025-6-12 08:45 | 显示全部楼层
咱一般都用模拟IIC,感觉比MCU硬件IIC用起来方便,特别是做MCU和外置flash/eeprom芯片的通信的时候。
lemonboard 发表于 2025-6-12 22:44 | 显示全部楼层
看看官方的堪误文档,里面有就代表真的有bug。如果没有,估计也是很难发现的bug。
不会像楼主这么简单就测试出来了
liangshuang95 发表于 2025-6-13 08:14 来自手机 | 显示全部楼层
我认为应该不是bug,如果是的话很多人都反馈了。
爱情海玩偶 发表于 2025-6-13 09:45 | 显示全部楼层
不给源码怎么给你排查
 楼主| desertsailor 发表于 2025-6-15 22:34 | 显示全部楼层
阻塞式写入,
  1. while(I2C1->STS2 & I2C_STS2_BUSY);      //等待总线空闲  
  2.         I2C1->CTRL1 |= I2C_CTRL1_STARTGEN ;     //产生起始信号
  3.         while(!(I2C1->STS1 & I2C_STS1_STARTBF));//起始信号已发出
  4.         I2C1->DAT = WD_ADDR;                    //要读写器件的地址
  5.         while(!(I2C1->STS1 & I2C_STS1_ADDRF));  //地址发送结束
  6.         temp = I2C1->STS2;                      //读取一次清除标志位
  7.         I2C1->DAT = Addr>>8;                    //地址高字节
  8.         while(!(I2C1->STS1 & I2C_STS1_TXDATE)); //字节发送完毕
  9.         I2C1->DAT = Addr & 0x00FF;
  10.         while(!(I2C1->STS1 & I2C_STS1_TXDATE));      
  11.         for(i=0; i<Num; i++)
  12.         {
  13.                 I2C1->DAT = *(pBuffer+i);
  14.                 while(!(I2C1->STS1 & I2C_STS1_TXDATE));  
  15.         }
  16.         I2C1->CTRL1 |= I2C_CTRL1_STOPGEN;       //发送停止位   

稳定卡死在几个while处,但只要增加一条NOP之类的无关指令就不会卡死了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

522

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部