找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1820|回复: 14
收起左侧

关于IIC通信格式的问题

[复制链接]
ID:450037 发表于 2021-10-27 14:39 | 显示全部楼层 |阅读模式
捕获.PNG 1.PNG

如图,iic通信有起始位,终止位,写字节,读字节,还有写应答和读应答
在读字节里,一开始把数据线和时钟线同时拉低,读出的字节全部是00,而把数据线拉高,时钟线拉低读出的数据正常
或者只把时钟线拉低,数据线不管也是可以正常读取字节的,请问为什么不能把数据线拉低。

回复

使用道具 举报

ID:158375 发表于 2021-10-27 15:29 | 显示全部楼层
你还是好好读一读I2C协议吧.
回复

使用道具 举报

ID:450037 发表于 2021-10-27 15:50 | 显示全部楼层
笨笨兔 发表于 2021-10-27 15:29
你还是好好读一读I2C协议吧.

讲啊,没看协议我就不再上面问了。有时候你就是看十遍也不一定能想得通,但是经别人一点拨,就云开雾散了。言归正传。。。
在发送字节时,数据线和时钟线我都拉低,然后字节的最高位与0X80按位与运算,给数据线,时钟线拉高延时,时钟线拉低,循环八次。没问题
在读字节时,为什么数据线不能拉高?比如我先发送字节(地址字节寻找从机),从机发送应答后数据线拉高,问题来了,我在读字节里先给数据线拉低会是什么结果?请高手指点一下
回复

使用道具 举报

ID:624769 发表于 2021-10-27 16:39 | 显示全部楼层
zhangzhao2423 发表于 2021-10-27 15:50
讲啊,没看协议我就不再上面问了。有时候你就是看十遍也不一定能想得通,但是经别人一点拨,就云开雾散了 ...

你在理解上, 有一个误区,  那就是:   I2C 通信,不存在终止位,和起始位。

不同于 Uart 传输,有起始位,和终止位,因为他们是占位的,因此我们Uart传输一个字节的数据,需要10个bit传输,就是 起始位 + 8位数据 + 终止位。

但是,I2C 没有 起始位,终止位,只存在 起始信号 和 终止信号 他们是不占位的。 换句话说,他们可以在任何时候发出。
只要  时钟线(CLK) 在高电平, 这个时候数据线 从0=>1 就是终止信号, 数据线 从1=>0 就是起始信号,数据线 从1=>0=>1 就是再启动信号(说白了,就是停了在开)。
因此,在I2C传输时,数据线是只能在 时钟线(CLK)低电平时发生变化,不然,就是在发送 起始/终止信号,那么后续,你以为的“数据传输”,一定是不会正常发生的。
回复

使用道具 举报

ID:624769 发表于 2021-10-27 16:48 | 显示全部楼层
然后现在来回答,你的应答问题,
数据线时钟线“ 同时拉低” 是不可以的,因为理论上是不存在“同时”的必定有先后,正常操作,除了发送 开始/终止 信号, 都是必须先 拉低 时钟线, 然后拉高/拉低数据线。
然后,接受应答信号时,其实就是返回 ACK/NAK  也就是说,会返回 0/1 , 我们知道电平只能被拉低不能被拉高,所以你必须先把数据线置1,然后发送时钟后,客户机才能返回 0/1,拉低/拉高数据线,让你知道返回的是 ACK/NAK , 当然如果你不判断是ACK/NAK 也没有关系。这个位忽略,不读结果就可以了。
回复

使用道具 举报

ID:401564 发表于 2021-10-27 17:00 | 显示全部楼层
这IIC其实是很简单的,把IIC协议秒一遍基本就能明白一个大概了
1,IIC没有起始位和停止位,那叫起始信号,的停止信号,协议中有说明,这个信号由主机发送
2,应答信号,每次发送或者接收完一个字节的数据,后面要跟上一个一天天信号
发送数据的时候,应答信号由从机给出,用来告诉主机,已经接收完数据了,下一步要干嘛,这是接收到缓存而已,并没有写入IIC器件
读取数据的时候,应答信号由主机给出,用来告诉已经读取完数据了,下一步要干嘛
回复

使用道具 举报

ID:748788 发表于 2021-10-27 17:41 | 显示全部楼层
昨天有人发的“I2C总线读写应答机制详解”,你不妨看看:
http://www.51hei.com/bbs/dpj-213612-1.html
回复

使用道具 举报

ID:123289 发表于 2021-10-28 09:41 | 显示全部楼层
A和B之间在一根线D上通讯。如果A出1,B出0,D上是1是0呢。
明白这个道理之后就知道【为什么不能把数据线拉低。】了。
回复

使用道具 举报

ID:450037 发表于 2021-10-28 10:07 | 显示全部楼层
188610329 发表于 2021-10-27 16:48
然后现在来回答,你的应答问题,
数据线时钟线“ 同时拉低” 是不可以的,因为理论上是不存在“同时”的 ...

电平只能被拉低不能被拉高,那为什么还要置1呢
不是说不能拉高吗
回复

使用道具 举报

ID:450037 发表于 2021-10-28 10:10 | 显示全部楼层
yzwzfyz 发表于 2021-10-28 09:41
A和B之间在一根线D上通讯。如果A出1,B出0,D上是1是0呢。
明白这个道理之后就知道【为什么不能把数据线拉 ...

我软件置0,它硬件置1,数据线电平信号不会改变为1 吗?
回复

使用道具 举报

ID:401564 发表于 2021-10-28 10:36 | 显示全部楼层
zhangzhao2423 发表于 2021-10-28 10:10
我软件置0,它硬件置1,数据线电平信号不会改变为1 吗?

数据线置1只是8051的操作
SDA=1;可以让8051内部读取到这个端口的电平状态,可以理解为释放这个端口
而不是说让这个端口输出高电平
而别的单片机就不一定是这样的了
所谓硬件置1......
24Cxx的数据输出是OD输出,它只能输出低电平,也就是说它只能吸入电流,没法输出电流,这就是为什么要上拉电阻的原因
所以,软件输出0,端口就是0

评分

参与人数 1黑币 +5 收起 理由
zhangzhao2423 + 5 很给力!

查看全部评分

回复

使用道具 举报

ID:624769 发表于 2021-10-28 13:05 | 显示全部楼层
zhangzhao2423 发表于 2021-10-28 10:07
电平只能被拉低不能被拉高,那为什么还要置1呢
不是说不能拉高吗

你置了1 才能被拉低.

你置了0 永远拉不高,

你不信邪可以做实验, 置0以后, 用5V接限流电阻到IO, 看看能不能读出个1 来?

评分

参与人数 1黑币 +5 收起 理由
zhangzhao2423 + 5

查看全部评分

回复

使用道具 举报

ID:23640 发表于 2021-10-28 14:03 | 显示全部楼层
信号输入脚配置成了输入模式,再设置输出应该是没用的啊
回复

使用道具 举报

ID:955673 发表于 2021-10-28 15:51 | 显示全部楼层
把 拉高 拉低的说法换成释放和占用就好理解些吧
回复

使用道具 举报

ID:123289 发表于 2021-10-29 09:57 | 显示全部楼层
本帖最后由 yzwzfyz 于 2021-10-30 11:19 编辑

楼主需要补一下硬件知识。硬件上0、1是如何表达的,重点是输出端的电路形式,注意0、1输出各是多少伏电压。
当两个输出端口接在一起时呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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