嵌入式面试八股文(八)·单工、半双工、全双工的区别以及常用通讯接口简介

目录

1.  单工、半双工、全双工的区别

2.  同步时钟和异步时钟的区别

3.  常用通讯接口

3.1  USART

3.1.1  硬件电路

3.1.2  参数以及时序

3.2  IIC通讯

3.2.1  硬件电路

3.2.2  时序

3.3  SPI

3.3.1  硬件电路

3.3.2  时序

3.4  CAN总线

3.4.1  硬件电路

3.4.2  时序


1.  单工、半双工、全双工的区别

单工:数据传输仅能沿一个方向,不能实现反向传输,只有一条通信路线:

半双工:数据传输可以沿两个方向,但需要分时进行,也只有一条通信线路:

全双工:数据可以同时进行双向传输,具有两条通信线路:

2.  同步时钟和异步时钟的区别

同步时钟:指的是在执行操作时,各个参与者(如线程、设备或系统)在同一时刻进行协调。所有的操作都需要在一个共同的时序框架下进行。

特点:阻塞:在同步操作中,执行者会等待某个操作完成后再继续执行后续操作。

           高精度:由于所有操作都在相同的时间基准下进行,时序控制更为精确。

           适用场景:适合对时延要求较高的场景,如实时系统、数据传输等。


异步时钟:步指的是操作之间没有强制的时间协调,各个参与者可以独立地进行操作,不必等待其他操作完成。

特点:非阻塞:在异步操作中,执行者可以继续进行其他任务,而不必等待某个操作的完成。

           灵活性:各个操作可以独立执行,适合处理不确定的延迟或资源访问。

           适用场景:常用于网络通信、用户界面交互、事件驱动编程等。

3.  常用通讯接口

        通信目的:将一个设备的数据传送到另一个设备,扩展硬件系统。

        通信协议:指定通信的规则,通信双方按照协议规则进行数据收发。

名称引脚双工时钟电平设备
USARTTX、RX全双工异步单端点对点
IICSCL、SDA半双工同步单端多设备
SPISCLK、MOSI、MISO、CS全双工同步单端多设备
CANCAN_H、CAN_L半双工异步差分多设备
USBDP、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或+5V0V
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总线数据帧格式详细介绍-优快云博客

千题千解·嵌入式工程师八股文详解_时光の尘的博客-优快云博客

### 全双工半双工通信模式的区别作原理 #### 定义差异 全双工半双工指的是数据传输的方式。在全双工模式下,设备可以在同一时间既发送又接收数据[^2]。这意味着双向的数据流可以同时进行而不会互相干扰。 相比之下,在半双工模式中,虽然能够在两个方向上传输信息,但在任意时刻只允许向传送,即要么发送要么接收,不能同时执行这两个操作[^3]。 #### 作机制对比 对于采用全双工模式的网络接口卡(NIC),其设计使得输入输出路径相互独立,因此能实现真正的并行处理——一边读取来自远程站点的信息包,另一边则可立即回应确认消息或其他类型的响应帧[^1]。 而在半双工环境中,则依赖某种形式的时间分割或多路访问控制协议来协调不同节点之间的交替通讯行为。例如CSMA/CD (Carrier Sense Multiple Access with Collision Detection),它用于检测冲突并通过退避算法解决潜在的竞争状况。 #### 实际应用场景 现代大多数局域网(LAN)硬件如交换机普遍支持全双工功能,因为这样可以获得更低延迟以及更高的吞吐性能,尤其适合实时性强的应用场景比如视频会议、在线游戏等。 然而某些特定场合可能还会遇到仅限于半双工作的旧式装置或是成本敏感型部署方案;另外无线信道由于物理特性通常默认为半双工状态除非特别配置成更复杂的MIMO架构。 ```python # Python伪代码展示两种模式下的并发情况模拟 import threading def full_duplex_communication(): send_thread = threading.Thread(target=send_data) receive_thread = threading.Thread(target=receive_data) send_thread.start() receive_thread.start() send_thread.join() receive_thread.join() def half_duplex_communication(direction='send'): if direction == 'send': send_data() elif direction == 'receive': receive_data() def send_data(): print("Sending data") def receive_data(): print("Receiving data") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光の尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值