通信协议整理之 IIC 通信

文章目录

  • 通信协议整理之 IIC 通信
    • 简介
    • 工作原理
    • 数据传输信号
      • 数据有效条件
      • 起始条件和终止条件
      • 地址
      • 读/写
      • 应答
      • 数据
    • 传输步骤
    • IIC 通信优缺点
    • 补充
      • 硬件 IIC 和 软件模拟 IIC

简介

IIC 是一种串行同步通信总线( 半双工 ),一般有两根信号线,一根是双向的串行数据线 SDA ,另一根是时钟线 SCL 。 IIC 总线可挂载多个主设备,多个从设备,且每个接到 IIC 总线上的器件都有唯一的地址。 IIC 总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号,这些信号中,起始信号是必需的,结束信号和应答信号, 都可以不要。 IIC 协议广泛应用在 OLED 显示器、气压传感器或陀螺仪/加速度计等模块的项目中。
SDA (串行数据):主机和从机发送和接收数据的线路。
SCL (串行时钟):传输时钟信号的线路。
根据串行通信及同步通信的特点可知, IIC 总线的数据沿着 SDA 逐位传输,且位的输出通过主机和从机之间共享的时钟信号与位采样同步,时钟信号始终由主站控制。
串行通信和同步通信详情请见:通信协议整理

工作原理

使用 IIC 通信时,数据在消息中传输。消息又被分解为数据帧。每条消息都有一个地址帧,其中包含从机的二进制地址,以及一个或多个有效数据的数据帧。该消息还包括每个数据帧之间的开始和停止条件、读/写位和 ACK/NACK 位。

数据传输信号

数据有效条件

IIC 总线进行数据传输时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的电平状态才允许改变。因此,在时钟信号为高电平期间即 SCL 为 1 时,读取到的为有效数据。

起始条件和终止条件

SCL 线为高电平期间, SDA 线由高电平向低电平的变化表示起始信号; SCL 线为高电平期间, SDA 线由低电平到高电平的变化表示终止信号。起始信号和终止信号都是由主机发送的。在起始信号产生之后,总线处于被占用的状态,在终止信号产生之后,总线处于空闲状态。

每次数据传送总是由主机产生的终止信号来结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。

起始条件:SCL:高电平期间; SDA:由高到低。
终止条件:SCL:高电平器件; SDA:由低到高。

地址

IIC 通过寻址来让从机知道数据正在发送给它,而不是另一个从机站。
地址帧始终是新消息中起始位之后的第一个帧。后面的字节都是数据,不再是寻址,除非又重新来一个起始信号。主机发送地址时,总线上的每个从机都将地址码与自己的地址进行比较,若相同,则认为自己正在被主机寻址。

地址帧:每个从机唯一的 7 位、 8 位或 10 位序列,当主机想要与其通信时,该序列标识从机。

读/写

地址帧在末尾包含的一个位,通知从机是要向其写入还是从中读出数据。如果主机要向从机写数据,则读/写位为低电平,反之该位为高电平。

读/写位: 指定主机是向从机发送数据还是从中请求数据的单个位。

应答

接收数据的 IIC 设备在接收到数据后,向发送数据的 IIC 设备发出特定的低电平脉冲,表示已收到数据。
ACK/NACK 位:消息中的每个帧后跟一个确认/不确认位。如果成功接收地址帧或数据帧,则从接收方向发送方返回 ACK 位,反之返回 NACK 位。

数据

在主机检测到来自从机寻址应答的 ACK 位后,数据帧就可以发送了。

数据帧的长度始终为 8 位,并且首先发送最高有效位。每个数据帧后紧跟一个 ACK/NACK 位,以验证是否已成功接收该帧。在发送下一个数据帧之前,ACK位必须由主机或从机接收。
发送完所有数据帧后,主机可以向从机发送停止条件以停止传输。

传输步骤

  1. 主机发送起始信号,将启动信号发送到每个连接的从机。
