打印
[CW32F030系列]

库函数里的这个I2C发送函数是不是有问题

[复制链接]
286|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yuyy1989 于 2023-5-22 20:18 编辑

最近申请的CW32F30核心板到了,正在研究,移植I2C设备时查看库函数,感觉这个发送函数有问题
感觉会数组越界或者陷入死循环,例如最简单的发送1个字节的数据,执行完I2C_SendData(I2Cx,pu8Data[u8i++]);后u8i为1,按照if(u8i>u32Len)的判断条件循环还会继续执行,如果从机返回ACK又会执行I2C_SendData(I2Cx,pu8Data[u8i++]);这时就数组越界了,如果返回NACK就跳不出循环了

使用特权

评论回复
沙发
pssyx| | 2023-5-23 11:45 | 只看该作者
本帖最后由 pssyx 于 2023-5-23 11:55 编辑

谢谢您的指正!后续Lib代码升级将修正此部分代码。
1、此处的确存在数组越界的问题,执行I2C_SendData(I2Cx,pu8Data[u8i++])之后,主机只是将待发送数据保存到I2C的数据寄存器DR,并不立即发送到I2C总线上,必须等到执行I2C_ClearIrq(I2Cx),清零 I2C_CR.SI 位之后,才发送DR的数据,同时因if(u8i>u32Len)条件语句,会提前结束此次I2C发送操作;
2、因if(u8i>u32Len)条件,即使从机返回NACK,也能正常退出此I2C发送函数,不会陷入死循环。
3、简单修改代码,可以试试:(1)uint8_t u8i = 1; (2)I2C_SendData(I2Cx,pu8Data[u8i-1]); u8i++;


使用特权

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

本版积分规则

146

主题

698

帖子

6

粉丝