【嵌入式学习】串口通信:UART,I2C,SPI
UART
简单双向串口通信有两根通信线(发送端TXD和接收端RXD)
TXD与RXD要交叉连接
当只需单向的数据传输时,可以直接一根通信线
当电平标准不一致时,需要加电平转换芯片

数据格式
UART数据包包含有一个起始位,5到9个数据位(取决于UART),一个可选择的奇偶检验位以及一个或两个停止位:
- 起始位
UART数据传输线通常在不传输数据时保持在高电平电平。开始传输时发送UART在一个时钟周期内将传输线从高电平拉低到低电平,当接收UART检测到高电压转换时,他开始以波特率的频率读取数据帧中的位。 - 数据帧
数据帧内包含正在传输的实际数据。使用奇偶校验位是5-8位,不使用最多可以是9位。 - 校验位
奇偶校验位是接收UART判断传输期间是否有任何数据更改的方式。接收UART读取数据帧后,它将对值为1的数进行技术,并且检查总数是偶数还是奇数,是否与数据相匹配。 - 停止位
向数据包的结尾发出信号,发送UART将数据传输线从低电压驱动到高电压至少两位的时间。
通讯方式
- SBUF用来缓存信息,即用来发送又用来接受
- TI,RI这两个寄存器位会引发对应的中断
- 发送时,将数据写入SBUF,并通过观察TI来知道是否发送完成
- 接收时,来了数据时会触发中断(RI=1)通过中断函数读取SBUF

SPI
SPI可以无中断传输数据,可以连续地发送或接收任意数量的位。但是I2C和UART中,数据以数据包的形式发送,有限定位数。
SPI信号线有四种:
- MOSI-信号线:主机输出,从机输入;
- MISO-信号线:主机输入,从机输出;
- SCLK-时钟信号;
- SS/CS-片选信号;
优点:
- 无起始位和停止位,因此数据可以持续传输不会中断;
- 数据传输速率快(比I2C快几乎两倍)。
- 独立的MISO、MOSI可以同时发送和接收数据。
缺点:
- 使用四根线(I2C使用两根线)
- 没有信号接收成功的确认(I2C由此功能)
- 没有任何形式的错误检查(UART中的奇偶校验位)

I2C总线
I2C总线(Inter IC BUS)是由Philips公司开发的一种通用数据总线
仅需要两根通信线:SCL(Serial Clock)、SDA(Serial Data);所有I2C设备的SCL连在一起,SDA连在一起
特点:
- 同步(需要给clock信号作为通讯时的时钟信号)
- 半双工(同一时间只能一个方向通讯)
- 带数据应答(ACK)

核心思想
开漏输出模式,引脚处:
端口处想置1,则不接地(通过SDA,SLC的上拉电阻实现高电平);置0,则接地
设备的SCL和SDA均要配置成开漏输出模式
- SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右;所有设备引脚处默认不接地
- 默认不通信时线路是高电平,谁想通信谁接地(置0)
关键时序结构
主要思想:在SCL为高时,SDA线上的信号为有效信息!!!
-
开始通信:SCL高电平期间,SDA从高电平切换到低电平
-
结束通信:SCL高电平期间,SDA从低电平切换到高电平
-
发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
-
接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
-
发送应答:在接收完一个字节之后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
-
接收应答:在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
I2C 数据帧
发送一帧数据
接收一帧数据
优缺点
I2C优点
- 仅仅使用两根线
- 支持多个主机和从机
- 硬件比UART更简单
I2C缺点
- 数据传输比SPI慢
- 数据帧大小限制为8位
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?