【协议】IIC通信

1、传输时,SCL为高电平时SDA须保持稳定,SCL为低电平是SDA才能变化

2、SCL为高时SDA由高变低为起始dive in

      SCL为高时SDA由低变高为终止pull out

3、应答与非应答

应答:从机应答位一帧数据的第九位为0;

非应答:从机应答位一帧数据的第九位为1;

主机在发送数据时,每发送一字节数据后都会向从机读取应答位

              当从机为应答时,表示从机空闲

              当从机为非应答时,表示从机繁忙,主机读到非应答时应发出终止信号

          因此主机可以通过应答位来判断从机是否成功接收数据;

          主机在接收数据时,当收到最后一个数据后,对从机发送非应答,从机释放SDA,允许主机终止。

4、数据帧

起始信号后跟一帧地址,其中七位为ADDR,位为方向

 

 

如:

    发送:主机发送起始信号 >> 主机发送七位地址及一位方向0  >>

    主机读取从机应答信号 >> 主机发送首地址 >> 主机读取从机应答信号  >> 

    主机发送数据 >> 。。。>> 读到非应答 >> 从机繁忙 >> 主机发送终止信号;

     

void Send_EPR_Byte(uchar ADDR, uchar dat)
{
    IIC_Start();
    IIC_SendByte(0xa0);
    if(IIC_WaitAck())
        ackflag = 1;
    else
        ackflag = 0;
    IIC_SendByte(ADDR);
    if(IIC_WaitAck())
        ackflag = 1;
    else
        ackflag = 0;
    IIC_SendByte(dat);
    if(IIC_WaitAck())
        ackflag = 1;
    else
        ackflag = 0;
    IIC_Stop();
}

    读取:主机发送起始信号 >> 主机发送地址及方向0>>

    主机读取从机应答信号 >> 主机发送首地址 >> 主机读取从机应答信号 >> 换向 >>

    主机发送起始信号 >> 主机发送从机地址及方向1 >> 主机读取从机应答信号 >>

    主机读取数据 >> 主机发出非应答 >> 从机释放SDA >> 主机发送终止信号

    

uchar Read_EPR_Byte(uchar ADDR)
{
    uchar dat;
    IIC_Start();
    IIC_SendByte(0xa0);
    if(IIC_WaitAck())
        ackflag = 1;
    else
        ackflag = 0;
    IIC_SendByte(ADDR);
    if(IIC_WaitAck())
        ackflag = 1;
    else
        ackflag = 0;
    IIC_Start();
    IIC_SendByte(0xa1);
    if(IIC_WaitAck())
        ackflag = 1;
    else
        ackflag = 0;
    dat = IIC_RecByte();
    IIC_WaitAck();
    IIC_Stop();
    return dat; 
}

个人对IIC的概念还存在模糊,如上定义不时修改,欢迎指正

原文地址:https://www.cnblogs.com/ZYQS/p/14235449.html