I2C是一种总线式结构,它只须要SCL时钟信号线与SDA数据线,两根线就能将链接与总线上的设备实现数据通讯,因为它的简便的构造设计,因而成为一种较为经常使用的通讯方式。css
因为I2C采用的是主从式通讯方式,因此,通讯的过程彻底由主设备仲裁。在通讯以前,必须由主设备发送一个起始信号,决定数据是否能够开始传送,而且在结束通讯时,必须再由主设备发送一个结束信号,以表示通讯已经结束。微信
由于,通讯以前,主设备须要发送一个起始信号,因此,先讲一下起始信号。经过上面的图就能够知道(上图中的第一个波形图是SDA数据线,第二个波形图是SCL时钟信号线),起始信号是在SCL时钟信号线处于高电平时,SDA数据线由高电平转换为低电平,也就是产生一个降低沿,就意味着起始信号已经发送,数据的通讯能够进行了。代码以下:
ide
void I2C_Start() { I2C_SDA = 1; I2C_Delay10us(); I2C_SCL = 1; I2C_Delay10us();//创建时间是I2C_SDA保持时间>4.7us I2C_SDA = 0; I2C_Delay10us();//保持时间是>4us I2C_SCL = 0; I2C_Delay10us(); }
一样的,由上图可知:结束信号,就是在SCL时钟信号线处于高电平时,SDA数据线由低电平变为高电平 ,也就是,SDA数据线产生一个 上升沿。代码以下:
编码
void I2C_Stop() { I2C_SDA = 0; I2C_Delay10us(); I2C_SCL = 1; I2C_Delay10us();//创建时间大于4.7us I2C_SDA = 1; I2C_Delay10us(); }
接下来就是该讲一下,I2C数据的发送问题了。因为I2C是主从式通讯,也就意味着一根总线上能够挂载多个从设备,那么主设备如何区分这些从设备呢?主设备如何知道是在与哪个从设备在通讯呢?答案是:经过地址。每个从设备都有本身的地址编码,也就是说,主设备在与具体的某一个从设备通讯以前,必须先发送地址,以表示与主设备通讯的是该设备。从上图可知,主设备在发送完起始信号后,马上开始了发送从设备的地址。那么如何发送数据地址呢?首先,在SCL时钟信号线处于低电平时,SDA数据线上的地址信息要开始准备了。I2C通讯一个必须注意的点就是,在传送地址信息时,都是从高位开始传送,
spa
I2C_SDA = dat >> 7; dat = dat << 1;
接着,SCL时钟信号线开始由低电平向高电平转换,这个时候,SDA数据线上的数据开始在传送了,当SCL时钟信号线上的信号再由高电平转换位低电平的时候,一个Bit位的数据已经传送完毕。在地址信息传送完毕以后,还会有一个应答信号,由于,为了确保从设备接收到已经发送的数据,从设备就会向主设备发送一个应答信号,若主设备接收到应答信号则说明数据传送成功,不然数据传送失败。很重要的一点是,总线一直是由主设备控制,那么当从设备想要向主设备发送一个应答信号时,主设备须要是释放总线,将总线权限交给从设备。
设计
因此,从设备在向主设备发送应答信号时,主设备应该释放总线,代码以下:3d
I2C_SDA = 1;
接着,由上图可知,当SCL时钟信号线再次拉高时,就进入了第9个时钟周期,也就是此时开始传送应答信号。当成功应答时,返回1,不然返回0。完整代码以下:
blog
I2C_SDA = 1; I2C_Delay10us(); I2C_SCL = 1; while(I2C_SDA && (ack == 1)) { b++; if(b > 200) { I2C_SCL = 0; I2C_Delay10us(); return 0; } } I2C_SCL = 0; I2C_Delay10us(); return 1; }
最后,就是I2C设备(也就是主设备)数据的接收。此时,从设备发送数据给主设备,也就是,主设备进行数据的接收。那么,主设备一样要释放总线权限。也就是教程
I2C_SDA = 1;
首先,SCL时钟信号线为低电平,这时,SDA数据线要准备好数据了,接着,SCL时钟信号线由低电平变为高电平,此时,数据传送开始了,当SCL时钟信号线再次变为低电平是,一个Bit的数据传送结束。代码以下:
支付宝
uchar I2C_ReadByte() { uchar a = 0,dat = 0; I2C_SDA = 1; I2C_Delay10us(); //I2C_SCL = 0; for(a=0; a<8; a++) { I2C_SCL = 1; I2C_Delay10us(); dat <<= 1; dat |= I2C_SDA; I2C_Delay10us(); I2C_SCL = 0; I2C_Delay10us(); } return dat; }
I2C的低层时序到这里基本上就已经结束了。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
欢迎打赏,哈哈~
1毛两毛也表示万分感谢,哈哈!
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 顺便附上个人微信码,哈哈!
必定是我膨胀了,居然想要打赏!
这些教程说实话都挺好的,感兴趣的大佬能够用个人二维码购买,感谢!