I2C(Inter-Integrated Circuit)协议是一种用于同步、半双工、串行总线(由SCL时钟线、SDA数据线组成)上的协议。规定了总线空闲状态、起始条件、停止条件、数据有效性、字节格式、响应ACK信 、从设备地址选择、数据方向。有主从机之分,主机master就是掌控SCL时钟信 的一方,并且起始信 和停止信 也由主机发送。
一、协议说明
(1)总线空闲状态:SCL、SDA均为高电平,此时主从设备都不控制总线(主从设备的SDA和SCL引脚为输入或者开漏输出),由外部上拉电阻将总线拉高。
(2)起始条件:SCL在高电平的时候,SDA出现下降沿,如下图:
(4)数据有效性:什么时候读数据(读SDA电平)有效SCL为高电平时,读数据有效。什么时候写数据(改变SDA电平)有效SCL为低电平时,写数据有效。读写时序如下图:
(3)停止信
(4)发送数据
(5)等待ACK信
(6)接收数据
(7)发送ACK信
(8)发送NACK信
在调试过程中有一个需要注意的地方:
①起始信 和停止信 的模拟,不要随便加入SCL的下降沿,因为很有可能在接收数据之后发送一个停止信 ,如果此时停止信 中一开始出现SCL下降沿,会是从设备误认为还要发送数据,很有可能将SDA拉低,一旦从设备拉低了SDA,停止信 在拉高SDA时会失败,导致停止信 失效;
②在SCL高电平时,不要切换SDA的输入输出模式,因为很有可能切换SDA输入输出时,SDA引脚上会输出抖动的电平信 ,而这时SCL是高电平,所以有可能会误触发起始或停止信 ;
③输出要配置成开漏输出。
以上就是I2C协议软件模拟的C代码实现,下一篇将介绍软件模拟I2C的具体应用,以SHT20温湿度传感器为例。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!