IIC是一种同步串行半双工通信,有数据线和时钟线
主要的通信速率有:100k bit/s、400k bit/s、3.4M bit/s(通信速率看从机)
主机:谁控制时钟线就是主机(一般为微控制器)
时钟线:必须由主机控制,主机产生控制总线的传输方向,并产生起始条件和停止条件
数据线: 用来传输数据的线
从机从来不会主动发送数据(需要拉低时钟线控制(配置上拉电阻))
主机通过从机唯一的器件地址来选择要通信的从机。
一般总线(SCL、SDA)会接上拉电阻,默认高电平
2.硬件IIC和模拟IIC
硬件IIC:通过芯片内置的I²C硬件控制器实现
模拟IIC(软件IIC):通过任意GPIO引脚模拟I²C协议
3.数据处理
一般先处理高位,每处理完八位数据必须处理一位应答
主机给从机发送数据需要把时钟线拉低,从机给主机发送数据需要把时钟线拉高(即主机接收数据需要拉高时钟线)
一个完整的周期,先拉低时钟线,再拉高,最后拉低(防止从机产生数据)(接收的时候要先拉高数据线,防止数据线上有数据)
4.伪代码
发送数据,8位,高位在前
u8 IIC_Send_Data(u8 data)
{
u8 i,ack=0;
for (i = 0; i < 8; i++)
{
SCL=0;
if(data & (0x80>>i))
{
SDA=1;
}
else
{
SDA=0;
}
Delay_us();
SCL=1;
Delay_us();
}
ack = IIC_Rev_ACK();//接受应答
return ack;
}
接收数据,8位,高位在前
u8 IIC_Rev_Data(u8 ack)
{
u8 i,data=0;
SDA=1;//确保数据线位默认(空闲)状态
for(i=0;i<8;i++)
{
SCL=0;
Delay_us();
SCL=1;
if(SDA==1)
{
data |=(0x80>>i);
}
Delay_us();
}
IIC_Send_Ack(ack);//发送应答
return data;
}
5.使用IIC通信过程中处理总线拥塞或数据丢失问题
(1)总线拥塞问题
1)重启机制;如果检测到总线忙,主设备可以等待一段时间
2)总线仲裁;确保主设备在发送数据前检测总线是否空闲
3)根据总线长度和设备数量,选择合适的上拉电阻值(阻值大,电平上升时间长)
4)降低通信速率
(2)数据丢失问题(信号干扰、设备响应超时、通信协议错误)
1)添加超时检测
2)信号滤波
新手小白,文章有错的地方,希望各位大佬能指正,材料知识不足也请补充,感谢!!!