一、IIC总线简介
IIC总线是由飞利浦公司推出的一种串行、同步、半双工通信协议。它由两条线组成,时钟线(SCL)和数据线(SDA)。主机产生通信用的时钟,可以产生起始信号和结束信号来开始或者结束一次通信。
二、IIC时序
2.1、空闲状态
IIC总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。
2.2、数据的有效性
SDA 线上的数据必须在时钟的高电平周期保持稳定 数据线的高或低电平状态只有在 SCL 线的时钟
信号是低电平时才能改变。
2.3、起始信号和停止信号
- 起始信号:SCL高电平期间,SDA由高到低的跳变;
- 停止信号:SCL高电平期间,SDA由低到高的跳变;
参考代码:
void IIC_Start()
{
SdaOut();
sda(1);
scl(1);
I2cDelayUs(2);
sda(0);
I2cDelayUs(2);
scl(0);
}
2.3、数据传输和响应
- 发送到 SDA 线上的每个字节必须为 8 位 每次传输可以发送的字节数量不受限制 每个字节后必须跟一个响应位, 首先传输的是数据的最高位 MSB。;
- 在响应的时钟脉冲期间 接收器必须将 SDA 线拉低 使它在这个时钟脉冲的高电平期间保持稳定的低
电平;
参考代码:
void IIC_SendByte(char ch)
{
int i;
SdaOut();
scl(0);
for(i=0;i<8;i++)
{
sda(ch & 0x80);
I2cDelayUs(1);
scl(1);
I2cDelayUs(2);
scl(0);
I2cDelayUs(1);
ch = ch << 1;
}
}
char IIC_ACK(){
SdaOut();
I2cDelayUs(2); //5us
scl(0);
sda(0);
I2cDelayUs(2);
scl(1);
I2cDelayUs(2);
sda(0);
I2cDelayUs(2);
scl(0);
I2cDelayUs(2);
}
unsigned char IIc_Wait_Ack(void)
{
unsigned char ackflag = 1;
unsigned char timeout = 0;
unsigned char status = 1;;
SdaIn();
scl(1);
while(status)
{
timeout++;
if(timeout >= 200)
{
ackflag = 0;
break;
}
status = ReadBit();
}
I2cDelayUs(2);
scl(0);
I2cDelayUs(2);
return ackflag;
}
三、7位寻址模式
- 一台主机可以连接多台从机,不同类型的从机可以通过地址来区分访问。
- 数据的传输遵循图 10 所示的格式 在起始条件 S 后 发送了一个从机地址 这个地址共有 7 位紧接着的第 8 位是数据方向位 (R/ W) '0’表示发送 写 ‘1’ 表示请求数据读数据传输一般由主机产生的停止位 P 终止;
- 当主机发送了一个地址后 系统中的每个器件都在起始条件后将头 7 位与它自己的地址比较 如果一样器件会认为它被主机寻址;