【秋招】嵌入式面试八股文 - ARM 03篇
本文为 第二章 ARM 部分,具体整篇目录可以看前言!
第一部分(纯八股)
2. ARM
2.2 通讯协议:
不同双工通讯:
同步/异步通讯:
时钟线,有时钟线那就是同步通信,否则就是异步通信。
2.2.1 串口通讯协议总结
2.2.1.1 RS232物理层
其中RS-232提高电压后,增加了串口通信的远距离传输能力和抗干扰能力。
2.2.1.2 RS485物理层
RS-485 通讯网络的最大传输距离可达 1200 米,总线上可挂载 128 个通讯节点,而由于 RS-485 网络只有一对差分信号线,它使用差分信号来表达逻辑,当 AB 两线间的电压差为-6V~-2V 时表示逻辑 1,当电压差为 +2V~+6V 表示逻辑 0,在同一时刻只能表达一个信号,所以它的通讯是半双工形式的。
2.2.1.3 串口通讯协议
起始位:为低电平;
停止信号:可由0.5、1、1.5、2个逻辑1的数据位表示
位0~位7:有效数据可被约定为 5—8位长
校验位:奇校验;偶校验
2.2.1.4 波特率
fPLCK为usart时钟,USARTDIV是存放在波特率寄存器中的一个无符号定点数。其中 DIV_Mantissa[11:0]位定义USARTDIV 的整数部分,DIV_Fraction[3:0]位定义USARTDIV 的小数部分
我们知道USART1使用APB2总线时钟,最高可达72MHz,其他USART的最高频率为36MHz。我们选取USART1作为实例讲解,即fPLCK=72MHz。为得到 115200bps 的波特率,此时:
解得USARTDIV=39.0625,可算得 DIV_Fraction=0.0625*16=1=0x01,DIV_Mantissa=39=0x27,即 应该设置 USART_BRR 的值为 0x271。
2.2.1.5 波特率与比特率的区别
波特率是指单位时间内传送二进制数据的位数,单位用bps(位/秒)表示,记作波特。
比如:波特率为9600,则1秒传送9600位,也就是960个字节。
比如在异步串行传输系统中,若字符格式:1位起始位,8位数据位,1个校验位,1个终止位,假设波特率为1200bps。
有效数据位8位,传送一个字符为1+8+1+1=11,比特率为:1200*(8/11)
2.2.2 I2C通讯协议总结
2.2.2.1 物理层
注意:
开漏输出:高电平无驱动能力,需要借助外部上拉输出高电平。
因为I2C协议是支持多个主设备与多个从设备在一条总线上的,此时就会有多个GPIO口连接在同一条总线上,就势必会出现输出高、低电平不统一的情况,如果采用推挽输出时,就可能会出现某个GPIO的Vcc和GND连接在一起造成短路的情况,当你采用开漏输出时,因为有上拉电阻的存在就可以避免这一问题的出现。
总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
SDA线在输入时配置成上下拉输入模式。
数据传送过程中,先传送最高位(MSB),每一个被传送的字节后面都必须跟随着1位应答位(即一帧共有9位长)。
2.2.2.2 协议层
(1) 主机写数据给从机
这些图表示的是主机和从机通讯时,SDA 线的数据包序列。
其中S表示由主机的 I2C 接口产生的传输起始信号(S),这时连接到I2C总线上的所有从机都会接收到这个信号。
起始信号产生后,所有从机就开始等待主机紧接下来广播的从机地址信号(SLAVE_ADDRESS)。
在 I2C 总线上,每个设备的地址都是唯一的,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。
根据 I2C 协议,这个从机地址可以是7位或10位(7位用的更加广泛)。在地址位之后,是传输方向的选择位:
该位为0,主机向从机写数据。
该位为1,主机由从机读数据。
从机接收到匹配的地址后,主机或从机会返回一个应答(ACK)或非应答(NACK)信号,只有接收到应答信号后,主机才能继续发送或接收数据。
注意:
每次读写数据,数据包为8位,即一个字节。
主机向从机写时,主机给从机发送一个字节,从机回复一个应答信号,然后主机再发送一个字节,不断重复这个过程。当数据传输结束时,主机给从机发送停止信号(P)。
主机向从机读时,从机给主机发送一个字节,主机回复一个应答信号,然后从机再发送一个字节,不断重复这个过程。当主机不想接收数据时,主机给从机返回一个非应答信号(NACK)。
(2) 读和写数据:
除了基本的读写,I2C通讯更常用的是复合格式,即第三幅图的情况,该传输过程有两次起始信号(S)。一般在第一次传输中,主机通过SLAVE_ADDRESS寻找到从设备后,发送一段“数据”,这段数据通常用于表示从设备内部的寄存器或存储器地址(注意区分它与 SLAVE_ADDRESS 的区别);在第二次的传输中,对该地址的内容进行读或写。也就是说,第一次通讯是告诉从机读写地址,第二次则是读写的实际内容。
2.2.2.3 通讯信号电路定义:
起始信号/终止信号(一般由主机产生)
起始信号:SCL高,SDA由高变低
终止信号:SCL高,SDA由低变高
数据有效性:
响应信号:
传输时主机产生时钟,在第9个时钟时,数据发送端会释放SDA的控制权,由数据接收端控制SDA,若SDA为高电平,表示非应答信号 (NACK),低电平表示应答信号(ACK)。
2.2.2.4 硬件I2C和软件I2C的区别
2.2.3 SPI通讯协议总结
2.2.3.1 物理层
CS线(NSS线):从设备选择线,也称为片选信号线。哪个NSS线设为低电平,就是选中对应的模块。NSS线为高电平时,为结束信号。
SCK:时钟信号线,用于通讯主机产生,决定了通讯的速率,STM32的SPI时钟频率最大为fPCLK/2,一般通讯过程中,通讯速率受限于低速设备。
MOSI:主机发送,从机接收端口。
MISO:主机接收,从机发送端口。
2.2.3.2 协议层
起始信号:NSS由高变低 停止信号:NSS由低变高
注意:
MOSI与MISO的信号只在NSS为低电平的时候才有效,在SCK的每个时钟周期MOSI和MISO传输一位数据。数据的输入和输出是同时进行的,在SCK下降沿进行数据采样,SPI每次数据传输可以以8位或16位为单位,每次传输单位数不受限制。
2.2.3.3 SPI通讯模式(四种)
四种通讯模式最大的区别:总线空闲时 SCK 的时钟状态以及数据采样时刻。
因此,在此引入“时钟极性CPOL”和“时钟相位CPHA”概念。
2.2.3.4 控制逻辑
主模式收发流程及事件说明如下:
(1) 控制NSS信号线,产生起始信号(图中没有画出);
(2) 把要发送的数据写入到“数据寄存器“DR”中,该数据会被存储到发送缓冲区;
(3) 通讯开始,SCK时钟开始运行。MOSI 把发送缓冲区中的数据一位一位地传输出去;MISO 则把数据一位一位地存储进接收缓冲区中;
(4) 当发送完一帧数据的时候,“状态寄存器 SR”中的“TXE 标志位”会被置 1,表示传输完一 帧,发送缓冲区已空;类似地,当接收完一帧数据的时候,“RXNE 标志位”会被置 1,表示传输完一帧,接收缓冲区非空;
(5) 等待到“TXE 标志位”为 1 时,若还要继续发送数据,则再次往“数据寄存器 DR”写入数据 即可;等待到“RXNE 标志位”为 1 时,通过读取“数据寄存器 DR”可以获取接收缓冲区中的 内容。
假如我们使能了 TXE 或 RXNE 中断,TXE 或 RXNE 置 1 时会产生 SPI 中断信号,进入同一个中断服务函数,到 SPI 中断服务程序后,可通过检查寄存器位来了解是哪一个事件,再分别进行处理。也可以使用 DMA 方式来收发“数据寄存器 DR”中的数据。
2.2.4 CAN通讯协议总结
2.2.4.1 物理层
(1) 闭环网络
CAN 物理层的形式主要有两种,图 CAN 闭环总线通讯网络中的 CAN 通讯网络是一种遵循 ISO11898 标准的高速、短距离“闭环网络”,它的总线最大长度为 40m,通信速度最高为 1Mbps,总线的两端各要求有一个“120欧”的电阻。
(2) 开环网络
图 CAN 开环总线通讯网络 中的是遵循 ISO11519-2 标准的低速、远距离“开环网络”,它的最大传输距离为 1km,最高通讯速率为 125kbps,两根总线是独立的、不形成闭环,要求每根总线上 各串联有一个“2.2千欧”的电阻。
CAN 通讯节点由一个 CAN 控制器及 CAN 收发器组成,控制器与收发器之间通过 CAN_Tx 及 CAN_Rx 信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low 信号线相连。其中 CAN_Tx 及 CAN_Rx 使用普通的类似 TTL 逻辑信号,而 CAN_High 及 CAN_Low 是一对差分信 号线,使用比较特别的差分信号,下一小节再详细说明。
#嵌入式##秋招##校招#我打算把自己整理的八股文笔记、面试经验、项目经验、简历修改经验等等,分享给大家。之前准备找工作那会,很多付费的东西,质量参差不齐,我打算在牛客创建一个免费的专栏,分享整理的这些内容,今天这个是第一篇文章,对于找工作的人提供一份帮助就行。