You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

189 lines
5.4 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

[TOC]
# 1. 串口通信概述
## 1.1. 计算机通信
问题:
1. 我们知道的通信方式有哪些?
2. 理解通信技术的发展。
3. 通信的要素:以烽火为例子。
通信要素:
1. 硬件:通信介质
2. 软件:
1. 语法:格式
2. 语义:格式中信息的具体含义
### 1.1.1. 并行通信
![image-20240926082752190](./img/image-20240926082752190.png)
优势:
1. 一次传输1个字节
2. 速度快;
3. 信息表达相对简单;
劣势:
1. 只适合短距离传输;
2. 成本高。
问题:那些地方采用并行通信?
### 1.1.2. 串行通信
![image-20240926083220154](./img/image-20240926083220154.png)
优势:
1. 适合长距离传输;
2. 成本低;
劣势:
1. 速度相对较慢;
2. 信息表达(通信控制)相对复杂;
问题:
1. 那些设备是串行通信?
2. 是否可以结合串行和并行的优势?如何结合?
## 1.2. 串行通信的基本概念
### 1.2.1. 同步和异步
![image-20240926105411531](./img/image-20240926105411531.png)
1. 通信双方需要专门又时钟线来同步双方的时钟,并保持严格一致;
2. 通信速度相对较高;
3. 如 SPI、I2C通信
![image-20240926105432567](./img/image-20240926105432567.png)
1. 不需要时钟同步;
2. 通信双方对时间的理解差异可以有少量的偏差;
3. 每通信一帧固定数量的bit位会进行一次同步如上图的START和STOP电平
4. 例如USB、UART串口
### 1.2.2. 异步串行通信的特点
![image-20240926110126910](./img/image-20240926110126910.png)
1. 以固定的长度传输一组数据对于串口来说一帧一般是一个字符注意不是字节以前一个字符是7个位现在几乎都是8个位和字节是对应的
2. 通过帧之间的间隔来进行时间的同步;
3. 如果通信双方对时间的理解差异较小那就可以在一帧的时间片内检查到有效数量的0和1的序列这样不需要通信双方对时间的理解完全一致因为在一帧内的时间差异几乎可以忽略。
**字符格式:**
![image-20240926110639835](./img/image-20240926110639835.png)
一般由起始位、数据位、校验位、停止位组成。对于连续的通信来说,停止也就是起始,因此往往设置停止就可以了。
1. 空闲情况下,通信线路的电平为高;
2. 当需要传输数据的时候,发送方把电位拉低,持续一段时间(开始位);
3. 然后连续发送一个字符和校验位;
4. 最后拉高电平至少持续一段时间(停止位),表示该帧数据发送完成;
从上述的通信过程得知,空闲(不传输数据)为高电平;一旦低电平后,表示通信开始;字符传输完成后,拉高电平;因此起始其实是可以不要的。
![alt text](img/uart1.drawio.png)
奇偶校验:
奇校验如果数据中1的个数为奇数则奇校验位0否则为1。
偶校验如果数据中1的个数为偶数则偶校验位0否则为1。
![image-20240926114933398](./img/image-20240926114933398.png)
**波特率:**
波特率是每秒传输位的单位bps波特率越高表示通信速率越快。注意在任何通信场景中通信速率的都应该用bps表示例如100M的以太网表示 100Mbps也就是每秒大约传输10M字节本来应该是100M/8但是可能有停止位和校验因此大约估算是100M/10
### 1.2.3. 异步串口通信的数据接收过程
![image-20240926115059698](./img/image-20240926115059698.png)
我们假设采样时钟是波特率的16倍,具体的数据接收过程如下:
1. 接收过程由起始位的下降沿启动。
2. 接收端等待8个时钟周期以便建立一个接近起始位周期中点的采样点。
3. 接收端再次等待 16个时钟周期使其进入第一个数据位周期的中点。
4. 第一个数据位被采样并存储在接收寄存器中。
5. 串口模块在采样第二个数据位之前等待另外16个时钟周期。
6. 重复此过程,直到所有的数据位都被采样和存储。
7. 由停止位的上升沿使数据线返回到空闲状态。
### 1.2.4. 串行通信的传输方向
![image-20240926120728340](./img/image-20240926120728340.png)
## 1.3. STM32串口通信
![image-20240926120759519](./img/image-20240926120759519.png)
**数据寄存器:**
1. TDR 发送寄存器结合发送位移寄存器把数据以电平的方式用时间进行排序发送到TX引脚
2. RDR 接收寄存器通过接收位移寄存器组成的一个字符装载到RDR
**通信状态标志位:**
![image-20240926163850067](./img/image-20240926163850067.png)
轮询方式可以通过读取上述的状态来进行控制:
1. RXNE表示有新的数据字符
2. TXE表示可以向TDR写入新的数据
3. TC发送完成
中断方式也会有对应的三种方式。
## 1.4. 硬件结构
串口通信的示意图是这样的:
![alt text](img/uart2.drawio.png)
但是目前的很多计算机没有串口因此在开发板上有一个USB转串口的芯片
![image-20240926165734028](./img/image-20240926165734028.png)
因此实际的情况是这样:
![alt text](img/uart3.drawio.png)
这个芯片在开发板的位置是:
![image-20240926170851906](./img/image-20240926170851906.png)
# 2. HAL库外设初始化过程