串口协议-I2C-I2S-UART-SPI

1.总结

协议 UART异步串行收发器 SPI I2C I2S
总线 RX、TX、GND CS、CLK、MOSI、MISO VCC、GND、SCL、SDA
同/异步 异步 同步 同步
全/半双工 全双工 全双工 半双工 全双工/半双工
传输速度
应用场景 板内/间 板内(不同芯片之间) 板内
模式 一对一 一对多 一对多/多对多 一对一
一主多从实现 X 各CS 地址
需要的接线 2根 3根单项/4根双向 2根 3根单项/4根双向
接线名称 发送TXD/接受RXD CS/SS片选信号
SCK串行时钟
MOSI/SDO主出从入
MISO/SDI主入从出 SCL串行时钟/SDL串行数据 SCK串行时钟
WS声道选择模式
SD串行数据

1.全双工和半双工

1.全双工(Full Duplex)

  是指在发送数据的同时也能够接收数据,两者同步进行。而全双工一条数据线用作发送数据,一条数据线用作接收数据,是双向的。

2.半双工(Half Duplex)

  所谓半双工是指一段时间内,只有一种动作发生,发或者收。半双工只有一条数据线,既要用作发送数据,又要用作接收数据,是单向的。

2.同步和异步

1.对比表

图片说明

2.同步与异步传输的区别

  1. 异步传输是面向字符的传输,而同步传输是面向比特的传输。
  2. 异步传输的单位是字符而同步传输的单位是桢。(比特)
  3. 异步传输通过字符起止的开始和停止码抓住再同步的机会,而同步传输则是以数据中抽取同步信息。(不理解)
  4. 异步传输对时序的要求较低,同步传输往往通过特定的时钟线路协调时序。
  5. 字节与字节之间,同步发送数据是不留间隙的,而异步发送数据可以间隙任意。
  6. 同步通信效率高,异步通信效率较低。
  7. 同步通信可用于多点对多点,异步通信只适用于点对点。

3.串行和并行

1.串行

  一个字节的数据,排成一行发送给接收设备。

2.并行

  一个字节的数据,排成一列发送给接收设备。那当然并行速率快、吞吐量大、不过消耗IO资源也很多。

3.串行和并行之间的区别

  1. 数据传送方式不同:串行口传输方式为数据排成一行、一位一位送出数据;并行口传输8位数据一次送出。
  2. 针脚不同:串行口针脚少,消耗IO资源少;并行口针脚多,消耗IO资源多。
  3. 用途不同:串行口主要用在速度要求不高、有一定距离的传输场景,如UART,I2C通信。并行口多用于传输速率要求高、吞吐量大的场景,如FSMC(Flexible Static Memory Controller,可变静态存储控制器),DVP(Digital Video Port,数字视频接口)等接口。

2.UART(异步串行收发器)/USART(同步/异步串行收发器)

  因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。如果要解决这个问题,UART为每个字节添加额外的起始位和停止位,以帮助接收器在数据到达时进行同步;双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600位)。将数据一位一位的进行传输发送和接收各用一条线,因此通过UART 接口与外界相连最少只需要三条线:TXD(发送)、RXD(接收)和GND(地线)。先发送最低位最后发送最高位。

波特率:波特率就是UART 数据传输的速率,也就是每秒传输的数据位数,一般选择9600、19200、115200 等。波特率越大,传输速度越快,但稳定的传输距离越短,抗干扰能力越差。
优点: 通信距离远。
缺点: 速度慢。
图片说明
  串口具体发送数据:
图片说明
  首先发送的数据是0x53,串口协议通常会首先发送最低有效位,因此最小位在最左边LSB。低四位字节实际上是0011 = 0x03,高四位字节是0101 = 0x05。如果您注意到上图中的11001010不等于0x53,这是一个细节。

