本帖最后由 yzwzfyz 于 2021-10-30 11:19 编辑 楼主需要补一下硬件知识。硬件上0、1是如何表达的,重点是输出端的电路形式,注意0、1输出各是多少伏电压。 当两个输出端口接在一起时呢? |
把 拉高 拉低的说法换成释放和占用就好理解些吧 |
信号输入脚配置成了输入模式,再设置输出应该是没用的啊 |
zhangzhao2423 发表于 2021-10-28 10:07 你置了1 才能被拉低. 你置了0 永远拉不高, 你不信邪可以做实验, 置0以后, 用5V接限流电阻到IO, 看看能不能读出个1 来? |
参与人数 1 | 黑币 +5 | 收起 理由 |
---|---|---|
![]() | + 5 |
zhangzhao2423 发表于 2021-10-28 10:10 数据线置1只是8051的操作 SDA=1;可以让8051内部读取到这个端口的电平状态,可以理解为释放这个端口 而不是说让这个端口输出高电平 而别的单片机就不一定是这样的了 所谓硬件置1...... 24Cxx的数据输出是OD输出,它只能输出低电平,也就是说它只能吸入电流,没法输出电流,这就是为什么要上拉电阻的原因 所以,软件输出0,端口就是0 |
参与人数 1 | 黑币 +5 | 收起 理由 |
---|---|---|
![]() | + 5 | 很给力! |
yzwzfyz 发表于 2021-10-28 09:41 我软件置0,它硬件置1,数据线电平信号不会改变为1 吗? |
188610329 发表于 2021-10-27 16:48 电平只能被拉低不能被拉高,那为什么还要置1呢 不是说不能拉高吗 |
A和B之间在一根线D上通讯。如果A出1,B出0,D上是1是0呢。 明白这个道理之后就知道【为什么不能把数据线拉低。】了。 |
昨天有人发的“I2C总线读写应答机制详解”,你不妨看看: http://www.51hei.com/bbs/dpj-213612-1.html |
这IIC其实是很简单的,把IIC协议秒一遍基本就能明白一个大概了 1,IIC没有起始位和停止位,那叫起始信号,的停止信号,协议中有说明,这个信号由主机发送 2,应答信号,每次发送或者接收完一个字节的数据,后面要跟上一个一天天信号 发送数据的时候,应答信号由从机给出,用来告诉主机,已经接收完数据了,下一步要干嘛,这是接收到缓存而已,并没有写入IIC器件 读取数据的时候,应答信号由主机给出,用来告诉已经读取完数据了,下一步要干嘛 |
然后现在来回答,你的应答问题, 数据线时钟线“ 同时拉低” 是不可以的,因为理论上是不存在“同时”的必定有先后,正常操作,除了发送 开始/终止 信号, 都是必须先 拉低 时钟线, 然后拉高/拉低数据线。 然后,接受应答信号时,其实就是返回 ACK/NAK 也就是说,会返回 0/1 , 我们知道电平只能被拉低不能被拉高,所以你必须先把数据线置1,然后发送时钟后,客户机才能返回 0/1,拉低/拉高数据线,让你知道返回的是 ACK/NAK , 当然如果你不判断是ACK/NAK 也没有关系。这个位忽略,不读结果就可以了。 |
zhangzhao2423 发表于 2021-10-27 15:50 你在理解上, 有一个误区, 那就是: I2C 通信,不存在终止位,和起始位。 不同于 Uart 传输,有起始位,和终止位,因为他们是占位的,因此我们Uart传输一个字节的数据,需要10个bit传输,就是 起始位 + 8位数据 + 终止位。 但是,I2C 没有 起始位,终止位,只存在 起始信号 和 终止信号 他们是不占位的。 换句话说,他们可以在任何时候发出。 只要 时钟线(CLK) 在高电平, 这个时候数据线 从0=>1 就是终止信号, 数据线 从1=>0 就是起始信号,数据线 从1=>0=>1 就是再启动信号(说白了,就是停了在开)。 因此,在I2C传输时,数据线是只能在 时钟线(CLK)低电平时发生变化,不然,就是在发送 起始/终止信号,那么后续,你以为的“数据传输”,一定是不会正常发生的。 |
笨笨兔 发表于 2021-10-27 15:29 讲啊,没看协议我就不再上面问了。有时候你就是看十遍也不一定能想得通,但是经别人一点拨,就云开雾散了。言归正传。。。 在发送字节时,数据线和时钟线我都拉低,然后字节的最高位与0X80按位与运算,给数据线,时钟线拉高延时,时钟线拉低,循环八次。没问题 在读字节时,为什么数据线不能拉高?比如我先发送字节(地址字节寻找从机),从机发送应答后数据线拉高,问题来了,我在读字节里先给数据线拉低会是什么结果?请高手指点一下 |
你还是好好读一读I2C协议吧. |