返回信息流目前做单片机的开发时遇到很多问题,尤其是硬件上的,由于缺乏经验,解决不了很苦恼,希望征个朋友可以一起讨论学习。
这是一条镜像帖。来源:北邮人论坛 / circuit / #14500同步于 2010/7/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖
请教单片机I2C通信的问题
pigg
2010/7/19镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 pigg 的大作中提到: 】
: 目前做单片机的开发时遇到很多问题,尤其是硬件上的,由于缺乏经验,解决不了很苦恼,希望征个朋友可以一起讨论学习。
你遇见什么问题,说吧~
【 在 pigg 的大作中提到: 】
: 目前做单片机的开发时遇到很多问题,尤其是硬件上的,由于缺乏经验,解决不了很苦恼,希望征个朋友可以一起讨论学习。
: --
我在做ST72f321bar9和PT2313L的单片机I2C通信,在debug的时候我发现我的程序在stvd里跑不起来,单步的时候能通过必须是单步从start条件那个函数开始,如果从后面送地址开始单步运行就会出现(从示波器上看)PT没有拉低ACK,单片机也没有收到ACK,通信就进行不下去了。
【 在 pigg 的大作中提到: 】
: 我在做ST72f321bar9和PT2313L的单片机I2C通信,在debug的时候我发现我的程序在stvd里跑不起来,单步的时候能通过必须是单步从start条件那个函数开始,如果从后面送地址开始单步运行就会出现(从示波器上看)PT没有拉低ACK,单片机也没有收到ACK,通信就进行不下去了。
木有用过你说的两个单片机,但对I2C还是做过的
如果是自己写的函数,建议最开始不要用任何函数封装,先实现通信再把必要的部分封装起来
如果是从网上找的函数,建议把I2C通信协议看懂,然后对照函数一步一步调试
其实我觉得还是自己写比较靠谱
嗯?什么是“不要用任何函数封装,先实现通信再把必要的部分封装起来”啊?是我自己写的程序,st的单片机是带I2C2的接口的,我把程序从start()那个函数开始单步运行就一切都很好,但是如果从start()那个函数后开始单步运行就会出现从送地址给PT(不是单片机),PT就回不了ACK,RUN的时候跟这种情况一样。
【 在 pigg 的大作中提到: 】
: 在start()之前,是初始化的部分,start()里就是将单片机的start bit“置一”,从而产生初始条件;
I2C不就只有两根线咯,一个sda,一个sclk.
我记得开始信号时sclk为低电平的时候将sda拉高表示开始吧,忘了,反正挺复杂的
我说的意思是如果你自己写通信过程的话,第一步不要使用任何函数调用,从头到尾一步一步严格按照通信协议来,即使是重复的部分,比如开始信号也别偷懒,不用函数封装,用一次就写一次
实现通信过程没有问题之后,再把相同的部分用函数封装起来。这样做的好处是首先不用函数封装对于I2C协议的具体细节能够更好的把握,而且出了问题也比较容易查证。后期使用函数封装也有了前期已经实现的保证。
不知道我这样说你明白了没?
【 在 pigg 的大作中提到: 】
: 明白了。但是,请问一下,你觉得这种只能单步运行不能run有可能是什么原因吗?(硬件or程序)
I2C对时间有要求,最高400K的速度,所以快点的单片机需要在合适的地方等待一段时间。
我猜可能直接运行速度太快导致的