SPI--详解

  • 1.0 原理
  • 2.0 SPI协议的种类
    • 2.1 Single-SPI-master
      • 2.1.1 wishbone端口
      • 2.1.2 SPI 总线端口
      • 2.1.3 寄存器列表
        • 2.1.3.1 SPCR控制寄存器
        • 2.1.3.2 SPSR状态寄存器
        • 2.1.3.3 SPDR数据寄存器
        • 2.1.3.4 SPER扩展寄存器
    • 2.2 Single-SPI-Slave
    • 2.3 Dual-SPI
    • 2.4 Quad-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架构与嵌入式开发快速入门》这本书,我就不再作这个搬运工了,溜了。

RISC_V_外设篇_SPI相关推荐

  1. 多麦克风做拾音的波束_乱侃外设 篇四十二:一浪更比一浪强!HyperX Quadcast S 声浪加强版麦克风浅评...

    原标题:乱侃外设 篇四十二:一浪更比一浪强!HyperX Quadcast S 声浪加强版麦克风浅评 乱侃外设 篇四十二:一浪更比一浪强!HyperX Quadcast S 声浪加强版麦克风浅评 20 ...

  2. z490 linux raid,PC硬件与外设 篇二十三:光威弈系列Pro Z490平台装机评测(含raid模式)...

    PC硬件与外设 篇二十三:光威弈系列Pro Z490平台装机评测(含raid模式) 2020-06-16 09:53:51 0点赞 0收藏 0评论 创作立场声明:raid模式值得体验 存储颗粒与主控的 ...

  3. 【STM32】标准库与HAL库对照学习教程外设篇--红外避障传感器

    [STM32]标准库与HAL库对照学习教程外设篇--红外避障传感器 一.前言 二.准备工作 三.红外避障传感器 1.传感器原理说明 2.传感器特性 四.标准库使用红外传感器 1.实验程序 2.实验效果 ...

  4. 【STM32】标准库与HAL库对照学习教程外设篇--超声波测距传感器

    [STM32]标准库与HAL库对照学习教程外设篇--超声波测距传感器 一.前言 二.准备工作 三.超声波测距传感器 1.原理说明 2.使用说明 四.标准库使用传感器 1.实验程序 2.实验效果 五.H ...

  5. 安卓系统百变USB OTG之输入外设篇

    安卓系统百变USB OTG之输入外设篇 转自:http://www.sina.com.cn   2012年09月29日 09:27  斑马网 近日小米2的开箱照频频曝光,而在小米的随箱"嫁妆 ...

  6. Esp8266 进阶之路36【外设篇】乐鑫esp8266芯片SDK编程驱动时间芯片 ds1302,同步网络时间到本地,再也不怕掉电断网也可以同步时间了!(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个"hello ...

  7. Esp8266 进阶之路31【外设篇】分享一个乐鑫esp8266 SDK编程使用 IIC总线驱动 0.96寸的OLED显示屏,显示天气预报信息。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  8. Esp8266 进阶之路19 【外设篇①】esp8266驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  9. ARM 之 STM32F407zgt6 外设篇 ----------- FLASH 存储部分数据

    一.关于STM32F407 的FLASH 根据掉电数据是否丢失存储器可以分为RAM(随机存取存储器)和ROM(只读存储器),其中RAM的访问速度比较快,但掉电后数据会丢失,而ROM掉电后数据不会丢失. ...

最新文章

  1. 深度学习模型轻量化(下)
  2. 源文件的编码会对编译结果有影响
  3. java rsa数字签名_RSA 数字签名算法(Java版)
  4. ORACLE11G RAC增加节点操作
  5. 2019.01.27【NOIP普及组】模拟赛C组总结
  6. linux 远程权限不够,Eclipse连接远程Hadoop集群开发时权限不足问题解决方案
  7. Aptana插件安装到eclipse和myeclipse的详细过程
  8. Solaris 的防火墙ipfilter设置
  9. JQuery学习笔记 [Ajax] (6-1)
  10. Zabbix监控配置
  11. 电脑广告太多,请避免安装这些软件
  12. 电音风靡全球,不了解一下吗?
  13. 【CS224n】(lecture1)课程介绍和word2vec
  14. 曲面的法向量+高斯公式曲面的方向余弦的计算
  15. 人工智能行业知识 - AI应用场景
  16. python编程100例海绵宝宝-Python_Turtle库画一只派大星
  17. 计算机第一启动设置u盘启动,怎么设置usb为第一启动_bios设置u盘启动
  18. 思考与总结:数据分片的一些问题
  19. 新手操作低客单价时常见的误区有哪些?
  20. DSP6713 Simulator HelloWorld与LED

热门文章

  1. h5基于canvas的凹凸拼图碎片生成
  2. Froala Editor JavaScript WYSIWYG HTML 编辑器
  3. 火车头采集规则,火车头采集数据发布不小心设置了发布数量怎么修改?
  4. Xshell7连接VirtualBox虚拟机
  5. LaTeX技巧心得28:如何在文中实现带圈的数字和圈中加号
  6. [go学习笔记.第十六章.TCP编程] 3.项目-海量用户即时通讯系统-redis介入,用户登录,注册
  7. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第37讲:HTTP协议请求(响应)
  8. 调试OpenGL ES应用程序
  9. 贝叶斯公式与随机点名中的学生可信度
  10. ktv无线服务器,KTV,酒店无线wifi上网无线AP服务器