SPI 读取不同长度 寄存器_几种常用的总线设计:UART/SPI/I2C

4333f8e06656252e9167a6ad7339ff5d.png

一只可以爬行、跳舞、避障,并且可以手机遥控的机器蜘蛛是怎么做到的呢?下面这张图给出了这个机器人系统的组成。

0961ecabce4c84b050e23eed84bb9b21.png
六足机器人https://www.zhihu.com/video/1112389717064151040

ccee766de1eb4fc0fce453c6d1687f34.png

树莓派作为控制核心,实现算法处理和指令发送,FPGA内部实现PWM发生器,驱动18路舵机动作。要想让树莓派和FPGA协调工作,两者之间的通信就显得尤为重要。

计算机系统发展至今,虽然数据通信总线也在不断的更新换代,速度带宽不断提升,但是有一些总线,尤其是一些串行总线SPI/I2C/UART等至今仍然是应用的主流。

在这个六足机器人系统中,树莓派和FPGA之间就使用的串行总线通信,对于MCU来说SPI/I2C/UART等串行总线是标配,我们只需要在软件中配置一下寄存器就可以工作了,但是对于FPGA来说,如何实现这些总线呢?

UART(通用异步接收/发送)是一种计算机硬件设备,它在计算机中的字符之间转换数据,以及在起始位和停止位之间封装这些字符的异步串行通信格式, 其中数据格式和传输速度是可配置的。

在UART通信中,两个UART可直接相互通信。 发送UART将来自CPU等控制设备的并行数据转换为串行格式,并将其串行发送到接收端的UART,接收UART将串行数据转换回接收设备的并行数据。 在两个UART之间传输数据只需要两根线, 数据流从发送UART的Tx引脚到接收UART的Rx引脚。

本质上,UART充当并行和串行接口之间的中介。 UART的一端是八条左右数据线(加上一些控制引脚),另一条是两条串行线 - RX和TX。

两个设备可以发送和接收数据的串行接口是全双工或半双工。
UART以异步方式发送数据,也就是说没有时钟信号将发送UART的位输出与接收UART的位采样进行同步。 发送UART将“起始”和“停止”位添加到正在传输的数据包中, 这些位定义了数据包的开始和结束,接收UART基于这些位的信息知道何时开始读取输入的串行数据。

当接收UART检测到起始位时,它以特定的频率(也就是“波特率”)读取输入的串行数据。波特率是数据传输速度的度量,单位-每秒位数(bps)。 两个UART必须以相同的波特率运行。发送和接收UART之间的波特率相差不能超过10%,偏差太远就无法对数据进行正确的解读。两个UART还必须配置为发送和接收相同的数据包结构。

实际应用中的信号传输方式

将两个UART的设备进行连接有多种方式,取决于具体的应用场景,在这里我们仅看两种:TTL UARTRS-232
TTL UART:当微控制器和其它器件进行串行通信时,通常以TTL电平进行通信。 TTL串行信号存在于微控制器的电源电压范围内 - 通常为0V至3.3V或5V。 VCC电平(3.3V,5V等)的信号表示空闲线,值1或停止位。 0V(GND)信号表示起始位或值为0的数据位。

RS-232 UART:可以在一些更古老的计算机和外围设备上找到,就像TTL串口翻转一样。 RS-232信号通常介于-13V和13V之间,但规格允许从+/- 3V到+/- 25V。 在这些信号上,低电压(-5V,-13V等)表示空闲线,停止位或值为1的数据位。一个高的RS-232信号表示起始位或0- 值数据位。 这与TTL系列相反。

SPI是一种用于短距离通信(主要是嵌入式系统中)的同步串行通信接口规范,广泛用于各种MCU处理器中,同传感器,串行ADC、DAC、存储器、SD卡以及LCD等进行数据连接。

4种传输模式:

每次数据传输都是先将SSN被驱动为逻辑低电平时开始。由时钟的极性(CPOL)和相位(CPHA)构成了4种不同的数据传输模式(0,1,2,3),分别对应四种可能的时钟配置。

  • CPOL: 时钟的极性,它控制着时钟信号的初始逻辑状态。
  • CPHA: 时钟相位,它控制了数据转换和时钟转换之间的关系。

