SPI通信协议

概念

板卡内不同芯片间通讯最常用的三种串行协议:UART、I2C、SPI。
Serial Peripheral /pə’rɪfərəl/ interface,串行外围设备接口。SPI,是一种高速的,全双工,同步的通信总线。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

特点

1. 四线控制:芯片的管脚上只占用四根线
在这里插入图片描述
• SDO/MOSI:在 Master(主)上面也被称为 Tx-Channel,作为数据的出口,主要用于 SPI 设备发送数据;
• SDI/MISO:在 Master(主)上面也被称为 Rx-Channel,作为数据的入口,主要用于SPI 设备接收数据;
• Leading edge=前一个边沿=第一个边沿,对于开始电压是1,那么就是1变成0的时候,对于开始电压是0,那么就是0变成1的时候;
Trailing edge=后一个边沿=第二个边沿,对于开始电压是1,那么就是0变成1的时候(即在第一次1变成0之后,才可能有后面的0变成1)。
• 片选:CPU 要实现对存储单元的访问,想让它开始工作,首先要选择存储芯片,即进行片选,给它一个信号(高电平或低电平),接收这一信号的引脚就叫片选端。通常表示为CS(chip select)。片选信号则大多是通过高位地址译码后产生的。
片选端要有一个高变低的跳变过程,才会被判别为起始信号。一直保持低会有问题(什么问题暂不清楚)

2. 采用主从模式(Master-Slave) 的控制方式
在这里插入图片描述

两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave)。 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备。
主机通常为FPGA、MCU或DSP等可编程控制器。从机通常为EPROM、Flash,AD/DA,音视频处理芯片等设备。

3. 数据交换(Data Exchanges)
SPI没有读和写的说法,因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。
SPI 设备间的数据传输之所以又被称为数据交换,是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 “发送者(Transmitter)” 或者 “接收者(Receiver)”。在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据(不管主设备好还是从设备),相当于有一个 bit 大小的数据被交换了。
在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样。如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致 SPI 物理模块最终失效。因此,在程序中一般都会在 SPI 传输完数据后,去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的(虽然发送后紧接着的读取是无意义的,但仍然需要从寄存器中读出来)。

4. 与IIC对比
IIC:一次至少连续传输8位数据。SPI:允许1位1位传送;而且可以暂停,因为clk没有跳变的时候,从设备不采集或者传送数据。 缺点:没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据可靠性上有一定的缺陷。
SPI通信并不像UART或者IIC通信那样有专门的通信周期,有专门的通信起始信号,有专门的通信结束信号;因为SPI协议能够通过控制时钟信号线实现,当没有数据交流的时候我们的时钟线要么是保持高电平要么是保持低电平。
• SPI是全双工,而IIC是半双工。
• IIC支持多主机多从机模式,而SPI只能有一个主机。
• 从GPIO占用上来看,IIC占用更少的GPIO,更节省资源。
• SPI的数据位宽更灵活,可以根据需要选择多位数据宽度。
• SPI协议没有响应机制,主机无法得知从机是否接收到所发的数据,如果不采取一些方法的话可能会导致数据丢帧。
• 正是因为没有复杂的响应机制,SPI协议可以做到非常高的速率(上百兆),每一个SCK都可以进行数据的传输,通过引入CRC校验等校验方法,可以即高速传输数据,又能保持数据的准确度。
• IIC通过器件地址来选择从机,从机数量的增加不会导致GPIO的增加,而SPI通过CS选择从机,每增加一个从机就要多占用一个GPIO,当然也可以通过加入译码器来实现多从机控制。
• SPI协议在SCLK边沿进行采样,IIC在SCL高电平器件进行采样。

工作机制

在这里插入图片描述
• SSPBUF:泛指 SPI 设备里面的内部缓冲区,一般在物理上是以 FIFO 的形式,保存传输过程中的临时数据;
• SSPSR:泛指 SPI 设备里面的移位寄存器,它的作用是根据设置好的数据位宽(bit-width) 把数据移入或者移出 SSPBUF;
• Controller:泛指 SPI 设备里面的控制寄存器,可以通过配置它们来设置 SPI 总线的传输模式。
SPI 设备在进行通信的过程中,Master 设备和 Slave 设备之间会产生一个数据链路回环(Data Loop)。

工作模式

在这里插入图片描述
CPOL:时钟极性选择,配置SPI总线的极性,起始时刻的电平。=0时表示,SPI总线空闲时,时钟线是低电平。
CPHA:时钟相位选择,配置SPI总线的相位,决定SPI总线从哪个跳变沿开始采样数据。=0时表示clk在第一个跳变沿采样,第二个跳变沿发送。
在这里插入图片描述
例如:
CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。
CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。
在这里插入图片描述

FPGA控制(未整理)

在FPGA中实现,需要严格根据时序来控制SCK和数据的输入输出。
在CS下降沿和SCLK第一个边沿,或CS上升沿和SCLK最后一个边沿之间要留有一定的延迟时间,一般是0.5个SCLK周期。
FPGA实现UART、SPI、IIC等串行时序,最常用的实现方式就是状态机大法,将各个步骤分解为各个状态,然后根据不同的状态去控制输出或读取输入,细节方面需要考虑数据的对齐、建立和保持时间、一些异常情况时状态的跳转,不能进入死循环,或卡死在某一个状态。
下图的波形是使用Xilinx FPGA对一款铁电存储器FM25V05的驱动,采用标准4线SPI协议,和IIC接口的ERPOM操作方式类似:先写控制字,再写地址,再写数据或者读数据,SCK时钟频率40MHz,使用ChipScope抓取到的实际读写波形,在SCK低电平中间数据改变,在SCK上升沿左右数据要保持稳定。
SPI写时序,需要注意的是先写使能命令,然后重新产生CS信号,这一块卡了好久,在官方示例的C代码中才发现了问题所在,还是对手册上的时序理解不到位。
FM25V05写时序
SPI读时序,先写控制字,再写16位地址,然后读8位数据。
在这里插入图片描述
FM25V05读时序

使用FPGA来实现SPI时序,最大的好处就是灵活,时序可以根据需要精确的定制,可以实现非常高的速率,特别是同时驱动多片芯片上有很大的优势,在一些高速AD采集的场合必须使用FPGA来实现,难点就是做起来比较麻烦,需要一点点的调试,仿真,虽然FPGA也有一些现成的IP可以使用,但还是不够灵活。不像STM32等MCU那样有现成的库函数和寄存器简单几行代码配置一下,就可以实现主从模式、SPI模式、数据位宽、多种速率、单线双线、半双工全双工、DMA等等。

参考资料:
https://zhuanlan.zhihu.com/p/150121520
https://www.bilibili.com/medialist/play/watchlater/BV1354y1R7nB

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值