1.iic协议是串行半双工总线,主要应用于近距离,低速芯片之间通信。
两根线 SCL SDA
2.IIC总线通讯过程
1.主机发送起始信号占用总线
2.主机发送一个字节数据指明从机地址和后续字节的传输方向。
七位地址位+一位来调节后续字节传输方向
最后一位:0 主机发送
最后一位:1 主机接收
3.被寻址的从机发送应答信号回应主机
4.发送器发送一字节数据
5.接收器发送应答信号回应发送器
注意这两部是发送器和接收器 不再是主机从机。至于发送器和接收器取决于 第二步最后一位是0还是1,如果是主机发送,发送器是主机,应答器是从,如果是主机接收,发送器是从机,应答器是主机。
6.通信完成后发送停止信号
1.起始信号
void IIC_Start()
{IIC_setSDAMode_Out();IIC_SDA_OUT(1); //总线释放状态IIC_SCL_OUT(1);delay_us(5);IIC_SDA_OUT(0); //SDA跳变为低电平delay_us(5);IIC_SCL_OUT(0); delay_us(5);}
2.停止信号
void IIC_Stop()
{IIC_setSDAMode_Out();IIC_SDA_OUT(0); IIC_SCL_OUT(0);delay_us(5);IIC_SCL_OUT(1); //SDA跳变为高电平delay_us(5);IIC_SDA_OUT(1); delay_us(5);}
3.应答信号
标注部分为应答信号,在第九个周期,先将时钟线拉高,然后判断sda线的状态。
代码实现
u8 IIC_waitAck()
{
u8 ack =0;
IIC_setSDAMode_In();
IIC_SCL_OUT(0); //准备时序
delay_us(5);
IIC_SCL_OUT(1);
delay_us(5);
if(IIC_SDA_IN)
{
ack =1;
}
else
{
ack =0;
}
IIC_SCL_OUT(0); //拉低,表示应答完成
delay_us(5);
return ack;
}
iic驱动OLED 屏幕显示结果