#mermaid-svg-vZeuzIsntbNoZv7b {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-vZeuzIsntbNoZv7b .error-icon{fill:#552222;}#mermaid-svg-vZeuzIsntbNoZv7b .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vZeuzIsntbNoZv7b .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-vZeuzIsntbNoZv7b .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vZeuzIsntbNoZv7b .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vZeuzIsntbNoZv7b .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vZeuzIsntbNoZv7b .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vZeuzIsntbNoZv7b .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vZeuzIsntbNoZv7b .marker.cross{stroke:#333333;}#mermaid-svg-vZeuzIsntbNoZv7b svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vZeuzIsntbNoZv7b .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vZeuzIsntbNoZv7b .cluster-label text{fill:#333;}#mermaid-svg-vZeuzIsntbNoZv7b .cluster-label span{color:#333;}#mermaid-svg-vZeuzIsntbNoZv7b .label text,#mermaid-svg-vZeuzIsntbNoZv7b span{fill:#333;color:#333;}#mermaid-svg-vZeuzIsntbNoZv7b .node rect,#mermaid-svg-vZeuzIsntbNoZv7b .node circle,#mermaid-svg-vZeuzIsntbNoZv7b .node ellipse,#mermaid-svg-vZeuzIsntbNoZv7b .node polygon,#mermaid-svg-vZeuzIsntbNoZv7b .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vZeuzIsntbNoZv7b .node .label{text-align:center;}#mermaid-svg-vZeuzIsntbNoZv7b .node.clickable{cursor:pointer;}#mermaid-svg-vZeuzIsntbNoZv7b .arrowheadPath{fill:#333333;}#mermaid-svg-vZeuzIsntbNoZv7b .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vZeuzIsntbNoZv7b .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vZeuzIsntbNoZv7b .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-vZeuzIsntbNoZv7b .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-vZeuzIsntbNoZv7b .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vZeuzIsntbNoZv7b .cluster text{fill:#333;}#mermaid-svg-vZeuzIsntbNoZv7b .cluster span{color:#333;}#mermaid-svg-vZeuzIsntbNoZv7b div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vZeuzIsntbNoZv7b :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

起始信号
主机
从机
  1. 主机向每个从机发送它想要与之通信的从机的 7 位、 8 位或 10 位地址,以及读/写位。
#mermaid-svg-q4sY4pItdtNXwKCY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-q4sY4pItdtNXwKCY .error-icon{fill:#552222;}#mermaid-svg-q4sY4pItdtNXwKCY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-q4sY4pItdtNXwKCY .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-q4sY4pItdtNXwKCY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-q4sY4pItdtNXwKCY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-q4sY4pItdtNXwKCY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-q4sY4pItdtNXwKCY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-q4sY4pItdtNXwKCY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-q4sY4pItdtNXwKCY .marker.cross{stroke:#333333;}#mermaid-svg-q4sY4pItdtNXwKCY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-q4sY4pItdtNXwKCY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-q4sY4pItdtNXwKCY .cluster-label text{fill:#333;}#mermaid-svg-q4sY4pItdtNXwKCY .cluster-label span{color:#333;}#mermaid-svg-q4sY4pItdtNXwKCY .label text,#mermaid-svg-q4sY4pItdtNXwKCY span{fill:#333;color:#333;}#mermaid-svg-q4sY4pItdtNXwKCY .node rect,#mermaid-svg-q4sY4pItdtNXwKCY .node circle,#mermaid-svg-q4sY4pItdtNXwKCY .node ellipse,#mermaid-svg-q4sY4pItdtNXwKCY .node polygon,#mermaid-svg-q4sY4pItdtNXwKCY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-q4sY4pItdtNXwKCY .node .label{text-align:center;}#mermaid-svg-q4sY4pItdtNXwKCY .node.clickable{cursor:pointer;}#mermaid-svg-q4sY4pItdtNXwKCY .arrowheadPath{fill:#333333;}#mermaid-svg-q4sY4pItdtNXwKCY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-q4sY4pItdtNXwKCY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-q4sY4pItdtNXwKCY .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-q4sY4pItdtNXwKCY .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-q4sY4pItdtNXwKCY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-q4sY4pItdtNXwKCY .cluster text{fill:#333;}#mermaid-svg-q4sY4pItdtNXwKCY .cluster span{color:#333;}#mermaid-svg-q4sY4pItdtNXwKCY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-q4sY4pItdtNXwKCY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

