0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是IIC通信协议

汽车电子技术 来源:混说Linux 作者:Linux_Daily 2023-02-21 17:24 次阅读

I2C( IIC )属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,属于 一主多从(一个主设备(Master),多个从设备(Slave))的总线结构总线上的每个设备都有一个特定的设备地址,以区分同一I2C总线上的其他设备

物理I2C接口有两根双向线, 串行时钟线(SCL)串行数据线(SDA) 组成,可用于发送和接收数据,但是通信都是由主设备发起,从设备被动响应,实现数据的传输。

图片

I2C主设备与从设备的一般通信过程

一. 主设备给从设备发送/写入数据:

  1. 主设备发送起始(START)信号
  2. 主设备发送设备地址到从设备
  3. 等待从设备响应(ACK)
  4. 主设备发送数据到从设备,一般发送的每个字节数据后会跟着等待接收来自从设备的响应(ACK)
  5. 数据发送完毕,主设备发送停止(STOP)信号终止传输

图片

二. 主设备从从设备接收/读取数据

  1. 设备发送起始(START)信号
  2. 主设备发送设备地址到从设备
  3. 等待从设备响应(ACK)
  4. 主设备接收来自从设备的数据,一般接收的每个字节数据后会跟着向从设备发送一个响应(ACK)
  5. 一般接收到最后一个数据后会发送一个无效响应(NACK),然后主设备发送停止(STOP)信号终止传输

图片

注:具体通信过程需视具体时序图而定

I2C通信的实现

一. 使用I2C控制器实现

就是使用芯片上的I2C外设,也就是硬件I2C,它有相应的I2C驱动电路,有专用的IIC引脚,效率更高,写代码会相对简单, 只要调用I2C的控制函数即可不需要用代码去控制SCL、SDA的各种高低电平变化来实现I2C协议 ,只需要将I2C协议中的可变部分(如:从设备地址、传输数据等等)通过函数传参给控制器,控制器自动按照I2C协议实现传输,但是如果出现问题,就只能通过示波器看波形找问题。

二. 使用GPIO通过软件模拟实现

软件模拟I2C比较重要因为软件模拟的整个流程比较清晰哪里出来bug很快能找到问题模拟一遍会对I2C通信协议更加熟悉

如果芯片上没有IIC控制器,或者控制接口不够用了,通过使用任意IO口去模拟实现 IIC通信协议 ,手动写代码去控制IO口的电平变化,模拟IIC协议的时序,实现IIC的信号和数据传输, 下面会讲到根据通信协议如何用软件去模拟

I2C通信协议

IIC总线协议无非就是几样东西: 起始信号停止信号应答信号 、以及 数据有效性

一. 空闲状态

时钟线(SCL)和数据线(SDA)接上拉电阻默认高电平表示总线是空闲状态

二. 从设备地址

从设备地址用来区分总线上不同的从设备,一般发送从设备地址的时候会在最低位加上读/写信号,比如设备地址为0x50,0表示读,1表示写,则读数据就会发送0x50,写数据就会发送0x51。

三. 起始(START)信号

I2C通信的起始信号由主设备发起,SCL保持高电平,SDA由高电平跳变到低电平。

图片

// 起始信号
void IIC_start(void)
{
    // 1.首先把数据线设置为输出模式
    // 总线空闲, SCL和SDA输出高
    SCL = 1;  
    SDA = 1;
    delay_us(5);
    
    // SDA由高变低
    SDA = 0;
    delay_us(5);
    
    // 拉低SCL开始传输数据
    SCL = 0;
}

四. 停止(STOP)信号

I2C通信的停止信号由主设备终止,SCL保持高电平,SDA由低电平跳变到高电平。

图片

// 停止信号
void IIC_stop(void)
{
    // 1.首先把数据线设置为输出模式
    
    // 拉高时钟线
    SDA = 0;
    delay_us(5);
    SCL = 1;
    delay_us(5);
    
    // SDA由低变高
    SDA = 1;
}

五. 数据有效性

I2C总线进行数据传送时,在SCL的每个时钟脉冲期间传输一个数据位, 时钟信号SCL为高电平期间,数据线SDA上的数据必须保持稳定 ,只有在时钟线SCL上的信号为低电平期间,数据线SDA上的高电平或低电平状态才允许变化,因为当SCL是高电平时,数据线SDA的变化被规定为 控制命令STARTSTOP ,也就是前面的起始信号停止信号 )。

图片

六. 应答信号(ACK:有效应答,NACK:无效应答)

接收端收到有效数据后向对方响应的信号,发送端每发送一个字节(8位)数据,在第9个时钟周期释放数据线去接收对方的应答。

当SDA是低电平为有效应答(ACK),表示对方 接收成功

当SDA是高电平为无效应答(NACK),表示对方 没有接收成功

发送数据需要等待接收方的应答:

