纠正原子STM32例程中IIC的一处错误

2019-10-16 07:34发布

最近做一个STM32项目时移植了原子STM32例程中的模拟IIC驱动程序,调试时发现错误经简单排查发现一处错误,先分享出来避免其他人遇到同样问题,也希望原子更正程序源码(因为我目前所有开发板都有这出错误)

原子源代码

首先看读数据的

1、椭圆框内有一个等待ACK应答  IF语句结束后又一个等待ACK应答  当定义器件大于AT24C16时 就会连续执行两个等待ACK造成 读数失败。
2、方框内 当器件小于等于AT24C16 执行IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   我觉得这个0XA0+((WriteAddr/256)<<1)完全没必要,我们来分析下  当器件小于等于AT24C16 时 地址范围是0-0xff 那么WriteAddr/256=0   0<<1=0 在加上0xa0还是0xa0 那么执行这个是什么作用的,而且这里是发送的器件地址,一般硬件确定了地址就确定了,及时想做地址可变的也不应该跟数据地址做关联,而是应该跟硬件上的A0 A1 A2 通过IO读取地址做关联,对此表示十分疑惑,所以 直接IIC_Send_Byte(0XA0); 可以了 ,
3、读字节
内同样有IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));  问题同2.

另外通过删除IF内的ACK后AT
24C512工作正常,再此也算帮原子测试AT24C512了。

更多内容回复后可查看
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
23条回答
m114714336
1楼-- · 2019-10-17 21:40
IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));  这句 我也很疑惑 不晓得  ((WriteAddr/256)<<1)是干嘛用的  这是发送器件地址直接A0不就行了
lipengyun168
2楼-- · 2019-10-18 00:04
大神!!!!!!
ynuman
3楼-- · 2019-10-18 01:44
顶!!!!!!
zwd827109273
4楼-- · 2019-10-18 02:23
可以可以!
chenghuayou
5楼-- · 2019-10-18 02:32
 精彩回答 2  元偷偷看……

一周热门 更多>