地址及读写位
主机
从机
  1. 每个从机进行寻址,将主机发送的地址与自身地址进行比较,若匹配,则发送 ACK 位应答信号,反之从机将 SDA 线路保持不变维持在高电平。
#mermaid-svg-LZDoZxez7gHUl9UD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LZDoZxez7gHUl9UD .error-icon{fill:#552222;}#mermaid-svg-LZDoZxez7gHUl9UD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LZDoZxez7gHUl9UD .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-LZDoZxez7gHUl9UD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LZDoZxez7gHUl9UD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LZDoZxez7gHUl9UD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LZDoZxez7gHUl9UD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LZDoZxez7gHUl9UD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LZDoZxez7gHUl9UD .marker.cross{stroke:#333333;}#mermaid-svg-LZDoZxez7gHUl9UD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LZDoZxez7gHUl9UD .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LZDoZxez7gHUl9UD .cluster-label text{fill:#333;}#mermaid-svg-LZDoZxez7gHUl9UD .cluster-label span{color:#333;}#mermaid-svg-LZDoZxez7gHUl9UD .label text,#mermaid-svg-LZDoZxez7gHUl9UD span{fill:#333;color:#333;}#mermaid-svg-LZDoZxez7gHUl9UD .node rect,#mermaid-svg-LZDoZxez7gHUl9UD .node circle,#mermaid-svg-LZDoZxez7gHUl9UD .node ellipse,#mermaid-svg-LZDoZxez7gHUl9UD .node polygon,#mermaid-svg-LZDoZxez7gHUl9UD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LZDoZxez7gHUl9UD .node .label{text-align:center;}#mermaid-svg-LZDoZxez7gHUl9UD .node.clickable{cursor:pointer;}#mermaid-svg-LZDoZxez7gHUl9UD .arrowheadPath{fill:#333333;}#mermaid-svg-LZDoZxez7gHUl9UD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LZDoZxez7gHUl9UD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LZDoZxez7gHUl9UD .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-LZDoZxez7gHUl9UD .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-LZDoZxez7gHUl9UD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LZDoZxez7gHUl9UD .cluster text{fill:#333;}#mermaid-svg-LZDoZxez7gHUl9UD .cluster span{color:#333;}#mermaid-svg-LZDoZxez7gHUl9UD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LZDoZxez7gHUl9UD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

主机
从机
寻址
产生 ACK 应答信号
地址匹配
地址不匹配
从机 SDA 维持高电平
  1. 主机发送或接收数据帧。