1.RS232

  3线制(RXD、TXD、GND)、全双工、点对点通讯(因点对点通讯方式而无法联网,导致出现RS485),RS232是异步传输接口,即电脑上的COM口,有9个引脚(DB-9)或者是25个引脚(DB-25)的型态出现。RS232-C标准规定的数据传输速率为50、75、100、150、300、600、1200、2400、4800、9600、19200、38400波特。

2.RS485

  RS485对RS232进行改进主要解决了不能进行多台设备同时进行联网管理的缺点。增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围。

1.引脚编号

图片说明

2.其中DTR/DSR和RTS/CTS用于硬件流控

  DTR/DSR状态表明DTE和DCE处于可用状态,有时候设备上电这两个信号即有效,表示设备本身可用使用,但要开始进行数据传输通讯,则需要RTS/CTS流控信号。
  RTS即DTE发送数据时,该信号有效(ON),向DCE请求发送数据;CTS是对请求发送RTS信号的响应,当DCE已经准备好接收数据时,该信号有效(ON),通知DTE可用使用TXD发送数据了。
  RTS即Request to Send,请求发送。
比如A向B发送数据简单如下逻辑:

  1. A先设置RTS为1,表示要发数据给B
  2. B检测到RTS为1,先看看自己是否准备好:
    1. 如果准备好,就设置CTS为1表示A可用发数据给B了
    2. 如果没有准备好,继续处理自己的数据。弄完了,再将CTS设置为1,让A发数据
  3. A发现CTS置1了,将数据通过TXD信号线发送出去
  4. A每发送一次数据给B之前,都会继续上面的逻辑
  5. A发送完数据后,就将RTS置0,表示数据发送完毕。

3.硬件连接方式

图片说明

3.RS232和RS485区别

1.基本区别

  1. 通讯距离
      RS232口最大通讯距离是15米,而RS422/485最大通讯距离是1200米。

  2. 所连接设备个数
      RS232只能连接一个设备,而RS485可以连接多个设备。

  3. 这三种端口的定义
      RS232是标准接口,为D形9针头,所连接设备的接口的信号定义是一样的。而RS422/RS485为非标准接口,一般为15针串行接口(也有使用9针接口的),每个设备的引脚定义也不一样。另外还需要说明的是,RS422和RS485也有区别:RS422为4线制,全双工模式;RS485为两线制,半双工模式。

2.特性区别

  1. RS485的电气特性:首先,逻辑性简单,十分容易表示。逻辑“1”表示的就是2到6V的电压值,逻辑“0”表示的就是-2到-6V的电压值。接口方面不易损坏,耐用。并且能与TTL兼容,使用方便,便捷。
  2. RS485的数据最高传输速率为10Mbps。
  3. RS485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,也就是说有很不错的抵御外界干扰的能力。
  4. RS485接口拥有最大的传输长度规定是3900英尺,但是实际上应该能达到 2900M,并且RS232-C接口只能有一个发生器与它连接,这就叫做单站能力。但是RS485接口它可以在总线上与其他一百二十八个发生器相连。这就叫做多站能力,所以说使用者就能够使用一个RS485接口非常简单地建立起设备网络。

3.I2C 协议

  使用两条线在主控制器和从机之间进行数据通信。一条是SCL(串行时钟线),另外一条是SDA(串行数据线),这两条数据线需要接上拉电阻
注释:空闲时候SCL和SDA都是高电平。
I2C支持两种模式:标准模式和快速模式,标准模式下I2C数据传输速率最高是100Kbit/s,在快速模式下的数据传输速率最高位400Kbit/s。

1.I2C的寄存器

1.I2C的地址寄存器

  寄存器I2 CX IADR只有ADR(bit7:1)位有效,用来保存I2C从设备地址数据。当我们要访问某个2C从设备的时候就需要将其设备地址写入到ADR里面。

2.I2C分频寄存器

  寄存器I2 Cx IFDR也只有IC(bits5:0)这个位,用来设置2C的波特率,I2C的时钟源可以选择IPG CLK ROOT-66Hz,通过设置IC位既可以得到想要的I2C波特率。
