串口、IIC、SPI通信协议

一、参考链接

常见的通信协议------UART、SPI、IIC、CAN......(更新中)-CSDN博客https://blog.csdn.net/qq_44955826/article/details/132610867?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ee3d76acccb33d130582e4d4069c9c43%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=ee3d76acccb33d130582e4d4069c9c43&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-132610867-null-null.142^v102^control&utm_term=IIC%E3%80%81UART%E3%80%81SPI&spm=1018.2226.3001.4187

2、【一文吃透】常见通信协议(SPI、IIC、UART、CAN)[面试重点]

二、UART

1、硬件电路

· 简单双向串口通信有两根通信线(发送端TX和接收端RX)

· TX与RX需要交叉连接

· 当值需要单向的数据传输时,可以只接一根通信线

· 当电平标准不一致时,需要加电平转换芯片

2、通信协议遵循96-N-8-1

很多模块默认出厂的硬件参数配置如下:遵循"9600,N,8,1"。

对于ARM的高速芯片,波特率默认上浮到115200bps。

3、应用场景

UARTUSART都是单片机上的串口通信,它们区别如下:

1、UART通用异步收/发器

2、USART通用同步/异步收/发器

3、USART比UART多了同步通信功能,同步通信需要时钟来触发数据传输,也就是说USART相对UART的区别之一就是能够提供主动时钟。

4、硬件设计:

当进行异步通信时,UART和USART是没有区别的。

区别在于USART比UART多了同步通信功能。

这个同步通信功能可以把USART当做SPI来用,比如用USART来驱动SPI设备。

5、软件设计(同步、异步):

同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

UART是异步通信(没有时钟线);IIC是同步通信(有时钟线);SPI是同步通信(有时钟线)。

6、单工、半双工、全双工

单工:数据传输 只能支持 数据在一个方向上传输(由A-->B)。

半双工:允许数据双向传输,但是在同一时刻,数据只能单方向传输(由A-->B或由B-->A)。

全双工:数据通信允许数据同时在两个方向上传输(A<-->B 要求发送设备和接收设备都有独立的接受和发送能力)。

UART是全双工;IIC是半双工;SPI是全双工。

三、IIC**(Inter-Integrated Circuit)**

IIC,更常被写作 I²C (读作"I-squared-C"),是一种非常经典、应用极其广泛的同步、串行、半双工、多主多从通信总线。

1、核心概念与设计目标

I²C 由飞利浦公司在 1980 年代(现为恩智浦 NXP)设计,其核心目标是提供一种简单、低成本的方式,让印刷电路板上的多个芯片之间进行短距离通信 。它只需要两根信号线,就能连接几十个设备。

2、主要特点

2.1 两线制:只需两根双向信号线。

  • SDA串行数据线,负责传输数据。

  • SCL串行时钟线,由主设备产生,用于同步数据传输。

  • 这两条线都通过上拉电阻接到电源,形成"线与"逻辑,任何设备都可以将总线拉低。

2.2 多主多从 :总线上可以连接多个主设备 和多个从设备。主设备负责发起和终止传输,并产生时钟信号。从设备响应主设备的命令。为了避免冲突,I²C 内置了仲裁机制。

2.3 地址寻址 :每个从设备都有一个唯一的7位或10位地址(7位地址模式最常见,最多可寻址 128 个设备,其中一些地址为保留地址)。主设备通过发送地址来选择与哪个从设备通信。

2.4 半双工:同一时刻,数据只能在一个方向上传输。通信是双向的,但需要交替进行。

2.5 速度模式:

  • 标准模式:100 kbps

  • 快速模式:400 kbps

  • 快速模式+:1 Mbps

  • 高速模式:3.4 Mbps

  • 超快模式:5 Mbps(单向传输)

3、协议基本格式

一次完整的 I²C 数据传输由以下几部分组成:

3.1 起始条件:SCL 为高电平时,SDA 从高电平跳变到低电平。表示一次传输开始。

3.2 地址帧:

  • 主设备发送一个 7位从设备地址 ,后跟 1位读写位

  • 读写位:0 表示主设备要写入 从设备,1 表示主设备要读取从设备。

  • 发送完毕后,主设备释放 SDA 线,等待从设备的应答。

3.3 应答位:在每传输完一个字节(8位)后,接收方(无论是主还是从)必须在下一位时钟脉冲期间将 SDA 线拉低,作为确认信号。

3.4 数据帧:地址被确认后,开始传输数据包,每次 1 字节,每个字节后必须跟一个应答位。

**3.5 停止条件:**SCL 为高电平时,SDA 从低电平跳变到高电平。表示本次传输结束。

[起始] [地址7位 + R/W 1位] [ACK] [数据8位] [ACK] ... [数据8位] [NACK] [停止]

4、工作原理示例(主设备读取传感器数据)

4.1 主设备发送起始信号

4.2 主设备发送传感器地址(7位) + 写位(0),表示"我要向这个传感器发送命令"。

4.3 传感器(从设备)发送应答位(ACK)