#mermaid-svg-F5uTLZysc1jayNxF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-F5uTLZysc1jayNxF .error-icon{fill:#552222;}#mermaid-svg-F5uTLZysc1jayNxF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-F5uTLZysc1jayNxF .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-F5uTLZysc1jayNxF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-F5uTLZysc1jayNxF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-F5uTLZysc1jayNxF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-F5uTLZysc1jayNxF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-F5uTLZysc1jayNxF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-F5uTLZysc1jayNxF .marker.cross{stroke:#333333;}#mermaid-svg-F5uTLZysc1jayNxF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-F5uTLZysc1jayNxF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-F5uTLZysc1jayNxF .cluster-label text{fill:#333;}#mermaid-svg-F5uTLZysc1jayNxF .cluster-label span{color:#333;}#mermaid-svg-F5uTLZysc1jayNxF .label text,#mermaid-svg-F5uTLZysc1jayNxF span{fill:#333;color:#333;}#mermaid-svg-F5uTLZysc1jayNxF .node rect,#mermaid-svg-F5uTLZysc1jayNxF .node circle,#mermaid-svg-F5uTLZysc1jayNxF .node ellipse,#mermaid-svg-F5uTLZysc1jayNxF .node polygon,#mermaid-svg-F5uTLZysc1jayNxF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-F5uTLZysc1jayNxF .node .label{text-align:center;}#mermaid-svg-F5uTLZysc1jayNxF .node.clickable{cursor:pointer;}#mermaid-svg-F5uTLZysc1jayNxF .arrowheadPath{fill:#333333;}#mermaid-svg-F5uTLZysc1jayNxF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-F5uTLZysc1jayNxF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-F5uTLZysc1jayNxF .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-F5uTLZysc1jayNxF .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-F5uTLZysc1jayNxF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-F5uTLZysc1jayNxF .cluster text{fill:#333;}#mermaid-svg-F5uTLZysc1jayNxF .cluster span{color:#333;}#mermaid-svg-F5uTLZysc1jayNxF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-F5uTLZysc1jayNxF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

数据帧
数据帧
主机
从机
  1. 传输完每个数据帧后,接收方向发送方返回 ACK 位应答信号,确认成功接收数据帧。
#mermaid-svg-1lONm2wJXmT4q1UW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1lONm2wJXmT4q1UW .error-icon{fill:#552222;}#mermaid-svg-1lONm2wJXmT4q1UW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1lONm2wJXmT4q1UW .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-1lONm2wJXmT4q1UW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1lONm2wJXmT4q1UW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1lONm2wJXmT4q1UW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1lONm2wJXmT4q1UW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1lONm2wJXmT4q1UW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1lONm2wJXmT4q1UW .marker.cross{stroke:#333333;}#mermaid-svg-1lONm2wJXmT4q1UW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1lONm2wJXmT4q1UW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1lONm2wJXmT4q1UW .cluster-label text{fill:#333;}#mermaid-svg-1lONm2wJXmT4q1UW .cluster-label span{color:#333;}#mermaid-svg-1lONm2wJXmT4q1UW .label text,#mermaid-svg-1lONm2wJXmT4q1UW span{fill:#333;color:#333;}#mermaid-svg-1lONm2wJXmT4q1UW .node rect,#mermaid-svg-1lONm2wJXmT4q1UW .node circle,#mermaid-svg-1lONm2wJXmT4q1UW .node ellipse,#mermaid-svg-1lONm2wJXmT4q1UW .node polygon,#mermaid-svg-1lONm2wJXmT4q1UW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1lONm2wJXmT4q1UW .node .label{text-align:center;}#mermaid-svg-1lONm2wJXmT4q1UW .node.clickable{cursor:pointer;}#mermaid-svg-1lONm2wJXmT4q1UW .arrowheadPath{fill:#333333;}#mermaid-svg-1lONm2wJXmT4q1UW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1lONm2wJXmT4q1UW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1lONm2wJXmT4q1UW .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-1lONm2wJXmT4q1UW .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-1lONm2wJXmT4q1UW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1lONm2wJXmT4q1UW .cluster text{fill:#333;}#mermaid-svg-1lONm2wJXmT4q1UW .cluster span{color:#333;}#mermaid-svg-1lONm2wJXmT4q1UW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1lONm2wJXmT4q1UW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

主机
从机
传输完成
产生 ACK 应答信号
  1. 主机发送停止信号。