例如:现在I2C的时钟源为66MHz,我们要设置I2C的波特率为100KHz,那么IC就可以设置为0X15(对应不同的分频倍数),也就是640分频。66000000/640=103.125KHz≈100KHz。

3.I2C控制寄存器

IEN(bit7):I2C使能位,为1的时候使能I2C,为0的时候关闭I2C。
EN(bit6):I2C中断使能位,为1的时候使能I2C中断,为0的时候关闭I2C中断。
MSTA(bit5):主从模式选择位,设置ⅡC工作在主模式还是从模式,为1的时候工作在主模式,为0的时候工作在从模式。
MTX(bit4):传输方向选择位,用来设置是进行发送还是接收,为0的时候是接收,为1的时候是发送。
TXAK(bit3):传输应答位使能,为0的话发送ACK信号,为1的话发送NO ACK信号。
RSTA(bit2):重复开始信号,为1的话产生一个重新开始信号。

4.I2C状态寄存器

2.起始位&停止位

  在SCL 为高电平的时候,SDA (串行数据线)出现下降沿就表示为起始位。在SCL 位高电平的时候,SDA(串行数据线)出现上升沿就表示为停止位。
图片说明

2.数据通信

  数据发送是在SCL的高电平期间,SDA高电平期间数据稳定传输,因此数据变化只能发生在SDA低电平期间。
图片说明
  主机通过I2C 总线与从机之间进行通信不外乎两个操作:写和读
总体流程:
  首先主机发送完8位的地址数据后,会将SDA设置为输入状态。等待从机应答,这时主机要重新发送8位时钟信号给从机使用,最后从机通过将SDA拉低表示进入起始位(开始接受数据)。

1.I2C协议--数据帧和地址帧

1.地址帧
  用于master指明消息发往哪个slave,一个7-bit的地址是从最高位(MSB)开始发送的,这个地址后面会紧跟1-bit的操作符,1表示读操作,0表示写操作。接下来的一个bit是NACK/ACK,当这个帧中前面8bits发送完后,接收端的设备获得SDA控制权,此时接收设备应该在第9个时钟脉冲之前回复一个ACK(将SDA拉低)以表示接收正常,如果接收设备没有将SDA拉低,则说明接收设备可能没有收到数据。
2.数据帧
  由master发往slave的数据(或由slave发往master),每一帧是8-bit的数据,数据帧的数量可以是任意的,直到产生停止条件。每一帧数据传输(即每8-bit)之后,接收方就需要回复一个ACK或NACK(写数据时由slave发送ACK,读数据时由master发送ACK。当master知道自己读完最后一个byte数据时,可发送NACK然后接stop condition)。
  发送方在发完一个字节的数据后,会暂时让出SDA的控制权,目的是让接收方能够通过将SDA置低的方式发送ACK bit,以表明这个字节的数据已被正确接受,这样发送方才可以继续发送接下来的字节。

2.写:(三大步)

  第一步是发送设备地址、第二步是要写入的寄存器地址、第三步是写入寄存器的数据。第一个八位:从机地址位数据。第二个八位:要写入的寄存器地址。后面:通信数据。注意:最后从机会发送ACK信号,表示写入成功。
图片说明
第一部分:

  1. 起始位
  2. 高七位从机地址位,最低位为写数据位;
  3. 写数据位
  4. 从机应答信号ACK
  5. 重新发送起始位
  6. 写入的寄存器地址
  7. 从机应答信号ACK
  8. 8位数据位
  9. 从机应答信号ACK
  10. 结束位

3.读:(四大步)多了一步发送设备地址

  第一步是发送设备地址,最低位为写。第二步是发送要读取的寄存器地址。第三步重新发送设备地址,这时候最低位为读。第四步最后一步就是从寄存器读取数据。注意,最后从机不会发送ACK信号,读的化是主机发送ACK,表示读到数据。当SCL处于高电平时,SDA上的值不应该变化,防止意外产生一个停止条件。
