主页
FPGA培训
关于平台
企业孵化
峰会大赛
展厅预约
FPGA知识库
联系我们
登录 注册
首页 > 技术文章 > RISC_V_外设篇_SPI
RISC_V_外设篇_SPI
来源: 2021-09-28 10:56

1.0 原理

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。

SPI是MCU中的常用接口模块,以主从方式工作,通常由一个主设备或多个从设备,需要至少4根线(支持全双工方式)或者3根线(支持半双工方式)工作,分别为SDI(数据输入),SDO(数据输出),SCK(时钟输入),CS(片选).

下面分别予以介绍:


1.MOSI:SPI总线主机输出/从机输入 (Master Output/Slave Input)

2.MISO:SPI总线主机输入/从机输出(Master Input/Slave Output)

3.SCK:时钟信号,由主设备产生。

4.CS:从设备使能信号,由主设备控制,有些IC的cs也称为SS。

CS控制芯片是否被选中,也就是说只有片选信号为预先规定的的使能值时(高电平或低电平),对此芯片的操作才有效。此方法使得在同一总线上连接多个SPI设备成为可能。

C11.png

如图所示,是主设备和从设备的连接示意图。


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总线进行连接,看代码很简单,主要是为了方便数据的输入输出。

C12.png

2.1.2 SPI 总线端口

C13.png

从上图看,在single-spi协议里面,定义了三个端口,SCK,MOSI,MISO作为连接SPI总线的端口,端口的详细作用在上文已经讲过了,这里就不多作诠释,对code有兴趣的可以在网上自行下载,有一堆。


2.1.3 寄存器列表

C14.png

简单SPI协议定义了四个寄存器,分别是SPCR,SPSR,SPDR和SPER,分别为控制寄存器,状态寄存器,数据寄存器和扩展功能寄存器,下面一个一个介绍。


2.1.3.1 SPCR控制寄存器

C15.png

这是SPCR控制寄存器的bit位功能表,


1.SPIE是SPI中断的使能,

2.SPE是SPI总线的使能,看名称比较容易搞混哈哈,

3.MSTR是主从模式选择,1为master,0为slave,这个bit比较特殊,因为在code里,这个bit位只是这么定义的,具体的逻辑没有,所以他其实一点用都没有,换句话说,simple-spi就是一个master的device。

4.SPR是用来配置clock rate的,与spre组成一个4bit的espr信号用来配置clock rate。

5.CPOL和CPHA是SPI总线的极性配置选项,具体配置效果看下图。


C16.png


需要注意的是,master和slave的极性配置需要一致,否则无法正常工作。

2.1.3.2 SPSR状态寄存器

SPSR是一个状态输出寄存器,用来显示SPI总线master的状态。

C17.png


1.SPIF是一个中断flag,当SPIF和SPIE都置1时,会产生一个中断信号,

2.WCOL是一个写满flag。

3.SPSR[3:0]则分别表示FIFO的读写状态。

2.1.3.3 SPDR数据寄存器

C18.png


2.1.3.4 SPER扩展寄存器

C19.png


1.ICNT是一个中断计数器,在传输数据时,计数数据的bit位已确定数据正常传输。

2.ESPR是clock rate配置的,在上文有介绍。

C20.png


2.2 Single-SPI-Slave

在opencore给出的simpleSPI协议里,他的slave代码特别简单,就是一个移位寄存器,所以就不多解释了。


2.3 Dual-SPI

1.由于在实际使用中很少使用全双工模式,因此为了能够充分利用数据线,DualSPI协议被引入。

2.在Dual-SPI协议中,MOSI,MISO数据线被重命名位SD0和SD1,变成既可以作输入也可以作输出的双向信号线。

3.SD0和SD1数据线和真正的双向信号线还是有一定区,这两根线需要同时作输入或者同时作输出,所以它是半双工的方式。

4.由于使用两根数据线进行传输,所以,它相比single-spi,一个周期可以传输2bit的信号,因此在单向传输时,数据的吞吐率能够提高一倍。

2.4 Quad-SPI

1.Quad-SPI是Dual-SPI的升级版,在原来的基础上在新添加的2根数据线,变为4根,分别是SD0,SD1,SD2,SD3。

2.Quad-SPI协议同样使用半双工的方式,但因为有四根数据线,所以一个周期可以传送4bit的信号。

      在E203 MCU SoC里,它支持3个QuadSPI模块。分别位QSPI0,QSPI1和QSPI2,都有四根数据线,但是可以通过寄存器配置,使它变成单线,双线,和四线工作模式。

本来想学习一下E203的SPI协议代码,但是看过代码的同学应该知道,乱得很。。。。。


咨询了我leader,他讲这是别的语言通过机器转换过来的,也就只能到此为止,想了解具体功能的同学可以参考《RISC-V架构与嵌入式开发快速入门》这本书,我就不再作这个搬运工了,溜了。

————————————————

声明:文章来源于CSDN,作者是Mr. Qu,本文内容及配图的版权归版权所有人所有,内容仅代表作者个人观点,不代表本网站观点或证实其内容的真实性。对于本网刊载的各类评论非本网评论员评论,仅代表评论者个人观点,并不代表本网证实或赞成其描述。如其他媒体、网站或个人转载使用,需保留本网注明的“稿件来源”,并自负法律责任。本文转载仅为更好的传播行业信息,若有内容图片侵权或者其他问题,请及时通过邮件联系我们,以便做侵删处理。

原文链接:https://blog.csdn.net/weixin_42369496/article/details/102747901