成都网站外包公司,网站抓取诊断,网站空间购买多少钱,专业网站设计专家I2C通信协议I2C通信协议的基础简介I2C「Inter-integrated Circuit」总线支持设备之间的短距离通信#xff0c;用于处理器和一些外围设备之间的接口#xff0c;它只需要两根信号线来完成信息交换。I2C最早是飞利浦在1982年开发设计。I2C是同步传输信号#xff0c;关于同步和异… I2C通信协议I2C通信协议的基础简介I2C「Inter-integrated Circuit」总线支持设备之间的短距离通信用于处理器和一些外围设备之间的接口它只需要两根信号线来完成信息交换。I2C最早是飞利浦在1982年开发设计。I2C是同步传输信号关于同步和异步这个经常在面试的时候会考到同步和异步的核心的我把消息发出去我要关心你有没有收到你收到了之后我才会发下一条消息。异步就是我发消息给你我不管你收到消息没有我都直接发下一条消息。所以SPI和I2C是同步通讯UART是异步通讯。I2CI2C最少只需要两根线和异步串口类似**但是I2C可以支持多个slave设备。**和SPI不同的是I2C可以支持mul-master系统允许有多个master并且每个master都可以与所有的slaves通信「master之间不可通过I2C通信并且每个master只能轮流使用I2C总线」。master是指启动数据传输的设备并在总线上生成时钟信号以驱动该传输而被寻址的设备都作为slaves。I2C的数据传输速率位于串口和SPI之间大部分I2C设备支持100KHz和400KHz模式。使用I2C传输数据会有一些额外消耗每发送8bits数据就需要额外1bit的元数据「ACK或NACK」这个也是I2C通讯的核心应答信号。I2C支持双向数据交换由于仅有一根数据线故通信是半双工的。硬件复杂度也位于串口和SPI之间而软件实现可以相当简单。I2C协议I2C协议把传输的消息分为两种类型的帧一个地址帧 「用于master指明消息发往哪个slave」 一个或多个数据帧 「 在SDA线上传输的数据帧每一帧是8-bit的数据」。I2C时序帧和位数据在SCL处于低电平时放到SDA上在SCL变为高电平后进行采样也就是说在时钟上升沿的时候数据是有效的。I2C数据传输的时序图如下启动信号-Start为了标识传输正式启动master设备会将SCL置为高电平「当总线空闲时SDA和SCL都处于高电平状态」然后将SDA拉低这样所有slave设备就会知道传输即将开始。如果两个master设备在同一时刻都希望获得总线的所有权那么谁先将SDA拉低谁就赢得了总线的控制权。在整个通信期间可以存在多个start来开启每一次新的通信序列「communication sequence」而无需先放弃总线的控制权。起始信号地址帧-address frameI2C不像SPI有一个片选线所以就需要指定I2C的地址而且地址有71 形式也有 91的形式71指的是7位地址加一个读写位位标志bit。91 指的是9位地址加一个读写位标志bit。读写bit写1表示读操作写0表示写操作。应答信号-ACK当主设备发送完地址帧之后会放弃SDA总线控制权让从设备获得SDA控制权此时从设备应该在第9个时钟脉冲之前回复一个ACK「将SDA拉低」以表示接收正常如果接收设备没有将SDA拉低则说明接收设备可能没有收到数据「如寻址的设备不存在或设备忙」或无法解析收到的消息如果是这样则由master来决定如何处理「stop或repeated start condition」。应答信号数据帧-data frames在地址帧发送之后就可以开始传输数据了。主设备负责产生时钟并且在时钟上升沿之前准备好数据。每个数据帧8bits数据帧的数量可以是任意的直到产生停止条件。每一帧数据传输「8-bit」之后接收方就需要回复一个ACK或NACK。停止信号-Stop当所有数据都发送完成时主设备需要产生一个停止信号告诉从设备自己已经操作完成。停止停止信号在SDA置于低电平时将SCL拉高并保持高电平然后将SDA拉高。PS在正常传输数据过程中当SCL处于高电平时SDA上的值不应该变化防止意外产生一个停止信号。停止信号重复开始信号-repeated start condition主设备可以发起多个开始信号来完成数据的传输只要不发停止信号总线上的其他主设备就不能占据这条总线有时候发送完一组数据后希望重新发数据所以就有了重复开始信号。重复的开始信号为SDA在SCL低电平时拉高然后SCL拉高。重复开始条件的传输时序如下图所示时钟拉伸-clock stretching如果主设备发送的速度比从设备接收的速度快因为是同步传输可能就会出现问题这时候从设备可以通过控制时钟线要求主设备线暂停传输这就叫时钟拉伸。通常时钟都是由master提供的slave只是在SDA上放数据或读数据。而时钟拉伸则是slave在master释放SCL后将SCL主动拉低并保持此时要求master停止在SCL上产生脉冲以及在SDA上发送数据直到slave释放SCL让SCL变成高电平。之后master便可以继续正常的数据传输了。可见时钟拉伸实际上是利用了时钟同步的机制只是时钟由slave产生。如果系统中存在这种低速slave并且slave实现了clock stretching则master必须实现为能够处理这种情况实际上大部分slave设备中不包含SCL驱动器的因此无法拉伸时钟。包含时钟拉伸的I2C数据传输时序图为10-bit地址空间上面讲到I2C支持10-bit的设备地址此时的时序如下图所示在10-bit地址的I2C系统中需要两帧来传输slave的地址。第一个帧的前5个bit固定为b11110后接slave地址的高2位第8位仍然是R/W位接着是一个ACK位然后再发送另外8bit的地址发送完后从设备会给出应答。I2C的上拉电阻I2C总线要求总线不工作的时候保持在高电平状态所以I2C总线默认需要上拉电阻而且上拉电阻的大小也会直接影响时序一般是1.5K2.2K和4.7K。我工作到现在目前用的最多的电阻就是4.7K的。上拉分为内部上拉和外部上来如果CPU有内部上拉了就没有必要使用外部上拉了。既然I2C就是通过高低电平来识别的为什么还需要上拉电阻呢直接搞一个VCC接上去不是更好吗欢迎评论回答。与串行端口、SPI对比串行端口串行端口是异步的「不传输时钟相关数据」两个设备在使用串口通信时必须先约定一个数据传输速率并且这两个设备各自的时钟频率必须与这个速率保持相近某一方的时钟频率相差很大都会导致数据传输混乱。异步串行端口在每个数据帧中都要插入至少一个起始位和一个终止位意味着每传输8bits的数据实际要花费10bits的传输时间从而降低了数据传输速率。另一个问题是异步串行端口的设计就是针对两个设备之间通信的那么如果有多个设备连接到一个串口上就必须解决信号碰撞的问题(bus contention)通常要通过额外硬件来完成。最后就是数据传输速率异步串行通信并没有一个理论上的速率限制大部分UART设备只支持一些特定的波特率最高通常在230400bps左右。SPISPI最明显的缺点就是引脚数量使用SPI总线相连的一个master和一个slave需要四根线(MISO/MOSI/SCK/CS)每增加一个slave就需要在master上增加一个CS引脚。当一个master接多个slaves的时候疯狂增长的引脚连接是难以忍受的并且对紧凑的PCB layout是一个挑战。SPI总线上只允许有一个master但可以有任意多个slaves(只受限于总线上设备的驱动程序的能力以及设备上最多能有多少个CS引脚)。SPI可以很好的用于高速率全双工的连接「这个是SPI的优点」对一些设备可支持高达10MHz(10Mbps)的传输速率因此SPI吞吐量大得多。SPI两端的设备通常是一个简单的移位寄存器让软件的实现很简单。SPI的具体文章可以查看下面链接SPI协议详解时钟同步和仲裁如果两个master都想在同一条空闲总线上传输此时必须能够使用某种机制来选择将总线控制权交给哪个master这是通过时钟同步和仲裁来完成的而被迫让出控制权的master则需要等待总线空闲后再继续传输。在单一master的系统上无需实现时钟同步和仲裁。时钟同步时钟同步是通过I2C接口和SCL之间的线“与”(wired-AND)来完成的如果有多个master同时产生时钟那么只有所有master都发送高电平时SCL上才表现为高电平否则SCL都表现为低电平。总线仲裁总线仲裁和时钟同步类似当所有master在SDA上都写1时SDA的数据才是1只要有一个master写0那此时SDA上的数据就是0。一个master每发送一个bit数据在SCL处于高电平时就检查看SDA的电平是否和发送的数据一致如果不一致这个master便知道自己输掉仲裁然后停止向SDA写数据。也就是说如果master一直检查到总线上数据和自己发送的数据一致则继续传输这样在仲裁过程中就保证了赢得仲裁的master不会丢失数据。输掉仲裁的master在检测到自己输了之后也不再产生时钟脉冲并且要在总线空闲时才能重新传输。仲裁的过程可能要经过多个bit的发送和检查。所以会存在一个情况如果两个master如果发送的时序和数据完全一样则两个master都能正常完成整个的数据传输。I2C波形设定I2C读的地址01101101(0x6d) 10001000(0x88)注意观察第9个时钟为低电平表示从设备应答Slave Read Address0x6dID register value0x88imgI2C源码收集了两个I2C源码一个是GPIO口模拟I2C一个是androitd i2c tools下载链接如下链接https://pan.baidu.com/s/1KQQuATd5Lul_IzKavzoncA 密码8cd2猜你喜欢串口通讯就该这么学串口打印知多少STM32F429的USB是个坑