I2C(Inter-Integrated Circuit,集成电路总线)
任意两个设备之间都可以进行通信,但同一时刻只能有两个设备之间通信,且数据只能单向传输(半双工)
I2C规定将发起通信的设备称为主设备,主设备发起一次通信后,其它设备均为从设备。主设备需要向从设备产生并发送时钟信号。
数据格式
传输流程
写操作流程:
主芯片要发出一个start信号
然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)
从设备回应(用来确定这个设备是否存在),然后就可以传输数据
主设备发送一个字节数据给从设备,并等待回应
每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
数据发送完之后,主芯片就会发送一个停止信号。
上图:白色背景表示"主→从",灰色背景表示"从→主"
通讯的起始和停止信号
当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始。
当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止。
响应
i2c的数据字节定义为8-bits长度,对每次传送的总字节数量没有限制,但对每一次传输必须伴有一个应答(ACK)信号, 其时钟由主设备提供,而真正的应答信号由从设备发出,在时钟为高时,通过拉低并保持SDA的值来实现。如果从设备忙, 它可以使 SCL保持在低电平,这会强制使主设备进入等待状态。当从设备空闲后,并且释放时钟线,原来的数据传输才会继续。
数据有效性
I2C使用SDA信号线来传输数据,使用SCL信号线进行数据同步,如下图。 SDA数据线在SCL的每个时钟周期传输一位数据。(scl=1时,sda的数据有效;scl=0,sda数据改变)
传输时,SCL为高电平的时候SDA表示的数据有效,即此时的SDA为高电平时表示数据“1”,为低电平时表示数据“0”。
当SCL为低电平时,SDA的数据无效,一般在这个时候SDA进行电平切换,为下一次表示数据做好准备。
如何在SDA上实现双向传输?
主芯片通过一根SDA线既可以把数据发给从设备,也可以从SDA上读取数据,连接SDA线的引脚里面必然有两个引脚(发送引脚/接受引脚)。
主、从设备都可以通过SDA发送数据,肯定不能同时发送数据,怎么错开时间?
在9个时钟里,
前8个时钟由主设备发送数据的话,第9个时钟就由从设备发送数据;
前8个时钟由从设备发送数据的话,第9个时钟就由主设备发送数据。
双方设备中,某个设备发送数据时,另一方怎样才能不影响SDA上的数据?
硬件原理
电容在上电瞬间相当于短路,此时三极管导通,SDA电平由高到低
因电容两端的电压不能突变,电容再通电的之间,两端的电压为0,当接通的瞬间,它的电压不能突变,还是0V,而此时电源的电流就等于电源的空载电压除以电源的内阻了,相当于电源被短路了.当过一段时间后,电容两端的电压慢慢升高,最后与电源电压一样高,这时电容不再充电,也不存在充电电流了,相当于开路一样
举例:
主设备发送(8bit)给从设备
前8个clk
从设备不要影响SDA,从设备不驱动三极管
主设备决定数据,主设备要发送1时不驱动三极管,要发送0时驱动三极管
第9个clk,由从设备决定数据
主设备不驱动三极管
从设备决定数据,要发出回应信号的话,就驱动三极管让SDA变为0
从这里也可以知道ACK信号是低电平
为何SCL也要使用上拉电阻?
在第9个时钟之后,如果有某一方需要更多的时间来处理数据,它可以一直驱动三极管把SCL拉低。
当SCL为低电平时候,大家都不应该使用IIC总线,只有当SCL从低电平变为高电平的时候,IIC总线才能被使用。
当它就绪后,就可以不再驱动三极管,这是上拉电阻把SCL变为高电平,其他设备就可以继续使用I2C总线了。
优缺点
I2C的优点:
只需要两根信号线就可以完成传输。
支持多个主机和从机。
硬件结构比UART更简单。
相比于UART,没有严格的波特率要求,但主设备需要生成总线时钟。
I2C的缺点:
I2C的传输速率比不上SPI,是为了与低速设备通信而发明的。
数据帧大小限制为8位。文章来源:https://www.toymoban.com/news/detail-714764.html
只能进行半双工通信。文章来源地址https://www.toymoban.com/news/detail-714764.html
到了这里,关于通信协议之IIC 最详细解读!!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!