通信协议-IIC

  IIC协议在Dock看来是最简单易懂的协议之一。本文介绍IIC协议的基础要点。

image.png

1.IIC基础要点

  • 在时钟的高电平周期内,SDA线上的数据必须保持稳定,数据线仅可以在时钟SCL为低电平时改变。

image.png

  • 起始条件:当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始条件
  • 结束条件:当SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止条件

image.png

  • 每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答。

image.png

2 IIC的C实现

  • 初始时SDA、SCL都处于高电平

    1
    2
    3
    4
    5
    6
    7
    void Init()
    {
    SCL = 1;
    delay();
    SDA = 1;
    delay();
    }
  • 起始信号 SDA在SCL为高电平时产生下降沿:

    1
    2
    3
    4
    5
    6
    7
    8
    void StartUp
    {
    SCL = 1;
    SDA = 1;
    delay();
    SDA = 0;
    delay();
    }
  • 结束信号 SDA在SCL为高电平时产生上升沿:

    1
    2
    3
    4
    5
    6
    7
    8
    void End()
    {
    SCL = 1;
    SDA = 0;
    delay();
    SDA = 1;
    delay();
    }
  • 字节发送函数 SCL为低时SDA变为有效数据,SCL为高时,采集数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int8_t CheckAck()
    {
    delay();
    if(SDA == 0)
    {
    return 1;
    }
    else
    {
    return 0;
    }
    }

版权声明:本文为博主原创文章,转载需声明为转载内容并添加原文地址。

原文地址:http://coderdock.com

Dock wechat
欢迎您扫一扫上面的微信公众号,订阅我的公众号