找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1553|回复: 4
打印 上一主题 下一主题
收起左侧

I2C总线之教科书中的一个错误

[复制链接]
跳转到指定楼层
楼主
ID:266429 发表于 2020-1-30 12:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
应该是这样的:
      在主器件向从器件发送数据时,一旦从器件收到一个有效完整字节后,则从器件立即将SDA拉低,根本不需要主器件再向从器件发送任何信号 ,也就是说应答信号并不是在第9个时钟位出现。这时SDA线将处于低电平状态,如果从器件的该端口一直处于低电平状态,则SDA线将一直处于低电平状态,主器件将无法操作SDA线,后面的事就做不成了,于是,主器件再发一次脉冲,从器件在该脉冲期读取SDA状态,若为零,则判断主器件已收到应答信号,于是,从器件向其SDA端口发送高电平信号以释放对SDA线的控制权,这样才能继续以后的工作。
    具体实验,可以将SDA端口的电平送入另一接有LED指示灯的端口,在程序中先写完发送一字节的程序,然后写一条程序将SDA状态送入LED端口,运行程序以观测LED的亮灭;然后再写一条将SDA拉高的程序,再运行并观测;然后再写一段SCL的脉冲程序,然后再运行观测,就很清楚了。
    这一做法,也可以拿来检验你的编程是否正确,第二次运行后,LED应该灭,第三次运行后,应该亮。
    程序运行中,每一步,你都可以加1S的延时,结合各端口用LED来观测程序运行过程。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:351097 发表于 2020-1-30 16:59 | 只看该作者
I2C通信,如果是主机发给从机,从机一定会做接收回应。主机在每轮数据通信都需要完整提供9个时钟信号,从机会在第8个时钟信号下降沿之后拉低SDA,在第9个时钟信号下降沿之后,从机会释放SDA。如果从机一直没有释放SDA,应该是主机提供时钟信号不完整导致的。
回复

使用道具 举报

板凳
ID:266429 发表于 2020-1-31 16:05 | 只看该作者
I2C通讯时,不管是主机还是从机,数据接收方在收到完整的一字节数据后,都应立即发出一个信号,就是拉低SDA,而不是如教材中所说“先要判断SDA处于高电平后再去拉低SDA”,它不作这个判断;发送方在发送完一字节数据后,则会拉高SDA然后检测SDA是否处于低电平状态,如果检测到是低电平,则认为对方收到了这一字节。也就是双方都要进行确认。
所以说,I2C的时序图,应该是六条线,主、从器件共四个端口每个端口一条线,然后是两条线上的合成图。现在的教材上面基本都只画了合成图。
所谓的应答信号、非应答信号之称,并不合适。可以称之为主机发应答、主机收应答、从机发应答、从机收应答。
回复

使用道具 举报

地板
ID:266429 发表于 2020-1-31 16:09 | 只看该作者
本帖最后由 慢慢思考 于 2020-1-31 18:08 编辑
没有你 发表于 2020-1-30 16:59
I2C通信,如果是主机发给从机,从机一定会做接收回应。主机在每轮数据通信都需要完整提供9个时钟信号,从机 ...

从机在第8个时钟下降沿才刚刚读取SDA,所以,从机一定是在这个下降沿之后才拉低SDA。
回复

使用道具 举报

5#
ID:266429 发表于 2020-1-31 16:53 | 只看该作者
这个验证试验蛮简单,先向从机发送10100001B,程序只写到这里,不写应答程序,然后运行,运行完成后,如果这时从机没有将SDA拉低,SDA将处于高电位,因为最后一位是1。但实际上,如果我们检测一下的话,会发现SDA是处于低电位的。
检测方法可以用万用表,可以用逻辑分析仪。另外,也可以用我另外一个贴子里的方法,我用这个方法已经检测过了。
PS:象这种试验,编程时建议有些数据不要用十六进制十进制神马的,直接用二进制,直观且便于按你的意图修改。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表