美文网首页
通信协议--IIC

通信协议--IIC

作者: CoderDock | 来源:发表于2017-12-24 17:24 被阅读0次

  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;
    }
}

相关文章

  • 通信协议--IIC

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

  • 2018.1.10

    今天是嵌入式第三周周三。 今天郭老师主要讲了IIC通信协议的大部分。IIC硬件结构是一个两线串行总线,有数据线SD...

  • arduino IIC

    arduino IIC库 IIC扫描程序

  • 9.26学习总结

    今天上午讲老师了IIC的通信协议,它跟之前学习的串口用到的协议不一样,有本质的区别,它是自己拟定时钟进行通信...

  • 单片机小白学习之路(二十六)---EEPROM-IIC总线理解(

    目标:EEPROM-IIC总线理解(一) 1.IIC总线简介 IIC(Inter-Integrated Circu...

  • 9.26总结

    今天学习了I2C通信协议 I2C是串行同步半双工通信 IIC通信处于空闲状态时,两条信号线各自上拉处于高电平 数据...

  • IIC为什么需要用开漏输出和上拉电阻

    最近在调ICM20602模块(一个六轴陀螺仪和加速度计), 使用IIC通信协议, 这个过程中遇到一个困扰我很长时间...

  • ADX345获取加速度在LCD显示

    ADX345使用IIC读取数据 IIC配置 方法一:使用IO模拟IIC操作 彩屏显示使用之前修改好的ili9325...

  • iic

  • IIC

    delay.h delay.c iic.h iic.c main.h main.c

网友评论

      本文标题:通信协议--IIC

      本文链接:https://www.haomeiwen.com/subject/osjhgxtx.html