IIC协议
两条线:双向串行数据线SDA,串行时钟线SCL;
支持多个设备的总线,每个连接到总线上的设备都有一个独立的地址,通过不同的地址访问不同的设备。主机通过SDA线发送地址查找从机,7位地址支持127个设备挂载(0号是群呼地址),第8位表示读写位(0写,1读);
数据有效性
SDA线数据在SCL高电平周期必须稳定;
起始条件和停止条件
起始条件:SCL高电平时,SDA由高定平向低电平转换;停止条件:SCL高电平时,SDA由低电平向高电平转换。
数据传输格式
传输每字节8位,总字节数不受限制,每字节后必须跟一个响应位ACK;在第九个时钟,发送端释放SDA控制权,将SDA电平拉高,由接收方控制,接收方拉低电平ACK,反之NACK;传输按照MSB大端字节序
51单片机GPIO模拟2实现IIC通信
sbit SCL
=P1
^0;
sbit SDA
=P1
^1;
#define H 1;
#define L 0;
void i2c_start(void)
{
SDA
= H
;
SCL
= H
;
delay();
SDA
= L
;
delay();
SCL
= L
;
}
void i2c_stop(void)
{
SDA
= L
;
SCL
= H
;
delay();
SDA
= H
;
}
void i2c_ack(void)
{
SDA
= L
;
delay();
SCL
= H
;
delay();
SCL
= L
;
delay();
SDA
= H
;
}
void i2c_nack(void)
{
SDA
= H
;
delay();
SCL
= H
;
delay();
SCL
= L
;
delay();
}
uint8_t
i2c_waitAck(void)
{
uint8_t ret
;
SDA
= H
;
delay();
SCL
= H
;
delay();
if( SDA
!= L
)
{
ret
= 0;
}else{
ret
= 1;
}
SCL
= L
;
delay();
return ret
;
}
void i2c_sendByte(uint8_t byte
)
{
uint8_t i
;
for(i
=0; i
<8; i
++)
{
if(byte
& 0x80)
{
SDA
= H
;
}else{
SDA
= L
;
}
delay();
SCL
= H
;
delay();
SCL
= L
;
if( 7==i
)
{
SDA
= H
;
}
byte
<<= 1;
delay();
}
}
uint8_t
i2c_readByte(void)
{
uint8_t i
,value
=0;
for(i
=0; i
<8; i
++)
{
value
<<= 1;
SCL
= H
;
delay();
if( SDA
==H
)
{
value
++;
}
SCL
= L
;
delay();
}
return value
;
}