图片说明

4.总结

优点:
  只使用两根电线、一对多、ACK/NACK确认每个帧都成功传输。
缺点:
  数据传输比SPI慢、数据帧的大小限制在8位。
  传输的每个字节为8位,高位在前,低位在后。(SDA是双向数据线,SCL是时钟线SCL。在I2C总线上传送数据,首先送最高位,由主机发出启动信号,SDA在SCL高电平期间由高电平跳变为低电平,然后由主机发送一个字节的数据。数据传送完毕,由主机发出停止信号,SDA在SCL高电平期间由低电平跳变为高电平。)

3.SPI 协议

  SPI是一个同步的数据总线,也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和接收端的完美同步。时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样。数据的采集时机可能是时钟信号的上升沿(从低到高)或下降沿(从高到低)。

1.整体流程

  • 主机先将CS信号拉低,这样保证开始接收数据
  • 当接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1bit);
  • 主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;
  • 主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送;

2.信号线

  是一种高速、全双工的同步通信总线,SPI 时钟频率相比I2C 要高很多,最高可以工作在上百MHz。SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般SPI 需要4 根线:

  1. CS/SS:片选信号线
      选择需要进行通信的从设备
  2. SCK串行时钟(可以来配置模式)
      为SPI提供时钟
  3. MOSI/SDO:主出从入信号线
  4. MISO/SDI:主入从出信号线

3.SPI模式

  设置时钟的极性和时钟相位--SPI 有四种工作模式,通过串行时钟极性(CPOL)和相位(CPHA)的搭配来得到四种工作模式:
①、CPOL=0,串行时钟空闲状态为低电平。
②、CPOL=1,串行时钟空闲状态为高电平,此时可以通过配置时钟相位(CPHA)来选择具
      体的传输协议。
③、CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
④、CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。
图片说明
  CS信号拉低表示选中要通信的设备。注意:数据的传输和X86系统里面的一样是高在左,低在右。

4.多从机模式

1.第一种方法:多CS

  1. 通常,每个从机都需要一条单独的CS线。
  2. 如果要和特定的从机进行通讯,可以将相应的CS信号线拉低,并保持其他NSS信号线的状态为高电平;如果同时将两个CS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接收数据乱码。

2.第二种方法:菊花链

  在设备信号(总线信号或中断信号)以串行的方式从一 个设备依次传到下一个设备,不断循环直到数据到达目标设备。

5.优缺点

1.优点

  SPI通讯的优势使SPI作为串行通信接口脱颖而出的原因很多

  • 全双工串行通信;
  • 高速数据传输速率。
  • 简单的软件配置;
  • 极其灵活的数据传输,不限于8位,它可以是任意大小的字;
  • 非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。

2.缺点

  • 没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
  • 通常仅支持一个主设备;
  • 需要更多的引脚(与I2C不同);
  • 没有定义硬件级别的错误检查协议;
  • 与RS-232和CAN总线相比,只能支持非常短的距离;
#面试##秋招#
武功秘籍--嵌入式 文章被收录于专栏

嵌入式学习笔记 内容设计C语言基础知识、Linux内存管理、操作系统、Linux进程&线程、串口协议、硬件、RAM汇编等 希望秋招的同学早点下车

全部评论
写的很详细,一直不懂i2c和spi
1 回复 分享
发布于 2022-10-22 13:34 陕西
真不错
1 回复 分享
发布于 2022-10-24 14:06 上海
学到了很多
点赞 回复 分享
发布于 2022-11-01 23:44 上海
上次面试就问到了 ,早看到博主就好了
点赞 回复 分享
发布于 2022-11-20 11:02 上海
点赞 回复 分享
发布于 2023-06-13 20:26 广东

相关推荐