// 等待ACK   1-无效    0-有效
u8 IIC_wait_ack(void)
{
    u8 ack = 0;
    
    // 数据线设置为输入
    
    // 拉高时钟线
    SCL = 1;
    delay_us(5);
    // 获取数据线的电平
    if(SDA)
    {   // 无效应答
        ack = 1;
        IIC_stop();
    }
    else
    {   // 有效应答
        ack = 0;
        // 拉低SCL开始传输数据
        SCL = 0;
        delay_us(5);
    }
    
    return ack;
}

接收数据需要向发送方发送应答:

void IIC_ack(u8 ack)
{
    // 数据线设置为输出
    
    SCL = 0;
    delay_us(5);
    
    if(ack)
        SDA = 1; // 无效应答
    else
        SDA = 0; // 有效应答      
    delay_us(5);
    SCL = 1;
    // 保持数据稳定
    delay_us(5);
    // 拉低SCL开始传输数据
    SCL = 0;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6809

    浏览量

    147637
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1346

    浏览量

    120823
  • 串行总线
    +关注

    关注

    1

    文章

    164

    浏览量

    30436
收藏 人收藏

    评论

    相关推荐

    IIC通信协议

    信盈达2017届嵌入式就业班学员课堂笔记-IIC通信协议1.IIC总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。它在传输数据过程中有三种特殊类型信号,分别是:开始信号、结束信号
    发表于 05-17 15:58

    【梦翼师兄今日分享】 IIC通信协议程序设计讲解

    本帖最后由 mengyi1989 于 2019-12-7 13:15 编辑 写在前面的话IIC通信协议通信接口在很多工程中有广泛的应用,如数据采集领域的串行AD,图像处理领域的摄像头配置
    发表于 12-04 10:36

    IIC为什么用开漏输出和上拉电阻?

    IIC通信协议推挽输出和开漏输出开漏输出的作用IIC为什么用开漏输出和上拉电阻
    发表于 02-26 06:48

    stm32之IIC通信协议定义

    1.IIC通信协议定义 IIC通讯协议(Inter----Integrted Circuit)是由Phiips飞利浦公司开发的,由于他引脚少,硬件实现简单,可拓展性强,不需要UASRT
    发表于 08-20 08:28

    IIC通信协议概述

    **一、IIC通信协议**(1)概述I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由 NXP(原 PHILIPS)公司设计,多用于主控制器和从器件间的主从
    发表于 11-22 07:51

    IIC通信协议的相关资料分享

    校电子设计大赛做的低年级赛题是简易电压计的制作,里面的eeprom可擦可编程只读存储电路,AD转换电路以及ADS1115测量电压电路都用到了这一协议,故进行了学习。IIC 通信协议
    发表于 01-11 07:38

    IIC通信协议的相关资料推荐

    IIC通信协议详解IIC的概述IIC分为软件IIC和硬件IICIIC通信协议空闲状态开始信号与停
    发表于 01-20 07:06

    介绍IIC通信协议以及代码开发的注意事项

    FPGA IIC接口通信本文介绍IIC通信协议以及代码开发的注意事项,跑通了IIC协议,那么后续
    发表于 02-16 07:24

    IIC通信协议的主要特征有哪些

    一.主要特征1.只要求两条总线线路 一条串行数据线 (SDA) 一条串行时钟线 (SCL)2.每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机 /从机关系软件设定地址 主机可以作为主机发送器或主机接收器3.它是一个真正的多主机总线 如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏4.串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/...
    发表于 03-02 06:06

    IIC通信协议

    网上收集下载的学习资料,对大家学习也许有帮助,可以下载学习交流。
    发表于 11-04 16:27 25次下载

    iic通信协议是什么

    IIC协议是二线制,信号线包含SDA和SCL,且信号线是双向的,开路结构,需要通过上拉电阻到VCC,具体的电阻值影响的是信号反应速度和驱动能力。
    发表于 09-13 16:01 1.9w次阅读
    <b class='flag-5'>iic</b><b class='flag-5'>通信协议</b>是什么

    51单片机IIC通信协议

    * @author Byron (from3900@gmail.com) * @version V1.0.0 * @date 05/12/2020 * @brief 51系列单片机I2C通信协议头文件 * -------------------------------------------
    发表于 11-20 20:06 5次下载
    51单片机<b class='flag-5'>IIC</b><b class='flag-5'>通信协议</b>

    开漏输出在IIC通信中的作用

    最近在调ICM20602模块(一个六轴陀螺仪和加速度计), 使用IIC通信协议, 这个过程中遇到一个困扰我很长时间的问题。
    的头像 发表于 03-12 10:48 4111次阅读

    单片机IIC通信协议详解

    前面的文章中已经介绍了单片机的并口通信和UART串口通信,在实际开发过程中我们还可能用到很多其他通信协议IIC协议就是其中常见的一种,它的
    的头像 发表于 03-20 15:20 2626次阅读
    单片机<b class='flag-5'>IIC</b><b class='flag-5'>通信协议</b>详解

    IIC通信协议,搞懂这篇就够了

    I2C(IIC)属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,属于一主多从(一个主设备(Master),多个从设备(Slave))的总线结构,总线上的每个设备都有一个特定的设备地址,以区分同一I2C总线上的其他设备。
    的头像 发表于 03-23 17:00 3984次阅读