4.4 主设备发送一个寄存器地址(告诉传感器要读取哪个数据)。

4.5 传感器应答。

4.6 主设备再次发送起始信号(重复起始条件)。

4.7 主设备发送传感器地址(7位) + 读位(1),表示"现在我要从你那里读数据"。

4.8 传感器应答。

4.9 传感器 开始在 SDA 线上发送数据字节,主设备接收并发送 ACK。

4.10 当主设备读取完最后一个字节后,它会发送一个非应答(NACK)信号 ,然后发送停止信号

5、主设备向传感器(从设备)写数据的详细步骤

具体时序说明:

5.1 起始条件:主设备拉低SDA,然后拉低SCL,开始通信

5.2 地址帧:

  • 发送7位设备地址(如0x48)

  • 发送1位读写位:0表示写操作

**5.3 等待应答:**从设备在第9个时钟周期将SDA拉低表示ACK

**5.4 发送寄存器地址:**告诉传感器要写入哪个内部寄存器

5.5 等待应答

**5.6 发送数据字节:**要写入的实际数据(如配置值0x01)

5.7 等待应答(如果需要写入多个数据,重复6-7步)

**5.8 停止条件:**主设备拉高SDA,然后拉高SCL,结束通信

关键点

  • 写入操作总是:[地址+写位] → [寄存器地址] → [数据]

  • 每个字节传输后必须跟一个ACK/NACK

  • 主设备控制整个过程的时序

6、优缺点

优点

  • 连线简单:只需要两根线,极大节省了 PCB 空间和引脚资源。

  • 支持多主多从:灵活性高。

  • 有应答机制:确保数据传输的可靠性。

  • 协议成熟,支持广泛:几乎所有的微控制器、传感器、EEPROM、RTC时钟芯片等都内置 I²C 接口。

缺点

  • 速度相对较慢:相比 SPI 总线,速度较低。

  • 半双工:通信效率不如全双工的 SPI。

  • 地址冲突:如果两个从设备地址相同,会导致通信失败。需要硬件设计时注意。

  • 上拉电阻:需要根据总线速度和电源电压选择合适的上拉电阻值,设计不当会影响信号完整性。

  • 通信距离短:通常只适用于板级或设备内短距离通信(一般小于 1 米)。

7、典型应用场景

由于其简单性和低引脚占用,I²C 在嵌入式系统和消费电子中无处不在:

  • 读取传感器数据(温度、湿度、加速度、压力等)。

  • 访问小容量存储器(如 EEPROM)。

  • 控制LCD 显示屏IO 扩展芯片音频编解码器

  • 实时时钟通信。

8、与 SPI 的简单比较

特性 I²C SPI
信号线数量 2 根(SDA, SCL) 至少 3-4 根(MISO, MOSI, SCLK, CS)
拓扑结构 多主多从,总线型 一主多从,通常每个从设备需要独立的片选线
通信方式 半双工 全双工
最大速度 相对较慢(通常 < 1 Mbps) 非常快(可达几十 Mbps 甚至更高)
寻址方式 软件寻址(发送地址) 硬件寻址(通过片选引脚)
协议复杂性 相对复杂,有固定帧格式 相对简单,数据流格式更自由
功耗 静态功耗低(上拉电阻有漏电流) 动态功耗可能更高(速度更快)

9、向两个相同的传感器写数据:地址管理方案

这是I²C应用中常见的问题。两个完全相同的传感器通常出厂时地址是完全相同的(比如都是0x68),如果直接连接到同一I²C总线会导致冲突。以下是几种解决方案:

方案1:使用独立的I²C总线(硬件分离)

MCU

├── I2C1总线 ── 传感器A(地址0x68)

└── I2C2总线 ── 传感器B(地址0x68)

优点 :最简单直接,无地址冲突
缺点:占用MCU更多引脚和硬件资源

方案2:使用I²C多路复用器(如TCA9548A)

复制代码
MCU ── I2C ── 多路复用器
                    ├── 通道0 ── 传感器A(地址0x68)
                    └── 通道1 ── 传感器B(地址0x68)

工作原理

  1. 多路复用器本身有一个I²C地址(如0x70)

  2. MCU先向多路复用器发送命令,选择通道0

  3. 然后与传感器A通信(地址0x68)

  4. 再向多路复用器发送命令,切换到通道1

  5. 然后与传感器B通信(地址0x68)
    优点 :非常灵活,可扩展多个相同设备
    缺点:增加成本和复杂度

方案3:使用地址选择引脚(如果有)

许多传感器有地址选择引脚(通常是ADDR、A0、SA0等):

复制代码
传感器A:ADDR引脚接地 → 地址变为0x68(默认)
传感器B:ADDR引脚接VCC → 地址变为0x69

常见例子

  • MPU6050:AD0引脚(接地=0x68,接VCC=0x69)

  • BMP280:SDO引脚改变地址位

  • ADS1115:ADDR引脚三种接法对应三个地址

连线方式

复制代码
MCU ── I2C总线
        ├── 传感器A(ADDR接地)→ 地址0x68
        └── 传感器B(ADDR接VCC)→ 地址0x69

