用的是原子提供的模拟I2C程序举例子。首先原来的原子程序SDA输出数据的时候是推挽,输入数据的时候是上拉输入。然后频繁在输入输出之间切换,这样我感觉很麻烦,所以就想起以前用51时候的双向IO。记得在数据手册上明确看到了设置成OD的时候可以读数据。
● 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态
在数据手册的108页。
然后我讲SCL和SDA全部换成开漏输出,并去掉了SDA的输入输出转换,但是,我发现并不能正常,于是,根据控制变量法,我一个一个改变量。先讲SCL改开漏。保留SDA的输入输出转换过程。发现读取正常。然后,将SDA的推挽输出改成开漏输出(有上拉电阻),输入改上拉输入,任然OK的。于是继续变。全部改开漏,结果失败。然后我就想,是不是改了开漏之后由于没有执行输入输出转换函数的时间差导致I2C失败?然后我就手动加个delay吧。结果还是不行。然后我看到了SDA速度2M。猜想是不是速度问题,果断改成50M。结果仍然不如我所愿。然后我就debug。发现总是停留在第二个WaiAck.这里,读不到响应。用逻辑分析仪也是从这开始出问题,并且后面开漏输出地址的时候也只输出几位就停止输出了。这里我只是猜测开漏输出有BUG,如果有大神成功了的,请教育一下,并求把驱动发给我。。。
谢谢~~~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
SCL是设置成开漏输出,主要是SDA设置成开漏不能正确的输入/输出
一周热门 更多>