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

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

3天内不再提示

IIC通讯协议解析

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2022-11-14 16:52 次阅读

概述

IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统手机用以连接低速周边设备而发展。I²C的正确读法为“I平方C”("I-squared-C"),而“I二C”("I-two-C")则是另一种错误但被广泛使用的读法。自2006年10月1日起,使用I²C协议已经不需要支付专利费,但制造商仍然需要付费以获取I²C从属设备地址。

接口

I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。

  • SCL - 串行时钟线
  • SDA - 串行数据线
  • 在这里插入图片描述

为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。设备上的串行数据线SDA接口电路应该是双向的,输出电路用于向总线上发送数据,输入电路用于接收总线上的数据。而串行时钟线也应是双向的,作为控制总线数据传送的主机,一方面要通过SCL输出电路发送时钟信号,另一方面还要检测总线上的SCL电平,以决定什么时候发送下一个时钟脉冲电平;作为接受主机命令的从机,要按总线上的SCL信号发出或接收SDA上的信号,也可以向SCL线发出低电平信号以延长总线时钟信号周期。总线空闲时,因各设备都是开漏输出,上拉电阻Rp使SDA和SCL线都保持高电平。任一设备输出的低电平都将使相应的总线信号线变低,也就是说:各设备的SDA是“与”关系,SCL也是“与”关系。 因此SDA和SCL 可以被拉低为低电平,但是不能被驱动为高电平,所以每条线上都要使用一个上拉电阻,默认情况下将其保持在高电平。 在这里插入图片描述 IIC 总线上数据的传输速率在标准模式下可达 100kbit/s 在快速模式下可达 400kbit/s 在高速模式下可达 3.4Mbit/s。

通信协议

SDA 线上的数据必须在时钟的高电平周期保持稳定。数据线的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变。 在这里插入图片描述

空闲状态

SDA为高电平,SCL为高电平。

起始状态

其中一种情况是在 SCL 线是高电平时 SDA 线从高电平向低电平切换,产生一个 下降沿 ,这个情况表示起始条件。

结束状态

当 SCL 是高电平时 SDA 线由低电平向高电平切换,产生一个 上升沿 ,这个情况表示停止条件。 在这里插入图片描述

传输数据

器件地址位

由于IIC总线上可能挂载着多台设备,所以主设备在传输有效数据之前要先指定从设备的地址, 大多数从设备的地址是7位的,还有部分设备支持10位寻址 ,主设备如果需要向从机发送/接收数据,首先要发送对应从机的地址,然后会匹配总线上挂载的从机的地址。将数据发送至SDA数据线上即可。

读写位

紧接着的第 8 位是数据方向位(R/ W) ----'0'表示发送(写),'1'表示请求数据(读)。

应答信号位

主设备每发送完8bit数据后等待从设备的ACK。 即在第9个clock,若从设备发ACK,SDA会被拉低。 若没有ACK,SDA会被置高,这会引起主设备发生RESTART或STOP流程,当ACK=0时为有效应答位,说明从机已经成功接收到该字节,若为1则说明接受不成功。

数据地址位

当找到往哪个设备写数据之后,就开始寻址往这个设备的特定地址写数据,和上述的发送器件地址一样,直接将地址数据发送至SDA线即可。

数据位

发送到 SDA 线上的每个字节必须为8位,每次传输可以发送的字节数量不受限制,每个字节后必须跟一个响应位,首先传输的是数据的最高位 (MSB) 。 在这里插入图片描述

示例

设置器件地址为0x78(0111 1000),数据地址为0x40(0100 0000),写入数据0xAA(1010 1010)。

HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,data_i,1,0x100);

查看HAL_I2C_Mem_Write说明可以得知,目标设备地址在调用接口之前,数据表中设备的7位地址值必须左移;即发送到从设备的数据已经右移了一位,所以0x78(0111 1000)右移一位变成0x3c(011 1100)。

/**
 * @brief  Write an amount of data in blocking mode to a specific memory address
 * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
 *                the configuration information for the specified I2C.
 * @param  DevAddress Target device address: The device 7 bits address value
 *         in datasheet must be shifted to the left before calling the interface
 * @param  MemAddress Internal memory address
 * @param  MemAddSize Size of internal memory address
 * @param  pData Pointer to data buffer
 * @param  Size Amount of data to be sent
 * @param  Timeout Timeout duration
 * @retval HAL status
  */
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,
                                    uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

