RISC_V_外设篇_SPI

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设备成为可能。

在这里插入图片描述如图所示,是主设备和从设备的连接示意图。

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位功能表,

  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总线的极性配置选项,具体配置效果看下图。
    在这里插入图片描述
    需要注意的是,master和slave的极性配置需要一致,否则无法正常工作。
2.1.3.2 SPSR状态寄存器

SPSR是一个状态输出寄存器,用来显示SPI总线master的状态。
在这里插入图片描述

  1. SPIF是一个中断flag,当SPIF和SPIE都置1时,会产生一个中断信号,
  2. WCOL是一个写满flag。
  3. SPSR[3:0]则分别表示FIFO的读写状态。
2.1.3.3 SPDR数据寄存器

在这里插入图片描述

2.1.3.4 SPER扩展寄存器

在这里插入图片描述

  1. ICNT是一个中断计数器,在传输数据时,计数数据的bit位已确定数据正常传输。
  2. ESPR是clock rate配置的,在上文有介绍。

在这里插入图片描述

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架构与嵌入式开发快速入门》这本书,我就不再作这个搬运工了,溜了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值