一面:项目一1. 简历⾥⾯的两个项⽬哪⼀个你个⼈感觉对自己积累、成长以及技术栈掌握的⽐较好的?2. 这个项⽬,整体有多少⼈参与,你负责哪⼀部分以及对应的软硬件是怎么样的?3. 主站和从站之间是⼀个什么样的拓扑关系?4. 在这个项⽬过程中,你遇到过什么挑战或者难以解决的问题,最后你是怎么解决的?5. 那在这个项⽬做的时候,刚开始两个模块之间那个脉冲信号接收的硬件接⼝应该是没有定义的吧?是没有设置模块之间这样有⼀个接触的吧?后来为了实现从站的⾃我ID识别才加上去的?6. 那你们⼀开始这个从站ID是使用什么方案来确定的?7. 你说这个⽅案是为了让从站能够在不同数量和顺序变化情况下⾃动获取唯⼀ID,如果在实际使⽤当中抽掉⼀个从站或者中间少了⼀个,那它前后之间就没有接触,也就不能传递脉冲信号了,ID号也没办法确定,这个问题怎么解决的?8. 项目里的脉冲传递有没有遇到过那种误触的现象或者干扰信号抖动这类的?如果有,你是怎么解决的?9. 这套系统,主从之间是RS485通信,从站与从站之间会有⼀个串联或者串行的比如IO信号之类的吗?11. 你这个模拟量输⼊模块为什么要用⼀颗独立的ADC?12. 简单说⼀下项目中选用的AD7606芯片和STM32F051里面自带的ADC的差异体现在哪⼉?13. 针对你的项目,ADC需要多⼤的转换速率以及分辨率需要多少位有要求吗?14. 当模拟量转换为数字量之后,主机是怎么知道它已经转换完成?(会有什么信号提示呢?)15. 对于ADC,它转换速率,有没有可能会⽐较⾼,但是你的SPI如果通信速率⽐较慢,以及你MCU主控去采集这个ADC的结果周期间隔比较长的话,那ADC的转换速率可能限制并不在它自身,而是在于你这个系统的读取时间?16. SPI你是怎么配置的?它速率配置多少?然后有没有⽤中断或者是DMA这些功能。17. SPI的通讯速率⼤概能到什么样⼀个范围?18. SPI是用DMA去读的吗?19. ADC数据采集你在软件上是怎么去做的?20. DAC:GP8301的相关参数?21. 如何输出模拟量?项目二:1. 你对RT-Thread这个操作系统有什么了解或者说⻅解?2. 这个项目为什么要考虑上操作系统?3. 这个系统的API移植都有了解吗?4. 系统要跑起来的话,你需要去在移植过程当中,着重去实现哪些东西?5. 创建⼀个任务,需要配置哪些参数?6. 你创建⼀个任务的时候为什么要去给他分配堆栈大小?为什么7. 任务调度过程当中,CPU在做什么?8. 简单讲⼀下从当前任务切换到下⼀个任务的过程。9. 你在移植RT-Thread提供的IIC驱动时,为了防止出现防止多个任务或线程同时访问同⼀个I2C总线的问题,你通过禁用中断的方式来保护I2C传输,那么关闭中断需要特殊去考虑⼀些什么因素吗?单片机:1. STM32F051和STM32F103有什么区别?2. ARM Cortex-M0内核和ARM Cortex-M3内核有什么差异?3. MCU,它除了内核之外,还有⼀些常用的寄存器,能简单说⼀说吗?4. 中断发⽣及处理的整个过程是什么?5. 处理器怎么查找中断向量表6. 你在实际开发中数组和指针的相互使⽤有没有什么特别的使用体验或者说遇到过什么问题,可以举例说明?二面:主要以综合面试为主,大部分都是底层相关的问题和平常开发中的遇到的一些bug怎么解决的。
查看35道真题和解析
点赞 评论 收藏
分享
某家大公司 项目经理 基础工资在1w左右,另一个是月8k包吃住
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-05 16:27
京东物流 KA项目经理/大客户销售 20W 本科211
点赞 评论 收藏
分享
评论
17
115
分享
牛客网
牛客企业服务