硬件通讯协议
一些基础概念
串行通信协议
同步通信(asynchronous data communication):以数据块为单位传输,收发方必须使用同一时钟源。
异步通信(synchronous data communication):以字符为单位传输,两个字符之间传输的时间间隔不固定的,但同个字符内部的时间间隔是固定的,收发方无需使用同一时钟源,只要时钟信号的频率相同即可。
异步通信通过传送字符内的起始位来进行同步,而同步通信采用共用外部时钟来进行同步。
通俗点来说:同步通信就是舔狗发微信找女神,对方一直不回复,但舔狗一直在那等待回复;异步通信就是一个比较聪明点的舔狗发微信找女神,对方一直不回复,但舔狗不在那一直等待回复,选择了干其他事情。
数据传送方式
单工:只有一个固定方向进行传送数据。
半双工:双方都可以进行传送数据,但不能同时传送和接收数据,即只存在一方传送,一方接收。
全双工:双方都可以进行发送数据,并且可以同时传送和接收数据。
常见电平标准
TTL 电平:全双工,1:2.4V~5V,0:0.
电平类型 | 通信方式 | 逻辑1 | 逻辑0 |
---|---|---|---|
TTL 电平 | 全双工 | 2.4V~5V | 0V~0.5V |
COMS 电平 | |||
RS232 | 全双工 | -15V~-5V | +3V~+15V |
RS485 | 半双工 | +2V~+6V | -6V~-2V |
串口参数
- 波特率:串口通信的速率 单位一般为 bit/s,一秒传送多少位,波特率的倒数就是传送 1 位的时间。
- 起始位:标志一个数据帧的开始,固定为低电平。
- 数据位:数据帧的有效载荷,1 为高电平,0 为低电平,低位先行即一组数据是低位先入。
- 检验位:用于数据验证,根据数据位计算得来。
- 停止位:用于数据帧间隔,固定为高电平
TX 引脚与 GND 进行比较输出定时翻转的高低电平,RX 引脚定时读取引脚的高低电平,每个字节的数据加上起始位、停止位、可选的检验位封装位数据帧,依次输出在 TX 引脚,另一端 RX 引脚依次接收。
硬件流控制:多接了根线连接发送端和接收端,只有当接收端准备好了告诉发送端,发送端才开始发送数据。防止发送端数据太快导致接收端数据丢失或被覆盖。
常见的硬件通讯协议
UART
UART——通用异步收发传输器,工作原理是将传输数据的每个字符一位接一位地传输。只要 2 根传输线就可以实现双向通信,一根线发送数据的同时用另一根线接收数据。
由于 UART 是异步通信,因此对于两个使用 UART串口通信的端口,这些参数必须匹配,否则通信出错。
通信数据格式
起始位:表示数据传输的开始,电平逻辑为“0” ,位数为1位。
数据位:可以是5~8位的数据,先发低位,再发高位,一般取值为8,因为一个ASCII 字符值为8位。
奇偶校验位:用于接收方对接收到的数据进行校验,“1”的位数为偶数(偶校验) 或奇数(奇校验),以此来校验数据传送的正确性,使用时不需要此位也可以。
停止位:表示一帧数据的结束,电平逻辑为“1”,位数可以是1/1.5/2位。
波特率:串口通信时的速率,它用单位时间内传输的二进制代码的有效位(bit) 数来表示,其单位为每秒比特数bit/s(bps)。常见的波特率值有4800、9600、115200 等,数值越大数据传输的越快,波特率为115200 表示每秒钟传输115200 位数据。
连接方式为 TX——RX,RX——TX,GND——GND。
- UART只是对信号的时序进行了定义,而未定义接口的电气特性;
- UART通信时一般直接使用处理器使用的电平,即TTL电平,但不同的处理器使用的电平存在差异,所以不同的处理器使用UART通信时一般不能直接相连;
- UART没有规定不同器件连接时连接器的标准,所以不同器件之间通过UART通信时连接不方便。
- UART一般直接使用 TTL信号来表示 0 和 1,但 TTL信号的抗干扰能力较差,数据在传输过程中很容易出错。
- 由于TTL信号的抗干扰能力较差,所以其通信距离很短,一般只能用于一个电路板上的两个不同芯片之间的通信。
USART
通用同步异步收发器(Universal Synchronous Asynchronous Receiver Transmitter)
内容跟 UART 类似,不过 USART 比 UART 多了另外一种通信方式——异步通信,即 USART 既可以异步通信也可以同步通信,具体设置方式参考手册。
TX:发送数据输出引脚。
RX:接收数据输入引脚。
SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
nRTS: 请求以发送(Request To Send),n 表示低电平有效。如果使能 RTS 流控制,当USART 接收器准备好接收新数据时就会将 nRTS 变成低电平;当接收寄存器已满时,nRTS 将被设置为高电平。该引脚只适用于硬件流控制。
nCTS: 清除以发送(Clear To Send),n 表示低电平有效。如果使能 CTS 流控制,发送器在发送下一帧数据之前会检测 nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
SCLK: 发送器时钟输出引脚。
编程时常用的标志位
- RE:接收使能
- RXNE:读数据寄存器非空
- RXNEIE:发送完成中断使能
USART 支持使用 DMA,可实现高速数据通信,USART 在 STM32 常用于打印程序信息,一般在硬件设计时都会预留一个 USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息打印在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错具体哪里出错等等。
IIC
IIC(Inter-Integrated Circuit集成电路总线)是一种串行通信总线,使用多主从架构,利用该总线可实现多主机系统所需的裁决和高低速设备同步等功能。
- IIC 总线是一种串行、半双工总线,同步通信、主要用于近距离、低速的芯片之间的通信。
- IIC 串行总线一般有两根信号线,一根是双向的数据线 SDA 收发数据,另一根是时钟线 SCL 双方时钟同步。所有接到IIC总线设备上的串行数据 SDA 都接到总线的 SDA 上,各设备的时钟线 SCL 接到总线的 SCL 上。
- IIC 是真正的多主机总线,(IIC可以在通讯过程中,改变主机)。如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏。
- 多个 IIC 器件可以并联在 IIC 总线上,每个器件有特定的地址,分时共享 IIC 总线。连接到 IIC 总线上的设备既可以用作主设备,也可以用作从设备。主设备负责控制通信,通过对数据传输进行初始化/终止化,来发送数据并产生所需的同步时钟脉冲。从设备则是等待来自主设备的命令,并响应命令接收。主设备和从设备都可以作为发送设备或接收设备。无论主设备是作为发送设备还是接收设备,同步时钟信号都只能由主设备产生。
- 串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s,快速模式下可达 400kbit/s ,高速模式下可达 3.4Mbit/s。
SCL 为高时,SDA 由高电平——>低电平,表示起始位。
SCL 为高时,SDA 由低电平——>高电平,表示停止位。
SCL 为高时,SDA 始终为高电平,表示逻辑 1。
SCL 为高时,SDA 始终为低电平,表示逻辑 0。
数据帧中,0 表示写数据,1 表示读数据;应答信号中,0 表示数据被正确接收,1 表示从机正忙,接收错误。
IIC 中由于是多主机进行通信,各主机互相抢占总线,多主机会产生总线裁决问题。当多个主机同时想占用总线时,企图启动总线传输数据,就叫做总线竞争。I2C通过总线仲裁,以决定哪台主机控制总线。在多主机中寻址需要在数据帧中添加设备地址,这个设备地址为 7 位,支持最多 255 台主机通信。
在起始信号后必须传送一个从机的地址(7 位),第 8 位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。
优点:
- 简单的两线串行 IIC 总线,节省 PCB 布板走线空间。
- 完全集成的 IIC总线协议消除了地址解码器。
- 标准支持广泛,大量无铅封装 I2C 总线兼容集成芯片进一步降低了空间需求。
- 控制方式简单、器件封装形式小、通信速率较高。
缺点:
- 数据传输速率较慢;
- 只适用短距离传输。
SPI
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线。它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。
SPI 是一个环形总线结构,由MOSI、MISO、SCLK、SS 四根线构成,其时序其实很简单,主要是在SCLK 的控制下,两个双向移位寄存器进行数据交换。
- **MISO (Master Input Slave Output)**:主设备数据输入,从设备数据输出;
- **MOSI (Master Output Slave Input)**:主设备数据输出,从设备数据输入;
- **SCLK (Serial Clock)**:时钟信号,由主设备产生;
- **SS (Slave Selection)**:外围设备片选信号线,用来选择哪个设备工作。
连接图大致如下:
操作码 01:写数据;10:读数据。在多主机中寻址需要在数据帧中添加设备地址,这个设备地址为 7 位,支持最多 255 台主机通信。
在 SPI 操作中,有两项比较重要的设置,就是时钟极性(**CPOL(Clock Polarity)或 UCCKPL)和时钟相位(CPHA(Clock Phase)**或 UCCKPH)。
时钟极性设置时钟空闲时的电平。当时钟极性为 0 时(CPOL=0),SCK信号线在空闲时为低电平;当时钟极性为 1 时(CPOL=1),SCK信号线在空闲时为高电平。
时钟相位设置读取数据和发送数据的时钟沿,用来决定何时进行信号采样。
SPI 模式 | CPOL | CPHA | 空闲状态下的时钟极性 | 用于采样和移位数据的时钟相位 |
---|---|---|---|---|
0 | 0 | 0 | 逻辑低电平 | 数据在上升沿采样,在下降沿发送 |
1 | 0 | 1 | 逻辑低电平 | 数据在下降沿采样,在上升沿发送 |
2 | 1 | 1 | 逻辑高电平 | 数据在下降沿采样,在上升沿发送 |
3 | 1 | 0 | 逻辑高电平 | 数据在上升沿采样,在下降沿发送 |
SPI 接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。
优点:
- 支持全双工,推挽(push-pull)的驱动性能相比开漏(open-drain)信号完整性更好;
- 硬件连接简单,且支持高速(100MHz以上);
- 协议支持数据字长不限于 8bits,可根据应用特点灵活选择消息字长。
- 在点对点的通信中,SPI接口进行片选从机,不需要进行寻址操作,且为全双工通信,显得简单高效。
缺点:
- 相比IIC多两根线,没有寻址机制,只能靠片选选择不同设备;
- 没有指定的流控制,没有应答机制(ACK)确认是否接收到数据,主设备对于发送成功与否不得而知;
- 典型应用只支持单主控,只有一个主机;
- 在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比 I2C系统要稍微复杂一些。
- SPI仅适用于短距离传输。
CAN
USB
Type-C
(49条消息) 常用的嵌入式硬件通信接口协议(UART、IIC、SPI、RS-232、RS-485、RS-422、CAN、USB、IRDA)(二)_嵌入式硬件接口_木木9026的博客-CSDN博客
(49条消息) 常用的嵌入式硬件通信接口协议(UART、IIC、SPI、RS-232、RS-485、RS-422、CAN、USB、IRDA)(二)_嵌入式硬件接口_木木9026的博客-CSDN博客
(49条消息) 常用的嵌入式硬件通信接口协议(UART、IIC、SPI、RS-232、RS-485、RS-422、CAN、USB、IRDA)(三)_硬件协议接口对接_木木9026的博客-CSDN博客
(49条消息) IIC详解,包括原理、过程,最后一步步教你实现IIC_shaguahaha的博客-CSDN博客