IIC概述
信号概念
I2C通信,存在几种信号
- 起始信号(条件):通知从机做好通信的准备,IIC_SCL为高电平时,IIC_SDA出现下降沿。
- 应答信号:有应答和无应答。有应答是低电平,无应答是高电平。
- 停止信号(条件):告诉从机通信已经结束,IIC_SCL为高电平时,IIC_SDA出现上降沿。
时序图
-
数据的有效性,当IIC_SCL为高电平时,IIC_SDA为高电平即表示该位数据为1
-
起始和停止条件
-
应答信号
主机发送数据给从机
- 发送起始位:当SCL为高电平时,SDA发生一个下降沿,表示启动IIC总线
void IIC_Start(void)
{
IIC_SDA=1;
IIC_SCL=1;
IIC_Delay();
IIC_SDA=0; //将SDA置0,出现一个下降沿
IIC_Delay();
IIC_SCL=0;
IIC_Delay();
}
- 发送从机地址
void Write_IIC_Byte(uint8_t _ucByte)
{
uint8_t i;
//从_ucByte的高位bit开始发送
for (i = 0; i < 8; i++)
{
if (_ucByte & 0x80) //按位与操作判断uc_Byte的bit7是否为1
{
IIC_SDA=1;
}
else
{
IIC_SDA=0;
}
IIC_Delay();
IIC_SCL=1;
IIC_Delay();
IIC_SCL=0;
if (i == 7)
{
IIC_SDA=1; // 释放总线
}
_ucByte <<= 1; //uc_Byte左移一个bit,继续判断
IIC_Delay();
}
}
- 等待从机返回ACK码
uint8_t IIC_WaitAck(void)
{
uint8_t re;
IIC_SDA=1; //CPU释放SDA总线
IIC_Delay();
IIC_SCL=1; //CPU驱动SCL = 1, 此时器件会返回ACK应答
IIC_Delay();
if (IIC_SDA_READ()) //CPU读取SDA口线状态
{
re = 1;
}
else
{
re = 0;
}
IIC_SCL=0;
IIC_Delay();
return re;
}
- 主机发送数据,和第二步的函数一样void Write_IIC_Byte(uint8_t _ucByte);
- 发送停止位:当SCL为高电平时,SDA出现上升沿,表示停止通信
void IIC_Stop(void)
{
//当SCL高电平时,SDA出现一个上跳沿表示IIC总线停止信号
IIC_SDA=0;
IIC_SCL=1;
IIC_Delay();
IIC_SDA=1;
}