实际工程项目中,有很多地方都会用到I2C总线通信,比如说24C02存储、传感器接口等,能使用I2C这项技能,就成为了我们工程师日常必备的武器,那么我们就来详细的说说I2C。
I2C是一种简单的双向二线制同步串行总线。只需要两根线即可在连接于总线上的器件之间传送信息,一根SCL时钟线,一根就是SDA数据。需要注意的是SDA它是一个双向传输的线,主机向从机发送信号通过SDA把数据送出去,从机向主机发送信号也是从SDA线把数据送出来。
I2C也可以一个一,也可以一对多,每个连接到总线的外围设备都有一个独立的地址,主机可以通过该地址来访问不同设备。主机可通过SDA线发送设备地址查找从机。
因为I2C 通信IO口输出结构都是配置为漏极开路或集电极开路输出。所以时钟线和数据线必须外部都接上拉电阻,当一对多输出的时候,很多GPIO口会连接在同一根线上,可能会存在某个GPIO输出高电平,另一个GPIO输出低电平的情况。如果使用推挽输出,你会发现这个GPIO的VCC和另一个GPIO的GND接在了一起,也就是短路了。如果换成开漏输出VCC和GND之间多了个电阻,这样电路就是安全的。
上拉电阻一般取值在1K-10K之间,上拉电阻的取值和通信速率会有一定的关系,如果上拉电阻的取值太大,那么信号的上升沿、下降沿就会很缓,会影响通信速率,这个具体的看应用的通信速率去测试波形,如果取的太小了,功耗很大,取的太大了,信号的上升沿就会慢,影响通信速率。
一般情况下I2C标准模式最高传输速率100Kbit/s,高速模式最高传输速率400Kbit,当然也有用软件模拟I2C的时序来进行通信的,这个速率就需要自己去掌控测试了,说白了就是我们对着时序图,抄一个同样的波形出来。只要遵守同样的约定,按照时序图对应管脚拉高拉低就可以读写数据了。
在标准协议中区分启动、停止、应答、等动作,下面我们来一起学习一下I2C的标准协议。
当检测到SDA线上为下降沿,SLC线上为高电平,就表示收到了启动信号,当检测到SDA线上为上升沿,SLC线上为高电平,就表示收到了停止信号。
收到启动信号之后就可以开始数据传输,收到停止信号表示帧数据传输完毕。在传输过程中,时钟线SCL为高电平的时候,数据线SDA必须保持稳定,不能改变电平状态,这样才能有效传输,在时钟线SCL为低电平的时候,数据线SDA可以改变状态,即:在SCL为高电平的时候,数据线SDA如果为高,那么传送的就是1,如果SDA为低,那么传送的就是0,在SCL为低电平的时候,你可以改变数据可以把数据变为0/1(图中红框交叉就表示数据的改变,从1变为0 从0变为1所以有了一个上升沿或者一个下降沿)。
在SCL的第9个时钟位,对应的SDA数据为应答数据,应答数据是有方向的,可以是主设备应答,可以是从设备应答,应答不是固定的,可以是低电平为应答,也可以是高电平应答,高应答或者低应答是由通信协议决定的,只要约定一个信号作为应答就可以了,主机给从机发送数据,从机接到了应答主机,从机给主机发送数据,主机接到了,主机就要应答,这样就形成了一个闭环。
以上就是一个标准的IIC通信标准规范,你清楚了吗?
精彩评论