SPI--详解
1.0 原理
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。
SPI是MCU中的常用接口模块,以主从方式工作,通常由一个主设备或多个从设备,需要至少4根线(支持全双工方式)或者3根线(支持半双工方式)工作,分别为SDI(数据输入),SDO(数据输出),SCK(时钟输入),CS(片选).
下面分别予以介绍:
- MOSI:SPI总线主机输出/从机输入 (Master Output/Slave Input)
- MISO:SPI总线主机输入/从机输出(Master Input/Slave Output)
- SCK:时钟信号,由主设备产生。
- CS:从设备使能信号,由主设备控制,有些IC的cs也称为SS。
CS控制芯片是否被选中,也就是说只有片选信号为预先规定的的使能值时(高电平或低电平),对此芯片的操作才有效。此方法使得在同一总线上连接多个SPI设备成为可能。
如图所示,是主设备和从设备的连接示意图。
2.0 SPI协议的种类
基本的SPI协议也称为Single-SPI,在基本的Single SPI协议基础上,扩展出了Dual-SPI和Quard-SPI协议,简介如下:
2.1 Single-SPI-master
Single-SPI协议是串行通信协议,因此数据逐位进行传输,由SCK提供时钟脉冲,MOSI,MISO则基于时钟脉冲完成数据传输。
数据输出通过MOSI线传输,数据在SCK时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被采样完成一位数据传输,输入MISO也是同样的原理。
opencore的开源SPI协议就是Single-SPI协议,详细如下:
2.1.1 wishbone端口
在端口方面,和I2C一样,采用了Wishbone总线进行连接,看代码很简单,主要是为了方便数据的输入输出。
2.1.2 SPI 总线端口
从上图看,在single-spi协议里面,定义了三个端口,SCK,MOSI,MISO作为连接SPI总线的端口,端口的详细作用在上文已经讲过了,这里就不多作诠释,对code有兴趣的可以在网上自行下载,有一堆。
2.1.3 寄存器列表
简单SPI协议定义了四个寄存器,分别是SPCR,SPSR,SPDR和SPER,分别为控制寄存器,状态寄存器,数据寄存器和扩展功能寄存器,下面一个一个介绍。
2.1.3.1 SPCR控制寄存器
这是SPCR控制寄存器的bit位功能表,
- SPIE是SPI中断的使能,
- SPE是SPI总线的使能,看名称比较容易搞混哈哈,
- MSTR是主从模式选择,1为master,0为slave,这个bit位比较特殊,因为在code里,这个bit位只是这么定义的,具体的逻辑没有,所以他其实一点用都没有,换句话说,simple-spi就是一个master的device。
- SPR是用来配置clock rate的,与spre组成一个4bit的espr信号用来配置clock rate。
- CPOL和CPHA是SPI总线的极性配置选项,具体配置效果看下图。
需要注意的是,master和slave的极性配置需要一致,否则无法正常工作。
2.1.3.2 SPSR状态寄存器
SPSR是一个状态输出寄存器,用来显示SPI总线master的状态。
- SPIF是一个中断flag,当SPIF和SPIE都置1时,会产生一个中断信号,
- WCOL是一个写满flag。
- SPSR[3:0]则分别表示FIFO的读写状态。
2.1.3.3 SPDR数据寄存器
2.1.3.4 SPER扩展寄存器
- ICNT是一个中断计数器,在传输数据时,计数数据的bit位已确定数据正常传输。
- ESPR是clock rate配置的,在上文有介绍。
2.2 Single-SPI-Slave
在opencore给出的simpleSPI协议里,他的slave代码特别简单,就是一个移位寄存器,所以就不多解释了。
2.3 Dual-SPI
- 由于在实际使用中很少使用全双工模式,因此为了能够充分利用数据线,DualSPI协议被引入。
- 在Dual-SPI协议中,MOSI,MISO数据线被重命名位SD0和SD1,变成既可以作输入也可以作输出的双向信号线。
- SD0和SD1数据线和真正的双向信号线还是有一定区,这两根线需要同时作输入或者同时作输出,所以它是半双工的方式。
- 由于使用两根数据线进行传输,所以,它相比single-spi,一个周期可以传输2bit的信号,因此在单向传输时,数据的吞吐率能够提高一倍。
2.4 Quad-SPI
- Quad-SPI是Dual-SPI的升级版,在原来的基础上在新添加的2根数据线,变为4根,分别是SD0,SD1,SD2,SD3。
- Quad-SPI协议同样使用半双工的方式,但因为有四根数据线,所以一个周期可以传送4bit的信号。
在E203 MCU SoC里,它支持3个QuadSPI模块。分别位QSPI0,QSPI1和QSPI2,都有四根数据线,但是可以通过寄存器配置,使它变成单线,双线,和四线工作模式。
本来想学习一下E203的SPI协议代码,但是看过代码的同学应该知道,乱得很。。。。。
咨询了我leader,他讲这是别的语言通过机器转换过来的,也就只能到此为止,想了解具体功能的同学可以参考《RISC-V架构与嵌入式开发快速入门》这本书,我就不再作这个搬运工了,溜了。