#mermaid-svg-uvDpub63jOuxTtV9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uvDpub63jOuxTtV9 .error-icon{fill:#552222;}#mermaid-svg-uvDpub63jOuxTtV9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uvDpub63jOuxTtV9 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-uvDpub63jOuxTtV9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uvDpub63jOuxTtV9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uvDpub63jOuxTtV9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uvDpub63jOuxTtV9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uvDpub63jOuxTtV9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uvDpub63jOuxTtV9 .marker.cross{stroke:#333333;}#mermaid-svg-uvDpub63jOuxTtV9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uvDpub63jOuxTtV9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uvDpub63jOuxTtV9 .cluster-label text{fill:#333;}#mermaid-svg-uvDpub63jOuxTtV9 .cluster-label span{color:#333;}#mermaid-svg-uvDpub63jOuxTtV9 .label text,#mermaid-svg-uvDpub63jOuxTtV9 span{fill:#333;color:#333;}#mermaid-svg-uvDpub63jOuxTtV9 .node rect,#mermaid-svg-uvDpub63jOuxTtV9 .node circle,#mermaid-svg-uvDpub63jOuxTtV9 .node ellipse,#mermaid-svg-uvDpub63jOuxTtV9 .node polygon,#mermaid-svg-uvDpub63jOuxTtV9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uvDpub63jOuxTtV9 .node .label{text-align:center;}#mermaid-svg-uvDpub63jOuxTtV9 .node.clickable{cursor:pointer;}#mermaid-svg-uvDpub63jOuxTtV9 .arrowheadPath{fill:#333333;}#mermaid-svg-uvDpub63jOuxTtV9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uvDpub63jOuxTtV9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uvDpub63jOuxTtV9 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-uvDpub63jOuxTtV9 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-uvDpub63jOuxTtV9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uvDpub63jOuxTtV9 .cluster text{fill:#333;}#mermaid-svg-uvDpub63jOuxTtV9 .cluster span{color:#333;}#mermaid-svg-uvDpub63jOuxTtV9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uvDpub63jOuxTtV9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

停止信号
主机
从机

IIC 通信优缺点

优点:

  • 仅使用两根信号线
  • 支持多个主机和多个从机
  • 可使用 ACK/NACK 位确认每帧是否成功传输

缺点:

  • 数据帧的大小限制为 8 位
  • 硬件电路搭建复杂

补充

硬件 IIC 和 软件模拟 IIC

硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C;一般也较为稳定,但是程序较为繁琐。
软件I2C一般是用GPIO管脚,用软件控制管脚状态以模拟I2C通信波形。

优缺点:

  1. 硬件IIC用法比较复杂,模拟IIC的流程更清楚一些。
  2. 硬件IIC速度比模拟快,并且可以用DMA
  3. 模拟IIC可以在任何管脚上,而硬件只能在固定管脚上。
  4. 硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。

至于如何区分它们,最关键的一点为,软件 IIC 没有寄存器配置的概念,所有时许都是通过 IO 口拉高拉低写时序完成。

软件 IIC 是使用程序控制 SCL , SDA 线输出高低电平,模拟 IIC 协议的时序。一般较硬件 IIC 稳定,但是程序较为繁琐。

硬件 IIC 只要调用 IIC 的控制函数即可,不用直接的去控制 SCL , SDA 高低电平的输出。但是有些单片机的硬件 IIC 不太稳定,调试问题较多。

