打印

求助:I2C读字节程序小疑问

[复制链接]
1935|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leshak|  楼主 | 2012-1-30 21:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, se, sd, AC, RS
读字节程序如下:
READ:   MOV     R0.#08H   一个字节8BIT
LOP2:  SETB      SCL
             ACALL  DELAY    转延时程序
             MOV     C,SDA
             RLC      A
             CLR      SCL
             ACALL   DELAY
             DJNZ     R0,LOP2
             CJNE     R7,#1,LOP3    R7是要读8个字节
             SETB    SDA
             AJMP     SETOK
LOP3:  CLR       SDA
SETOK: ACALL   DELAY
            SETB     SCL
            ACALL   DELAY
             CLR      SCL
             ACALL   DELAY
             SETB     SDA
              RET
红色部分的程序我不是很明白,我不知道这样理解是否正确。
如果R7为1,那是读最后一个字节的数据,SDA拉高,跳SETOK,执行延时,拉高SCL,I2C停止。继续延迟,后面再为什么要再CLR  SCL和SETB SDA什么作用呢?

如果R7不为1,则代表还有数据要读,转LOP3,延时,拉低SDA是代表51确认读取到了数据?拉高SCL 响应? 如果是响应的话那再CLR  SCL和SETB SDA什么作用呢?
    望指教,谢谢哈。

相关帖子

沙发
airwill| | 2012-1-31 10:21 | 只看该作者
这是 I2C 的协议规定的.
在连续读取的时序里, 如果在读取完成当前这个字节后要继续读取, 则发送 ACK, 如果是最后一个字节了, 就发送 NACK.
这段代码不太好, 显得结构混乱! 这个 ACK 应该在 RET 后面的主程序里处理比较恰当.

使用特权

评论回复
板凳
程序匠人| | 2012-1-31 20:55 | 只看该作者
看这类通讯类的程序最好是结合时序图看。

使用特权

评论回复
地板
ningling_21| | 2012-1-31 23:19 | 只看该作者
用示波器测试一下波形,并结合书上的I2C通信波形图来看就容易理解 了。

使用特权

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

本版积分规则

101

主题

522

帖子

4

粉丝