通过示波器抓取的波形如下所示。 在这里插入图片描述

  • 在空闲状态,SDA和SCL都是处于高电平状态。

  • 在起始状态,SDA先产生一个下降沿,之后SCL也出现一个下降沿,此时数据传输开始。

  • 在传输状态,由于传输速率为100kbit/s,故SCL时钟的切换时间为5us,一个周期为10us;当SCL为1的时候,SDA不会发生改变,故检测SDA信号线的数据,当为低电平则为0,高电平则为1.

  • 在读写状态,当SDA数据为0的时候,为写状态。

  • 在应答状态,当SDA数据为0的时候,为应答状态。 在这里插入图片描述 上述为成功传输的例子,若不成功传输,设置器件地址为0x77(0111 0111),数据地址为0x40(0100 0000),写入数据0xAA(1010 1010)。

    HAL_I2C_Mem_Write(&hi2c1 ,0x77,0x40,I2C_MEMADD_SIZE_8BIT,data_i,1,0x100);
    

    由于地址位0x77(0111 0111)右移一位,故发送出去的为0x3B(011 1011),通过示波器抓取的波形如下所示。 在这里插入图片描述

    • 在应答状态,由于没有连接0x77地址(实际发送为0x3B)的设备,当SDA数据为1的时候,为非应答状态,之后进入复位或者停止。 在这里插入图片描述

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • IIC
    IIC
    +关注

    关注

    11

    文章

    300

    浏览量

    38311
  • 通讯协议
    +关注

    关注

    10

    文章

    273

    浏览量

    20351
收藏 人收藏

    评论

    相关推荐

    IIC通讯协议解析

    概述 IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式
    发表于 09-12 16:09

    RS-232-C串口通讯协议解析

    RS-232-C串口通讯协议解析
    发表于 08-18 22:08

    知道通讯协议,怎么用LabVIEW解析

    知道通讯协议,求大师指导怎么用LabVIEW解析
    发表于 05-06 20:19

    常见的通讯协议有哪几种

    通讯载体目前实验设备中通讯方式有串口通讯、CAN通讯、以太网通讯。常见的通讯
    发表于 08-18 07:27

    stm32之IIC通信协议定义

    1.IIC通信协议定义 IIC通讯协议(Inter----Integrted Circuit)是由Phiips飞利浦公司开发的,由于他引脚少
    发表于 08-20 08:28

    IIC协议总线特点简介

    IIC协议简介I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN等
    发表于 08-20 06:12

    IIC通讯协议

    IIC通讯协议
    发表于 08-23 06:30

    LESSON8_IIC总线协议

    iic总线协议通讯方式,通讯工作原理!单片机入门知识
    发表于 06-17 16:48 11次下载

    基于KMP算法的串口通讯协议解析邹铁

    基于KMP算法的串口通讯协议解析_邹铁
    发表于 03-17 08:00 2次下载

    FPGA基础知识之IIC协议读写解析

    400kbit/s。本文致力于讲述如何用计数器控制和分频时钟控制两种方式完成IIC的读写操作。 IIC协议   IIC协议是一种多机
    发表于 05-05 10:17 8247次阅读
    FPGA基础知识之<b class='flag-5'>IIC</b><b class='flag-5'>协议</b>读写<b class='flag-5'>解析</b>

    IIC与SPI通讯

    IICInter-Intergrated Circuit(内部集成电路)由数据线SDA和时钟线SCL构成串行总线,可发送接收数据。SCL:通讯时起到控制作用。SDA:进行位传输数据。软件IIC:通过
    发表于 12-29 19:32 3次下载
    <b class='flag-5'>IIC</b>与SPI<b class='flag-5'>通讯</b>

    STM32第九章-IIC通讯应用

      说到IIC(通常也叫I2C,其实都是一样的)通讯,是一种最简单的通讯协议。在学习STM32时第一个接触的就是串口USART
    发表于 02-07 10:32 9次下载
    STM32第九章-<b class='flag-5'>IIC</b><b class='flag-5'>通讯</b>应用

    振弦采集模块的通讯协议IIC

    振弦采集模块的通讯协议IICIIC 通讯协议本身即是基于设备地址和寄存器的物理层
    的头像 发表于 11-17 10:02 829次阅读
    振弦采集模块的<b class='flag-5'>通讯</b><b class='flag-5'>协议</b>( <b class='flag-5'>IIC</b>)

    IIC通讯协议的电路设计

    前面我们概述过一些常见的通讯协议,本文着重讲讲关于IIC协议
    的头像 发表于 04-19 11:00 2063次阅读
    <b class='flag-5'>IIC</b><b class='flag-5'>通讯</b><b class='flag-5'>协议</b>的电路设计

    iic通讯的ardunio的文件下载

    里面很多iic通讯的ardunio的文件
    发表于 07-05 10:55 1次下载