I2C通信以及51单片机程序
I2C总线是PHLIPS公司推出的一种双向串行总线,只有两根双向信号线。一根是数据/地址线SDA,另一根是时钟线SCL,半双工。
这两根信号线上挂载着主机与从机,一般来说,谁控制SCL信号线,谁就是主机。
1、空闲状态: 两根总线接上拉电阻,且都为高电平时,说明两根总线为空闲状态。
2、8位数据传输:
规则: I2C总线进行数据传送时,SCL为高电平期间,SDA上的数据必须保持稳定,只有在SCL上的信号为低电平期间,SDA上的高电平或低电平状态才允许变化。
就看这张图,下面一边介绍原理一边写程序:
(1)起始信号,既然是两根信号线来传输数据,那么就需要协议,也就是I2C协议,此协议包括起始信号,如上图所示,当SCL为高电平时,SDA由高电平变为低电平时,表示可以传输数据了,也就是所谓的起始信号
那么程序怎么写?很简单,基于51单片机的起始信号程序如下:
void startiic()
{
SDA=1;
delay();
delay();
SCL=1;//初始状态数据线与时钟线为高电平
delay();
SDA=0;//在时钟线为高电平的情况下拉低数据线表示起始信号
delay();
SCL=0;//起始信号完成后需要传输数据,所以拉低时钟线允许数据变化
delay();
}
注意:开始信号结束后,SCL信号线为低电平
(2)有了起始信号,接着就可以传输数据了,需要注意的是,数据传输从高位开始到低位传输结束,一共8位数据,开始信号结束后,SCL信号线为低电平,那么传输数据里的读数据程序第一步就要将SCL电平拉高,保持数据信号线上的数据可读,且读8位
51单片机的读8位数据程序如下:
unsigned char readbit8()
{
unsigned char i;
unsigned char dat=0;//定义一个8位数来存储读出的数据
for(i=0;i<8;i++)
{
SCL=1;//时钟线为高电平时因数据保持不变才可读数据
dat<<=1;
dat|=(unsigned char)SDA;//数据从高位开始读出,并保存在dat中
SCL=0;//时钟线为低电平时才允许数据变化传入
delay();
}
return(dat);
}
注意:8位的数据传输完毕后,SCL的电平状态为低电平
我们再来看一下写数据程序应该如何写,首先数据信号线要改变电平状态,SCL的电平要为低电平,所以写数据的程序第一步就是SCL的电平状态要先拉低,当我们的起始信号开始后,SCL的电平信号正好为低,那么只需写一句SDA=(bit)(dat&0x80);就把dat变量的最高位传递给SDA了,接下来将SCL拉高保持数据稳定,再拉低使数据可以改变,从而在稳定状态时实现传输
51单片机的写8位数据的程序如下:
void writebit8(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
SDA=(bit)(dat&0x80);
delay();
SCL=1;
dat<<=1;
delay();
SCL=0