目录
1. 单工、半双工、全双工的区别
单工:数据传输仅能沿一个方向,不能实现反向传输,只有一条通信路线:
半双工:数据传输可以沿两个方向,但需要分时进行,也只有一条通信线路:
全双工:数据可以同时进行双向传输,具有两条通信线路:
2. 同步时钟和异步时钟的区别
同步时钟:指的是在执行操作时,各个参与者(如线程、设备或系统)在同一时刻进行协调。所有的操作都需要在一个共同的时序框架下进行。
特点:阻塞:在同步操作中,执行者会等待某个操作完成后再继续执行后续操作。
高精度:由于所有操作都在相同的时间基准下进行,时序控制更为精确。
适用场景:适合对时延要求较高的场景,如实时系统、数据传输等。
异步时钟:步指的是操作之间没有强制的时间协调,各个参与者可以独立地进行操作,不必等待其他操作完成。
特点:非阻塞:在异步操作中,执行者可以继续进行其他任务,而不必等待某个操作的完成。
灵活性:各个操作可以独立执行,适合处理不确定的延迟或资源访问。
适用场景:常用于网络通信、用户界面交互、事件驱动编程等。
3. 常用通讯接口
通信目的:将一个设备的数据传送到另一个设备,扩展硬件系统。
通信协议:指定通信的规则,通信双方按照协议规则进行数据收发。
名称 | 引脚 | 双工 | 时钟 | 电平 | 设备 |
USART | TX、RX | 全双工 | 异步 | 单端 | 点对点 |
IIC | SCL、SDA | 半双工 | 同步 | 单端 | 多设备 |
SPI | SCLK、MOSI、MISO、CS | 全双工 | 同步 | 单端 | 多设备 |
CAN | CAN_H、CAN_L | 半双工 | 异步 | 差分 | 多设备 |
USB | DP、DM | 半双工 | 异步 | 差分 | 点对点 |
3.1 USART
串口是一种应用十分广泛的通讯接口,串口成本低,容易使用,通讯线路简单,可实现两个设备的互相通信。USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里。
3.1.1 硬件电路
TX与RX要交叉连接:
注意:当只需单向的数据传输时,可以只接一根通信线
例如,设备1只发送,设备2只接受,只需要共地后,将设备1的TX连接到设备2的RX引脚上即可。
当电平标准不一致时,需要加电平转换芯片,串口常用的电平标准有如下三种:
电平 | 数据1 | 数据0 |
TTL电平 | +3.3V或+5V | 0V |
RS232电平 | -3~-15V | +3~+15V |
RS485电平 | 两线压差+2~+6V | 两线压差-2~-6V |
电平标准是数据1和数据0的表达式,是传输线缆中人为规定的电压与数据的对应关系。
3.1.2 参数以及时序
波特率:串口通信的速率( 常用的波特率:9600、 19200、 38400、 57600和115200)
起始位:标志一个数据帧的开始,固定为低电平
数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
校验位:用于数据验证,根据数据位计算得来
停止位:用于数据帧间隔,固定为高电平
3.2 IIC通讯
I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线,支持总线挂载多设备(一主多从、多主多从)。
3.2.1 硬件电路
所有I2C设备的SCL连在一起,SDA连在一起,每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
设备的SCL和SDA均要配置成开漏输出模式。
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
3.2.2 时序
起始条件:SCL高电平期间,SDA从高电平切换到低电平。
终止条件:SCL高电平期间,SDA从低电平切换到高电平。
发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。
接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答。
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)。
3.3 SPI
SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线。
四根通信线:SCK(Serial Clock)时钟信号线,用于通讯数据同步。
MOSI(Master Output Slave Input)主设备输出/从设备输入引脚。
MISO(Master Input Slave Output)主设备输入/从设备输出引脚。
SS(Slave Select)从设备选择信号线,常称为片选信号线。
支持总线挂载多设备(一主多从)。
3.3.1 硬件电路
所有SPI设备的SCK、MOSI、MISO分别连在一起,主机另外引出多条SS控制线,分别接到各从机的SS引脚。
3.3.2 时序
起始条件:SS从高电平切换到低电平。
终止条件:SS从低电平切换到高电平。
模式0:CPOL=0:空闲状态时,SCK为低电平
CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
模式1:CPOL=0:空闲状态时,SCK为低电平
CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
模式2:CPOL=1:空闲状态时,SCK为高电平
CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
模式3:CPOL=1:空闲状态时,SCK为高电平
CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
3.4 CAN总线
3.4.1 硬件电路
STM32内置bxCAN外设(CAN控制器),支持CAN2.0A和2.0B,可以自动发送CAN报文和按照过滤器自动接收指定CAN报文,程序只需处理报文数据而无需关注总线的电平细节。
这里的每个CAN结点都挂载在CAN总线上,对于其中的一个CAN结点,他们是由控制芯片MCU、CAN控制器以及CAN收发器组成,一般情况下CAN控制器都集成在MCU里面,STM32就集成了CAN控制器,STM32引出了CAN_Rx和CAN_Tx引脚,与CAN收发器相连,CAN收发器通过引出的CAN_H和CAN_L与CAN总线相连:
CAN总线采用差分信号,即两线电压差(-)CAN_H-CAN_L传输数据位,CAN总线的信号分为高速和低速两种:
对于高速CAN规定:压差为0V时表示逻辑1(隐性电平)
电压差为2V时表示逻辑0(显性电平)
对于这里的显隐性对应的逻辑状态可能会有人不解,因为通常情况下,我们应该显性对应1,隐性对应0,但是这里为什么反着来了呢?
这里主要是因为显性和隐性所表示的是总线的收紧状态,前面我们了解到CAN总线的默认状态是CAN_L和CAN_H两条总线收紧状态,不需要设备干预所以是隐性电平,又知道总线收紧时其所对应的电平状态为逻辑电平“1”,而总线张开,需要设备干预所以为显性电平,又知道总线张开时所对应的逻辑电平“0”,因此会出现隐性电平和逻辑“1”绑定,显性电平和逻辑“0”绑定。
简单点来说,显性电平和隐性电平表示的是总线的状态,而定义“0”和“1”是为了和电路约定俗成的规则相对应。
对于低速CAN规定:电压差为-1.5V时表示逻辑1(隐性电平)
电压差为3V时表示逻辑0(显性电平)
3.4.2 时序
CAN数据帧由 7 个不同的位场组成:帧起始、仲裁场、控制场、数据场、CRC 场、应答场、帧结尾。数据场的长度可以为 0。
这里内容过多可以参考:CAN总线数据帧格式详细介绍-优快云博客