通信协议--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都处于高电平
void Init()
{
    SCL = 1;
    delay();
    SDA = 1;
    delay();
}
  • 起始信号 SDA在SCL为高电平时产生下降沿:
void StartUp
{
    SCL = 1;
    SDA = 1;
    delay();
    SDA = 0;
    delay();
}
  • 结束信号 SDA在SCL为高电平时产生上升沿:
void End()
{
    SCL = 1;
    SDA = 0;
    delay();
    SDA = 1;
    delay();
}
  • 字节发送函数 SCL为低时SDA变为有效数据,SCL为高时,采集数据
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
int8_t CheckAck()
{
    delay();
    if(SDA == 0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 串行通信的几个名词: 全双工:数据线有2条,分别用来发送和接收。半双工:数据线只有1条,用来发送和接收,分时复用。...
    X_xxieRiemann阅读 5,650评论 0 0
  • ​​​本文主要介绍嵌入式系统的一些基础知识,希望对各位有帮助。 嵌入式系统基础 1、嵌入式系统的定义 (1)定义:...
    OpenJetson阅读 8,605评论 0 13
  • 什么是嵌入式 IEEE(Institute of Electrical and Electronics Engin...
    Leon_Geo阅读 9,179评论 1 20
  • 1、嵌入式系统的定义 (1)定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本...
    荣卓然阅读 5,901评论 0 5
  • 三毛的名字耳熟能详,却从未翻看过她的书,直到前一阵朋友赠我一本《撒哈拉的故事》,看完才惊觉相遇恨晚,却也庆...
    浮萍不浮阅读 3,122评论 0 4