IIC简介

IIC是由Philips公司发明的一种串行数据通信协议,仅使用两根信号线:SerialClock(简称SCL)和SerialData(简称SDA)。

IIC是总线结构,1个Master,1个或多个Slave,各Slave设备以7位地址区分,地址后面再跟1位读写位,表示读(=1)或者写(=0),所以我们有时也可看到8位形式的设备地址,此时每个设备有读、写两个地址,高7位地址其实是相同的。

IIC数据格式如下:

  • 无数据:SCL=1,SDA=1;
  • 开始位(Start):当SCL=1时,SDA由1向0跳变;
  • 停止位(Stop):当SCL=1时,SDA由0向1跳变;
  • 数据位:当SCL由0向1跳变时,由发送方控制SDA,此时SDA为有效数据,不可随意改变SDA;当SCL保持为0时,SDA上的数据可随意改变;
  • 地址位:定义同数据位,但只由Master发给Slave;
  • 应答位(ACK):当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=0;
  • 否应答位(NACK):当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=1。

当数据为单字节传送时,格式为:

  • 开始位,8位地址位(含1位读写位),应答,8位数据,应答,停止位。

当数据为一串字节传送时,格式为:

  • 开始位,8位地址位(含1位读写位),应答,8位数据,应答,8位数据,应答,……,8位数据,应答,停止位。

模拟IIC从机代码(查询方式)

本次调试IIC设置为1对1单点透传模式,所以省略了对地址的处理,直接发送数据包。
先贴代码:

/*
 * IIC接收处理函数(扫描)
 */
uint8_t IICSdaOld, IICSclOld;
void i2cSlaveHandler(void)
{
    uint8_t temp_scl = IIC_SCL;
    uint8_t temp_sda = IIC_SDA;
    if (temp_scl == 1)
    {
        if (IICSclOld == 0)
        { //SCL上升沿
            if (IICStat < 0x08)
            {
                IICTemp <<= 1;
                IICTemp |= temp_sda;
                //SCL由0变位为1
                IICStat++;
            }
            else if (IICStat == 0x08)
            {
                spSendDataChar(IICTemp);    //通过串口打印字符串
                IICStat = 0x00;
            }
        }
        if (temp_sda != IICSdaOld) //SDA变位检测
        {
            if (temp_sda == 0) //如果SDA跳变为下降沿为起始位
            {
                IICStat = 0x00;
            }
            else //如果SDA跳变为上升沿则为停止位
            {
                IICStat = 0xFF;
            }
        }
    }
    IICSdaOld = temp_sda;
    IICSclOld = temp_scl;
}

发表评论