嵌入式软开基础-通信协议篇
嵌入式软开对硬件要求较低,重点会考察通信协议,如果你项目中有涉及的话,更要仔细看,面试通常会问:介绍一下i2c、uart协议?然后根据你的回答以及项目继续提问。
1、I2C协议
什么是I2C协议?
I2C协议是一种用于在数字电路中进行短距离串行数据通信的协议,同步通信协议,它允许多个设备在同一总线上进行通信,并使用两根主要的信号线,即数据线(SDA)和时钟线(SCL)。当主设备需要通信时,将目标设备地址写在总线上,如果某个设备符合,回应一个ACK,建立传输。
I2C总线有哪些重要的信号线?
I2C总线有两个重要的信号线:
SDA:负责传输数据。
SCL:提供时钟信号,同步数据传输。
I2C的时序:
主设备SCL为高电平时,SDA从高电平切换到低电平,表明传输开始;主设备发送目标设备的7位地址(有时是10位地址,根据需要),最低位用1、0表示读或写;接收设备在成功接收地址后发送应答位(ACK),拉低SDA电平来发送ACK,之后进行数据传输;通信结束时,主设备SCL为高电平时,SDA从低电平切换到高电平。
I2C主机如何启动和停止通信?
启动通信:主设备将SCL保持高电平的同时,将SDA从高电平拉低,形成起始信号。
停止通信:主设备将SCL保持高电平的同时,将SDA从低电平拉到高电平,形成停止信号。
I2C的时钟频率是如何确定的?
I2C的时钟频率由主设备控制,通常可以设置为标准速度(100 kHz)、快速速度(400 kHz)或高速速度(3.4 MHz)。时钟频率的选择取决于总线上的设备支持以及通信所需的速度。
I2C的地址是如何工作的?
I2C地址通常是7位或10位。7位地址用于标准I2C通信,而10位地址用于高速模式或扩展寻址。主设备在启动通信时发送目标从设备的地址,并指定读取还是写入操作。
I2C如何处理冲突和仲裁?
当两个或多个设备同时尝试在总线上发送数据时,可能会发生冲突。I2C使用仲裁机制,其中设备会检测冲突并停止发送数据,然后等待总线变得空闲。设备在等待一小段时间后重新尝试发送。
I2C与SPI的区别是什么?
I2C使用两根信号线(SDA和SCL),而SPI通常使用多根信号线(时钟、数据输入、数据输出、片选等)。
I2C支持多设备共享总线,SPI通常需要为每个设备分配片选线。
2、SPI协议
SPI协议是什么?
SPI是一种同步的串行通信协议,它定义了一组规则,使得多个设备可以在主设备的控制下进行全双工的通信。
SPI的基本特性是什么?
SPI通信包括四个信号线:SCLK(时钟线)、MOSI(主设备发送数据到从设备的数据线)、MISO(从设备发送数据到主设备的数据线)、SS/CS(片选/片使能,当有多个从设备的时候,主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高)。
SPI 通信过程?
注意:MOSI是主发从收、MISO是从发主收,看图:
SPI的工作模式
根据CPOL和CPHA可分为四种模式:
模式 | CPOL | CPHA |
Mode 0 | 0 | 0 |
Mode 1 | 0 | 1 |
Mode 2 | 1 | 0 |
Mode 3 | 1 | 1 |
CPOL:时钟极性,表示SPI总线空闲时,时钟信号是高电平还是低电平,CPOL=1为高电平,反之低电平。
CPHA:时钟相位,决定SPI总线从一个时钟周期的哪一个边沿开始采样,CPHA=0时,从第一个边沿采样,反之从第二个边沿。
与I2C的传输速率比较?
SPI通信的速率比I2C通信的速率高,因为I2C通信涉及到仲裁机制。
3、UART协议
什么是UART通信?
UART通信是一种串行数据通信协议,通常用于将数据从一个设备传输到另一个设备。UART通信是一种异步通信协议,其中数据以字节为单位传输,并使用两根主要的信号线,即TX(发送)和RX(接收)线。
UART通信中有哪两根主要的信号线?
UART通信中有两根主要的信号线:
TX(发送)线:用于主机将数据发送到从机。
RX(接收)线:用于从机接收来自主机的数据。
波特率
- 什么是波特率
波特率是衡量UART通信速度的单位,表示每秒传送的码元的个数,它决定了数据传输速度。
波特率 = 码元个数 / 时间
- 码元是什么
在数字通信中常用时间间隔相同的符号来表示一个二进制数字,这样的时间间隔内的信号称为(二进制)码元。码元的离散状态有大于2个时(如M大于2个) 时,此时码元为M进制码元。
如果深入一点会问比特率?
- 什么是比特率?
比特率表示每秒钟传输多少比特,单位为比特每秒(bit/s)。
比特率 = 比特个数 / 时间
- 波特率和比特率的关系?
举个例子,A要向B发送信息:0011
二进制码元:码元有2个状态,码元0表示0,码元1表示1,传输完0011需要发送四个码元,此时1个码元携带1个比特的信息,比特率就等于波特率。
四进制码元:码元有4个状态,参考格雷码,约定用码元0表示00组合,用码元1表示01组合,用码元2表示11组合,用3表示10组合,传输完0011需要发送码元0和码元2,此时1个码元携带2个比特的信息,比特率 = 2 * 波特率。
假设码元状态为N,则此码元携带的比特个数:
UART的数据帧包含哪些?
数据位:表示每个UART数据帧中的数据位数,通常为8位。
停止位:表示每个数据帧后的停止位数,通常为1或2位。
校验位:可选,用于检测和纠正数据传输中的错误。
解释一下校验位?
通常回答奇偶校验
用一个值确保传输数据中逻辑高位(“1”)的总数是奇数个或者偶数个。
举个例子,假设我们在UART通信中发送一个8位数据字节,其二进制表示为 10110110。
在偶校验模式下,校验位要保证数据中“1”的总数是偶数,校验位为1;在奇校验模式下,校验位要保证数据中“1”的总数是奇数,校验位为0;
UART通信时序
UART是将数据一位一位的传输,起始发出一个为0的信号,表述传输开始;然后开始传输数据;之后是一个奇偶校验位,这个是可选的;最后就是停止位,这是一个高电平。
UART怎么保证数据传输的可靠性?
- 起始位和停止位:每个数据字节之前和之后都有起始位和停止位,这有助于接收端能够准确地将数据字节分开。
- 波特率设置:发送端和接收端都必须以相同的波特率进行通信。通过这种方式,接收端能够在正确的时机读取每个位。
- 奇偶校验:如前所述,奇偶校验用于检测数据传输中的错误。通过在数据中添加奇偶校验位,接收端可以验证接收到的数据是否正确。如果校验失败,接收端可以请求重新传输或采取其他纠正错误的措施。
UART与SPI、I2C的区别是什么?
UART是异步通信,而SPI和I2C通常是同步通信。
UART通常用于点对点通信,而SPI和I2C支持多设备通信。
UART通常不需要主从模式,而SPI和I2C有主设备和从设备之分。
UART通信如何处理半双工和全双工通信?
UART可以配置为半双工或全双工通信。在半双工通信中,设备可以交替发送和接收数据,而在全双工通信中,设备可以同时发送和接收数据。
UART通信与并行通信的区别是什么?
UART通信与并行通信不同之处在于数据的传输方式。UART使用一根或多根串行信号线逐位传输数据,而并行通信使用多个并行的信号线同时传输数据位,通常需要更多的物理线路。
串行通信标准RS232和RS485的区别
4、CAN协议
介绍一下CAN?
CAN(Controller Area Network,控制器局域网络)是一种串行通信协议,异步通信协议,具有高度的可靠性、实时性和抗干扰能力。
CAN是怎么通信的?
CAN总线由多个节点组成,每个节点都有唯一的标识符,在CAN总线上,通信是通过两根差分信号线(CAN_H和CAN_L)进行的。
CAN上多个节点同时发消息,怎么办?
当多个节点同时尝试发送消息时,CAN总线上会发生仲裁,以确定哪个节点有权发送,仲裁过程是通过比较标识符来实现的,具有最高优先级的消息会优先发送。
CAN的数据传输格式?
CAN通信使用帧来表示数据的传输单元。CAN帧分为标准帧和扩展帧两种类型。每个CAN帧包含以下部分:
○ 标识符:用于唯一标识消息的发送者和内容。标识符可以是11位(标准帧)或29位(扩展帧)。
○ 控制位:用于控制CAN帧的发送和接收。
○ 数据域:用于携带实际的数据。
○ CRC校验码:用于检测数据传输过程中的错误。
○ 确认位:用于确认消息的接收。
○ 消息结束位:表示消息的结束。标准帧和扩展帧的区别?
can和canfd的区别?
CAN口两种模式?
5、总结
通信协议 | 同步/异步 | 信号线 |
I2C | 同步 | 数据线(SDA)和时钟线(SCL) |
SPI | 同步 | SCLK(时钟线)、MOSI(主设备发送数据到从设备的数据线)、MISO(从设备发送数据到主设备的数据线)、SS/CS(片选/片使能) |
UART | 异步 | TX(发送)和RX(接收)线 |
CAN | 异步 | 两根差分信号线(CAN_H和CAN_L) |
整理高频考点、汇总常见的面试题库、总结面试中的提问 每个知识点尽可能做到「 原理 → 扩展 」