通信协议整理之 IIC 通信相关推荐

  1. 通信协议整理之 SPI 通信

    通信协议整理之 SPI 通信 文章目录 通信协议整理之 SPI 通信 简介 工作原理 通信连接方式 补充 硬件 SPI 和模拟 SPI 简介 SPI是串行外设接口(Serial Peripheral ...

  2. IIC通信协议(硬件实现IIC通信详解I)

    IIC通信协议 什么是IIC协议 协议层 起始信号和停止信号 数据的有效性 什么是IIC协议 I2C(Inter-Integrated Circuit)通讯协议是由 Phiilps 公司开发的两线式串 ...

  3. 51单片机常用通信方式之IIC通信(二)

    IIC通信是一种同步通信方式,同步通信是采用一个同步时钟线,连到收发双方,使收发双方达到完全同步.则IIC通信硬件连接就有四根线VCC.GND.SDA.SCL,SDA是传送数据的,SCL是控制时序的, ...

  4. 串口通信,IIC通信,SPI通信的简单区别

    一.串口通信 串口通信就是RS-232通信,只有两根线txd和rxd,通信双方必须设定相同的波特率,传输距离比较近. 二.IIC通信 IIC通信是最简单的串行通信协议,只需要一根数据线和一根时钟线,就 ...

  5. iic通信的深入理解(主从设备通信)

    虽然之前也研究了先iic同行基本的时序你弄明白了,可是在机子写at24c02驱动的时候由于理解不够透彻出了点问题. 一.写数据 24c02的写入数据,可以看到主从设备iic中写的过程:起始信号-> ...

  6. STM32 PAJ7620U2手势识别模块(IIC通信)程序源码详解

    最近在自学设计下基于STM32单片机的项目,想用手势识别模块做一点好玩的,做个手势控制家居设备开关,另外正好借此巩固I²C 通信.因此,我想借这个机会在这里和大家分享一下自己学习STM32单片机时的所 ...

  7. STM32CubMX自学笔记(十)---IIC通信实验

    STM32CubMX自学笔记(十)-IIC通信实验 I2C通信协议的简介 引脚少,硬件实现简单,可扩展性强,不需要外部收发设备,广泛用在多个集成电路通信. 物理层特点: 信号线SDA和时钟线SCL 1 ...

  8. 从IIC通信原理到使用 —— MPU6050

    IIC通信详解 -- 基于MPU6050模块 从IIC通信原理到使用 -- MPU6050 IIC通信可以简单地理解成就是数据的通信,就是单片机(主机)与设备(从机)之间的一种通信协议,两者必须遵从这 ...

  9. Proteus仿真之IIC通信(AT24C02)

    1.IIC通信简介:IIC是一种利用时钟线SCL和数据线SDA进行数据传输的通信协议.IIC的时序图如下所示: 我们需要看懂时序图中开始信号.数据传输.应答信号和停止信号. 开始信号:SCL为高电平时 ...

最新文章

  1. 简单工厂(SimpleFactory)模式简介
  2. Qt中为自己的程序建立一个消息循环
  3. 蓝桥杯 历届试题 九宫重排 (bfs+康托展开去重优化)
  4. unity官方教程-TANKS(一)
  5. JAXB自定义绑定– Java.util.Date / Spring 3序列化
  6. java的classpath
  7. 【FICO 汇率】汇率
  8. 正则匹配承兑的html,正则匹配闭合HTML标签(支持嵌套)
  9. 数据爆炸时代,云存储在“破圈”!
  10. 博弈论学习笔记——拍卖原理
  11. OpenCV:图像平移
  12. 福大软工 · 真 · 最终作业
  13. “中国年龄最小的黑客”汪正扬资料介绍 写编程代码曾敲坏电脑
  14. pvt检查是什么意思_EVT、DVT、PVT是什么意思
  15. VMI - 供应商管理库存
  16. 一款APP从设计稿到切图过程全方位揭秘
  17. revit建模中两面墙贴在一起怎么插入门窗及隐框玻璃的做法
  18. Learning Hammerspoon中英文互译
  19. Unity 向目标移动,并朝向目标
  20. 图解CISCO 3550忘记密码解决方法

热门文章

  1. html隐藏换行,css强制换行和超出隐藏实现
  2. 计算机图形学期末考试嘉应学院,嘉应学院数学系模拟考试试卷一及参考答案
  3. omni graffle
  4. 插件 iOS开发之微信自动抢红包功能
  5. 【洛谷 4994】终于结束的起点
  6. C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0
  7. AI如何赋能产业外勤工作(FSM)
  8. 实验九:按键控制无源蜂鸣器演奏《生日快乐》
  9. 苹果库克:我每天晚上 9 点半睡觉,凌晨 4 点起床。网友:太自律了
  10. 使用GHS MULTI新建工程并编译代码