嵌入式八股I2C,SPI,UART篇
嵌入式八股 收录了 I2C SPI UART CAN PCI等常见通信协议面试遇到的问题
1.基本知识
- 串行与并行
串行: 一根线 数据一位一位的发送
并行: 多个线 数据多个位一次传输过去 - 异步与同步
看有没有时钟线 有时钟线说明是根据时钟信号同步的 否则就是各玩各的 - 全双工与半双工
数据能不能边收边发
2.SPI
-
简介
SPI是 串行 同步 全双工
一共有四条线 SCL MISO MOSI NSS -
SPI的四种模式
- CPOL
CPOL = 0: 时钟空闲时为低电平
CPOL = 1: 时钟空闲时为高电平 - CPHA : 表示采样时刻
CPHA = 0 表示在时钟的第一个跳变沿采样
CPHA = 1 表示在时钟的第二个跳变沿采样
- CPOL
-
通信过程
SPI是边发送边接受的 发送一个字节就会接受一个字节
同时SPI是没有什么起始/终止/校验的 字节流一个个的发送
-
三线SPI
根据实际需求 只保留 MISO 或者 MOSI -
可能遇见的问题
- 主机和丛机的CPOL 和 CPHA设置要完全一致
- 四种模式的选择
- SCK过大 可能丛机内边顶不住了 接收就开始出现问题了
- SPI先发的是高有效位
3.I2C与SMBUS
-
简介
I2C是 串行 同步 半双工 通信 两根线 SCL 和 SDA -
为什么是开漏输出
- I2C支持多个设备在同一条主线上,在不使用开漏不使用推挽输出的前提下,一个输出高 一个输出低可能就短路了;但是开漏不一样 开漏无法输出高 在高阻态的时候你可以看做它根本没连到这个I2C主线上
- 为了实现线与的逻辑: 假设现在I2C总线已经有人在用了 又有一个设备想用了 结果发现SDA已经被拉低了,那此时这个新来的就用不了–"仲裁"机制
-
为什么要加上拉电阻
如果选择了开漏输出但是不加上拉电阻 那对于 SCL 和 SDA两个总线在空闲时的电平状态是不确定的 所以需要上拉电阻
-
通信过程
-
主机与丛机
主机可以控制 SCL和SDA两条线 丛机只能控制SDA并且只能被动的接受
主机和丛机都会有一个地址 -
起始信号
在SCL为高电平时 SDA由高变低 -
停止信号
在SCL为高电平时 SDA由低变高 -
正常数据
在SCL为高电平时 要保持不变 在SCL为低的时候才准备下一位 -
写流程
- 主机发送起始信号 SDA被拉低
- 发送一个字节的数据 前7bit为地址 后1bit表示读/写(0表示写),此时主机放开SDA线 SDA恢复高电平
- 丛机应答 SDA被丛机拉低(一个脉冲周期内得做出回应)
- 主机知道丛机存在 开始发送一个字节数据,丛机在SCL为高的时候读取SDA的电平状态(主机在第9个脉冲放开SDA线的控制)
- 丛机应答, SDA被丛机拉低
- 主机发送停止信号 此时主机丛机都恢复高阻态 SDA变回高

-
读流程
- 主机发送起始信号 SDA被拉低
- 发送一个字节的数据 前7bit为地址 后1bit表示读/写(0表示写),此时主机放开SDA线 SDA恢复高电平
- 丛机应答 SDA被丛机拉低(一个脉冲周期内得做出回应)
- 丛机发送一个字节的数据,此时主机在SCL为高的时候读取SDA电平的状态
- 主机应答
- 主机发送停止信号 此时主机丛机都恢复高阻态 SDA变回高

-
-
SMBUS
SMBUS是I2C的子集
可以参考
https://blog.csdn.net/caiji0169/article/details/142892183
4.UART
-
uart–串行(对于一个字节只能一位一位发送)异步(没有时钟线)全双工(可以边收边发)通信
-
两根线 TX 和 RX线
-
通信帧格式:
起始位/数据位/校验位/停止位 4项 其中校验位不是必须的
-
波特率计算
单位是 bit/s
比如115200 说明传输1bit需要1/115200 s
所以完成一次传输的最少时间 (1 + 8 + 1) / 115200 s(因为起始位和停止位不能省略) -
通信过程
起始位:通过拉高拉低电平告诉接收方准备接收
停止位:告诉对面发完了
校验位:可选
数据位:需要发送的数据
而波特率就决定了 比如接收方在开始之后 每间隔多久就去采样一次电平 -
可能遇见的问题
- 双方对于高/低电平的定义不同所以不能直接相连
- 串口先发的是低位
IIC 和 SPI、串口区别
- 相同:
- 均采用同步,串行
- 均采用 TTL 电平
- 均采用主从方式
- 异:
- IIC 为半双工,SPI和UART为全双工
- IIC 有应答机制,SPI 无
- IIC 的时钟和极性是固定的(空闲时高电平,SCL 为高电平时读取数据),SPI 是可以变化设置的
- 寻址方式不同,IIC 是发送一个字节去寻址,SPI 通过片选位选择
- IIC和SPI都是先发高位 UART是先发低位
5.CAN
这个没用过,参考着整理一下
https://blog.csdn.net/fish_study_csdn/article/details/131113850
https://blog.csdn.net/qq_35057766/article/details/135580884
6.PCI总线
- PCI总线是同步并行半双工(半双工是在特定时刻 要么是主设备->从设备,要么是从设备->主设备,不能同时进行)PCIE是同步串行全双工
- 同一时刻,一个设备只能处于Master或Slave状态,不能同时执行双重角色
- PCI总线由三部分组成: PCI总线 + PCI桥 + PCI设备
- PCI桥式连接PCI总线之间的纽带 所以整个PCI总线是树状的结构
更多推荐



所有评论(0)