I2c:
简介
来源:I2C总线是一种简单、双向二线制同步串行总线。只有两条线作用:器件间近距离经常性数据通信(器件间:是在一块板子之内)比如hi3518ev200和外部的sensor传感器接口就是使用i2c总线的下图是使用i2c接口的OLED显示屏硬件IO
两条线,分别是:SDA(串行数据线):传输通信数据。SCL(串行时钟线):传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。特性
串行:所有的数据以位为单位在SDA线上串行传输。(把数据拆分为一位一位传输)。同步。半双工低速率:I2C一般是用在同一个板子上的2个IC之间的通信,而且用来传输的数据量不大,所以本身通信速率很低,一般几百KHz采用主从模式(Master—Slave)架构,分主设备和从设备,既可以1个主设备对1个从设备,也可以1个主设备对多个从设备。主设备来负责调度i2c总线,决定某一时间和哪个从设备通信。注意:同一时间内,I2C的总线上只能传输一对设备(一个主设备和一个从设备)的通信信息,所以同一时间只能有一个从设备和主设备通信,其他从设备处于“冬眠”状态,不能出来捣乱,否则通信就乱套了。I2C主设备怎么识别从设备的呢?每一个I2C从设备在通信中都有一个I2C从设备地址,这个设备地址是从设备本身固有的属性,然后通信时主设备需要知道自己将要通信的那个从设备的地址,然后在通信中通过地址来甄别是不是自己要找的那个从设备。通信时序
起始条件:SCL线是高电平时,SDA线从高电平向低电平切换。停止条件:SCL线是高电平时,SDA线从低电平向高电平切换。重复起始条件:和起始条件相似,重复起始条件发生在停止条件之前。主机想继续给从机发送消息时,一个字节传输完成后可以发送重复起始条件,而不是产生停止条件。ACK:从设备在第9个clk,把SDA线拉低,表示响应NACK:从设备在第9个clk,没有把SDA线拉低,SDA保持高电平,表示没有响应数据有效性:SCL处于高电平时数据有效,此时SDA必须保持稳定;SCL处于低电平时SDA才能变化通信过程
主设备往从设备写数据 主设备发起起始信号,然后从设备地址和写标志位一共8bit,需要8clk,到9clk,从设备回复应答信号或非应答信号,如果是非应答信号则主设备会发起停止信号停止通信;如果是应答信号,则主设备会继续发送从设备指定寄存器地址,从设备ask,之后主设备发送指定数据给指定到指定寄存器地址完成写数据,从设备ask最后主设备发送停止信号,停止通信主设备从从设备读数据 主设备发起起始信号,发送从设备地址和写标志位,从设备回复应答信号或非应答信号,如果是非应答信号则主设备会发起停止信号停止通信如果是应答信号,则主设备会继续发送从设备指定寄存器地址,从设备ask;之后主设备重新发起一次起始信号,然后发送从设备地址和读标志位,从设备ask之后主设备读取从设备指定寄存器数据,然后主设备发起一个非应答信号,最后主设备发送停止信号,停止通信数据传输格式
主设备在每个通信周期会先发送从设备地址和读写标志位从设备地址有7bit,首位是MSB;读写标志位是1-bit(R/W)的操作符,1表示读,0表示写发送方发送一段数据后,接收方需要回应一个ACK。这个响应本身只有1个bit位,不能携带有效信息,只能表示2个意思(要么表示收到数据,即有效响应;要么表示未收到数据,无效响应)I2C控制器
通信双方本质上是通过时序在工作,但是时序会比较复杂不利于SoC软件完成,于是乎解决方案是SoC内部内置了硬件的控制器来产生通信时序。这样我们写软件时只需要向控制器的寄存器中写入配置值即可,控制器会产生适当的时序在通信线上和对方通信。本文参考:I2C详解(一)_sternlycore的博客-CSDN博客_i2c一文看懂I2C协议 - 知乎I2C总线_百度百科侵删如果觉得《通俗易懂:I2c总线》对你有帮助,请点赞、收藏,并留下你的观点哦!