这里讨论一个BUG,关于STM32开漏输出下输出读数据的BUG。

2019-10-11 16:34发布

用的是原子提供的模拟I2C程序举例子。首先原来的原子程序SDA输出数据的时候是推挽,输入数据的时候是上拉输入。然后频繁在输入输出之间切换,这样我感觉很麻烦,所以就想起以前用51时候的双向IO。记得在数据手册上明确看到了设置成OD的时候可以读数据。
● 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
在数据手册的108页。

然后我讲SCL和SDA全部换成开漏输出,并去掉了SDA的输入输出转换,但是,我发现并不能正常,于是,根据控制变量法,我一个一个改变量。先讲SCL改开漏。保留SDA的输入输出转换过程。发现读取正常。然后,将SDA的推挽输出改成开漏输出(有上拉电阻),输入改上拉输入,任然OK的。于是继续变。全部改开漏,结果失败。然后我就想,是不是改了开漏之后由于没有执行输入输出转换函数的时间差导致I2C失败?然后我就手动加个delay吧。结果还是不行。然后我看到了SDA速度2M。猜想是不是速度问题,果断改成50M。结果仍然不如我所愿。然后我就debug。发现总是停留在第二个WaiAck.这里,读不到响应。用逻辑分析仪也是从这开始出问题,并且后面开漏输出地址的时候也只输出几位就停止输出了。这里我只是猜测开漏输出有BUG,如果有大神成功了的,请教育一下,并求把驱动发给我。。。


谢谢~~~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
FreeRTOS
1楼-- · 2019-10-11 19:10
如果STM32作为主机,SCL是不需要设置为输入的,只设置SDA就好了
个人认为你的想法是很好的,STM32的IO虽然设置成输出(开漏/推挽),数据手册上也说明了设为输出时,输入缓冲器会被禁用,但我发现IDR寄存器实际上还是可以检测到IO的变化的
还有一点,你在STM32读取数据时,SDA设为开漏输出高还是低?
suaig
2楼-- · 2019-10-11 20:44
FreeRTOS 发表于 2017-3-14 12:07
如果STM32作为主机,SCL是不需要设置为输入的,只设置SDA就好了
个人认为你的想法是很好的,STM32的IO虽然 ...

SCL是设置成开漏输出,主要是SDA设置成开漏不能正确的输入/输出

一周热门 更多>