方案4:使用GPIO控制使能引脚

如果传感器有独立的使能或片选引脚:

复制代码
MCU ── I2C总线
        ├── 传感器A(EN_A由MCU_GPIO1控制)
        └── 传感器B(EN_B由MCU_GPIO2控制)

操作步骤:
1. MCU拉高GPIO1,拉低GPIO2 → 只有传感器A上电/使能
2. MCU向地址0x68写数据(实际是传感器A接收)
3. MCU拉低GPIO1,拉高GPIO2 → 只有传感器B上电/使能
4. MCU向地址0x68写数据(实际是传感器B接收)

优点 :软硬件都简单
缺点:需要额外的GPIO,且不能同时在线

方案5:软件地址重映射(较少见)

某些传感器支持通过配置内部寄存器来改变自身地址:

  1. 先单独初始化传感器A,将其地址改为0x69

  2. 然后传感器B保持默认地址0x68

  3. 现在可以同时连接两个设备

注意:大多数传感器不支持此功能

10、总结

I²C 是一种优雅、简洁的板级通信协议 ,完美地平衡了引脚数量、功能和复杂度。虽然它在速度和距离上存在局限,但其"两线连万物"的理念使其成为现代电子产品内部芯片间通信的绝对主力。理解 I²C 是嵌入式硬件和软件开发工程师的一项基础且重要的技能。

四、SPI

1、SPI介绍

时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据。

解释:CPOL=0表示SCL为低电平,即主从机没有数据传输处于空闲状态;否则,相反。

CPHA=0表示数据的采样时从第奇数个边沿开始(1,3,5 ......),

1、SPI接口共有4根信号线,分别是:

设备选择线(片选线:低电平有效。用来选择主设备与哪个从设备通信):

时钟线(有后面这三种写法):SCK、SCLK、CLK

串行输出数据线:MOSI (SDO)

串行输入数据线:MISO (SDI)

M:Master(主机) ; O:Output(输出); S:Slave(从机); I:Input(输入)

2、通信过程

(1)主机选择从机:主机通过拉低 对应从机的片选线选择开始与其通信。

(2)主机启动时钟,从机切换MISO模式:主机开始产生SCLK信号,通常从空闲状态开始,并在数据传输期间持续提供时钟信号,从机将MISO由高阻态切换为推挽输出。

(3)数据交换:

对于主机:

主机将要发送的数据写入其发送数据缓存区 后,先将一个字节的数据复制到移位寄存器 。然后移位寄存器中的数据从高位到地位一位一位的一出到MOSI线上。

同时,主机通过MISO先接收到从机从机发来的数据,半个时钟周期后就,这些从机发送的数据从高位到低位一位一位被移入移位寄存器。

当移位寄存器移出一个字节的数据时,它同时(严格上讲,差了半个时钟周期)也移入了一个字节的数据,此时移位寄存器中存储的是接收到的数据,这些数据会被存入接收数据缓存区,之后主机发送数据缓存去中的下一个字节的数据会被复制到移位寄存器,从而进行下一个自己的数据交换,如此循环,直到交换完所有的数据。

(从机和主机的数据交换逻辑差不多)

(4)完成通信:当所有需要交换的数据都传输完毕后,主机停止产生SCK信号,并将SS线拉高,已结束与当前从记得通信。从机将输出引脚(MISO)配置为高阻态,以避免干扰到主机与其他从机的通信。
注意:SPI只能进行数据交换,不能单独进行读或写数据。外设的写操作和读操作时同步完成的。如果只进行写操作,主机只需忽略接收到的字节(通常为0x00或0xFF);反之,若主机要读取从机给的一个字节,就必须发送一个字节(通常为0x00或0xFF)来引发从机的传输。

总之,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

SPI支持一主一从或一主多从,不支持多主机

五、总结

六、留言

如有错误,敬请指正。

相关推荐
时光の尘1 天前
嵌入式面试八股文(十九)·裸机开发与RTOS开发的区别
linux·stm32·单片机·iic·rtos·spi
小曹要微笑4 天前
I2C总线技术解析(纯文字版)
单片机·嵌入式硬件·esp32·iic
一个平凡而乐于分享的小比特7 天前
I2C、SPI、CAN、串口通信详细对比
can·uart·spi·i2c
2401_853448238 天前
QT控制----单片机控制外设项目
stm32·qt·uart
一个平凡而乐于分享的小比特9 天前
SPI通信协议全面详解
spi·通信协议
Darken0312 天前
什么是SPI协议?
单片机·spi
brave and determined18 天前
接口通讯学习(day04):RS-232与RS-485:通信接口全解析
网络·uart·通讯·emc·rs232·rs485·嵌入式设计
一个平凡而乐于分享的小比特21 天前
24LC16芯片介绍
iic·eeprom·24lc16
云雾J视界22 天前
FPGA+RISC-V架构解析:构建高效传感器数据采集系统
fpga开发·架构·uart·risc-v·i2c·adxl345