微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > IIC总线通信协议

IIC总线通信协议

时间:12-15 来源:互联网 点击:
IIC总线通信只需要两根线,一根数据线SDA,一根时钟线SCL。

IIC总线进行数据传输时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线为低电平期间,数据线上的高电平或低电平才允许变化。

发送启动信号:在SCL为高电平期间,SDA出现下降沿则为启动信号。其中SDA高电平时间应大于4.7us,变为低电平后SCL高电平时间应持续大于4us。

起始信号(模拟)

void start() //起始信号

{

sda=1;

delay();

scl=1;

delay();

sda=0;

delay();

}

应答信号:每传送一个字节数据,都要有接收设备产生应答信号。在SCL为高电平期间,接收设备将SDA拉为低电平表示数据传输正确。

应答信号

void respons() //应答信号

{

uchar i;

scl=1;

delay();

while((sda==1)&&(i<250))i++;

scl=0;

delay();

}

停止信号:在全部数据发送完毕后,主机发送停止信号。即在SCL为高电平期间,SDA上产生一个上升沿信号。

停止信号:

void stop() //终止信号

{

sda=0;

delay();

scl=1;

delay();

sda=1;

delay();

}

IIC总线初始化

void init() //初始化

{

sda=1;

delay();

scl=1;

delay();

}

根据IIC总线写数据函数:

void write_byte(uchar date) //写数据函数

{

uchar i,temp;

temp=date;

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

{

temp=temp<1;//将数据左移一位,最高位移至CY

scl=0;

delay();

sda=CY;

delay();

scl=1;

delay();

}

scl=0;

delay();

sda=1;

delay();

}

根据IIC读数据函数

uchar read_byte() //读数据函数

{

uchar i,k;

scl=0;

delay();

sda=1;

delay();

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

{

scl=1;

delay();

k=(k<1)|sda; //或运算,sda为0或者1,放到了k的最低位了,因k最低位为0

scl=0;

delay();

}

return k; //即为读到的数据

}

在某寄存器上写数据

void write_add(uchar address,uchar date) //在某地址上写数据

{

start(); //起始信号

write_byte(0xa0); //发送器件地址,最低位为0,表示主机发送

respons(); //应答

write_byte(address);//发送某器件存储单元地址

respons(); //应答

write_byte(date); //写数据

respons(); //应答

stop(); //停止

}

其中a0表示主机固定地址。

在模寄存器上读数据

uchar read_add(uchar address) //在某地址上读数据

{

uchar date;

start(); //起始信号

write_byte(0xa0); //发送器件地址,最低位为0,表示主机发送

respons(); //应答

write_byte(address);//发送某器件存储单元地址,表示要读此位置的数据

respons(); //应答

start(); //起始

write_byte(0xa1);//发送器件地址,最低位为1,表示主机接受数据

respons();

date=read_byte();

stop();

return date;

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top