简介

  • IIC,Inter-Integrated Circuit,集成电路总线,需要2根线连接拓扑,是半双工,适用于"字节型"设备。

特点

I2C总线物理拓扑结构

iic协议

通信原理:

 通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。

IIC的协议层

IIC的协议层才是掌握IIC的关键。现在简单概括如下:

a.数据的有效性

在时钟的高电平周期内,SDA线上的数据必须保持稳定,数据线仅可以在时钟SCL为低电平时改变。

b.起始和结束条件

起始条件:当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始条件,结束条件:当SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止条件,要注意起始和终止信号都是由主机发出的,连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。

c.应答

每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答

 

任一地址读取数据格式

void init()              //初始化

{

       SCL=1;

       delay();

       SDA=1;

       delay();

}

void start()         //启动信号

{

       SDA=1;

       delay();

       SCL=1;

       delay();

       SDA=0;

       delay();

}

void stop()            //停止信号

{

       SDA=0;

       delay();

       SCL=1;

       delay();

       SDA=1;

       delay();

}

 

void respons()             //回应信号

{

       uchar i=0;SCL=1;delay();

while((SDA==1)&&(i<255))

i++;

       SCL=0;

delay();

}

void writebyte(uchar date)//       写一个字节

{

       uchar i,temp;

       temp=date;

       for(i=0;i<8;i++)

       {

              temp=temp<<1;

              SCL=0;

              delay();

              SDA=CY;

              delay();

              SCL=1;

              delay();  

       }

       SCL=0;

       delay();

       SDA=1;

       delay();

}

 

任一地址写入数据格式

uchar readbyte()

//读一个字节

{

       uchar i,j,k;

       SCL=0;

       delay();

       SDA=1;

       for(i=0;i<8;i++)

       {

              SCL=1;

              delay();

              if(SDA==1)

                j=1;

              else

                j=0;

              k=(k<<1)|j;

              SCL=0;

              delay();

       }

       delay();

       return k;

}

Void write_add(uchar address,

uchar info)

//指定地址写一个字节数据

{

       start();

       writebyte(0xa0);

       respons();

       writebyte(address);

       respons();

       writebyte(info);

       respons();

       stop();

}

uchar read_add(uchar address)

//指定地址读一个字节数据

{

       uchar dd;

       start();

       writebyte(0xa0);

       respons();

       writebyte(address);

       respons();

       start();

       writebyte(0xa1);

       respons();

       dd=readbyte();

       stop();

       return dd;

}
 

相关文章: