IIC协议在Dock看来是最简单易懂的协议之一。本文介绍IIC协议的基础要点。
1.IIC基础要点
- 在时钟的高电平周期内,SDA线上的数据必须保持稳定,数据线仅可以在时钟SCL为低电平时改变。
- 起始条件:当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始条件
- 结束条件:当SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止条件
- 每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答。
2 IIC的C实现
- 初始时SDA、SCL都处于高电平
void Init()
{
SCL = 1;
delay();
SDA = 1;
delay();
}
- 起始信号 SDA在SCL为高电平时产生下降沿:
void StartUp
{
SCL = 1;
SDA = 1;
delay();
SDA = 0;
delay();
}
- 结束信号 SDA在SCL为高电平时产生上升沿:
void End()
{
SCL = 1;
SDA = 0;
delay();
SDA = 1;
delay();
}
- 字节发送函数 SCL为低时SDA变为有效数据,SCL为高时,采集数据
void Transfer(int8_t i8Send)
{
int32_t nIndex = 0;
for(nIndex = 7; nIndex >= 0; nIndex++)
{
SCL = 0;
SDA = (i8Send >> nIndex) & 0x01; //MSB方式进行发送
delay();
SCL = 1; //变为高电平,SLAVE短进行数据锁存
delay();
}
}
- 判断回复报文 Slave端主动拉低SDA
int8_t CheckAck()
{
delay();
if(SDA == 0)
{
return 1;
}
else
{
return 0;
}
}