813c051ed361e1fdcb8ff291051ca9e3.png

时钟的极性和相位构成了4种不同的可能,也就有4种模式。

71afbc4c9bdc6d54b63b11a64215b3ed.png

在时钟周期的上升沿采样的位在时钟周期的下降沿移出,反之亦然。

具有非反相时钟极性

  • 模式0:配置时钟相位使得数据在时钟脉冲的上升沿采样,并在时钟脉冲的下降沿移出。 这对应于上图中的第一个蓝色时钟轨迹。 请注意,数据必须在时钟的第一个上升沿之前可用。
  • 模式1:配置时钟相位使数据在时钟脉冲的下降沿采样,并在时钟脉冲的上升沿移出。 这对应于上图中的第二个蓝色时钟轨迹。

使用反相时钟极性

  • 模式2:配置时钟相位,使得数据在时钟脉冲的下降沿采样,并在时钟脉冲的上升沿移出。 这对应于上图中的第一个橙色时钟轨迹。 请注意,数据必须在时钟的第一个下降沿之前可用。
  • 模式3:配置时钟相位,使得数据在时钟脉冲的上升沿采样,并在时钟脉冲的下降沿移出。 这对应于上图中的第二个橙色时钟轨迹。

I2C是一种简单地连接多个芯片的总线方式,跟SPI对比,I2C没有天生的主、从之分,也就是说挂在两根线(数据线SDA和时钟线SCL)上的所有器件都是生而平等的。

ba95955c81ca4b35bd7ce7cbf21ace1b.png

I2C总线传输时序

I2C协议概要

以下是I2C的主要特征:

  • 不论总线上挂多少个设备,只需要两根信号线(时钟SCL和数据SDA)就搞定;
  • 两根信号线都通过合适阻值的上拉电阻连接到正电源上;
  • 每个设备的接口都是通过漏极开路(或集电极开路)的输出驱动连接到时钟和数据信号线上;
  • 每个从设备都有一个7位的地址,可供寻址用。主设备必须知道这些从设备的地址以便同指定的一个从设备进行通信;
  • 所有传输均由“主设备”发起和终止;“主设备”可以将数据写入一个或多个“从设备”或从“从设备”请求数据;
  • 在系统中“主”和“从”不是固定的,任何一个设备都可以作为“主”或“从”,只要它配置了适当的硬件或固件,实际上在嵌入式系统中最常采用的架构就是一个“主设备”向多个“从设备”发送命令或由多个“从设备”采集数据;
  • 数据信号在时钟的下降沿更新,并在上升沿被采样,如下图;

2cefd1c08534e86b161761e4bf2be9a8.png

I2C协议中数据和时钟的时序关系

  • 数据是以一个字节进行传输的,每一个字节跟着1位的握手信号,作为ACK/NACK(应答/无应答)位。

I2C有何优势?

  • 管脚/信号数量少,即便挂了很多的设备,也只用两根线;
  • 可适应不同的从设备的要求;
  • 可支持多个主设备;
  • 引入ACK/NACK功能以提升应对错误的能力。

有何劣势?

  • 增加了固件和底层硬件的复杂度
  • 增加了协议的负荷,降低了数据传输的吞吐率
  • 需要上拉电阻

由此可以看到I2C比较适合复杂、多样化、需要通信设备灵活扩展的场景;UART比较适合单点对单点的连接,因为UART没有标准的方式来寻址不同的设备或共享管脚。SPI比较适合系统中有一个主设备和少量的从设备,而且每一个从设备都有一个单独的“从设备选择”信号,当总线上有多个设备的时候会需要更多的管脚,布线的难度也会增加,当你需要支持多个主设备的时候,SPI用起来也会非常尴尬。

如果你需要较高的传输速率,使用I2C就不太合适,SPI能够支持更高的时钟频率,数据负载开销也最小。如果你想使用FPGA从头设计串行数据传输,SPI和UART的底层硬件设计要简单得多,迫不得已再用I2C。

好了,今天的分享到这就告一段落啦!其他更多内容请扫码下方关注本堂课教学!

8372ec1e8df9cc23a2f981a31bae2a9c.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值