一、iic总线通信
1、简介:
iic 即inter-integrated circuit(集成电路总线),i2c总线是phlips公司推出的一种串行总线, i2c总线只有两根双向信号线。一根是数据线sda,另一根是时钟线scl。
每个接到i2c总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。
2、常用的串行扩展总线有:
(1)、i2c (inter ic bus)总线
(2)、单总线(1-wire bus)
(3)、spi(serial peripheral interface)总线等。
3、iic总线电路接法
i2c总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。
4、iic总线通信协议
(1)起始和终止信号
scl线为高电平期间,sda线由高电平向低电平的变化表示起始信号;
scl线为高电平期间,sda线由低电平向高电平的变化表示终止信号。
(2)应答和非应答
iic 总线协议规定,每传送一个字节数据后,都要有一个应答信号以确定数据传送是否被对方收到。应答信号由接受设备产生,在scl为高电平期间,接受设备将sda拉低为低电平,表示数据传输正确,产生应答。
(3)数据传送
数据位的有效性规定
i2c总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
5、iic通信基本函数
(1)起止信号
i2c_start()
{
sda = 1; //scl为高电平时,sda 出现一个下跳沿表示i2c总线启动
scl = 1;
i2c_delay();
sda = 0;
i2c_delay();
scl = 0; // 启动后将scl点平拉低
i2c_delay();
}
(2)终止信号
void i2c_stop()
{
sda = 0; //当sc高电平时,sda出现一个上升沿表示i2c总线停止
scl = 1;
i2c_delay();
sda = 1;
i2c_delay();
}
(3)发送数据
void i2c_sendbyte(unsigned char byte)
{
unsigned char i = 0;
for (i = 0; i < 8; i )
{
if(byte & 0x80) //iic规定下发送高位数据
{
sda = 1;
}
else
sda = 0;
scl = 1; //在scl为高电平期间写入数据
i2c_delay();
scl = 0;
byte <<= 1;
if (i == 7)
sda = 1; //在发送完数据后将sda拉高
i2c_delay();
}
}
(4)接收数据
unsigned char i2c_readbyte()
{
unsigned char i = 0;
unsigned char value = 0;
for (i = 0; i < 8; i )
{
value <<= 1; //先读取高位
scl = 1; //scl 为高电平时读取数据
i2c_delay();
if(sda)
{
value ;
}
scl = 0;
i2c_delay();
}
return value;
}
(5)发送应答信号
void char i2c_ack()
{
sda = 0; //scl为高电平时间sda拉低表示应答
i2c_delay();
scl = 1;
i2c_delay();
scl = 0;
i2c_delay();
sda = 1;
i2c_delay();
}
(6)发送非应答信号
void i2c_nack()
{
sda = 1; //scl高电平期间sda拉高表示非应答
i2c_delay();
scl = 1;
i2c_delay();
scl = 0;
i2c_delay();
}
(7)等待应答
unsigned char i2c_waitack()
{
unsigned char ret;
sda = 1;
i2c_delay();
scl = 1; //把scl拉高读取sda的点平高低,低电平表示应答
i2c_delay();
if(sda == 1)
{
ret = 1;
}
else
ret = 0;
scl = 0;
i2c_delay();
return ret;
}
(8)检查iic设备总线
unsigned char i2c_checkdevice(unsigned char _address)
{
unsigned char ucack;
if (sda == 1 && scl == 1)
{
i2c_start();
i2c_sendbyte(_address|i2c_wr); //发送地址
ucack = i2c_waitack(); //等待接收应答
i2c_stop(); //停止信号
return ucack;
}
return 1;
}
『本文转载自网络,皇冠最新app版本的版权归原作者所有,如有侵权请联系删除』