FPBA学习记录1——SPI读数据(一)

一、前言

突然想记录下接触到的东西,用于记录、总结和回顾,就从FPGA的SPI开始。

二、目标

通过SPI读取FLASH数据,并通过串口RS232反馈。

三 、基础知识

1.SPI简介

1)SPI为全双工,同步串行数据总线。

全双工:数据可以同时双向传输。与之相对的半双工,也是可以双向传输,但是不能同时双向。
同步:发送端和接收端时钟一致,在一个时钟下发送与接收;
串行:数据在一根信号线上按位传输。与之相对的并行通信,数据的每一位同时在多根数据线上传输。

2)SPI主从模式。

SPI分为主、从两种模式,一个SPI通讯系统需要包含一个主设备,一个或多个从设备,主设备只能有一个。
提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave)。
SPI的读写操作,都是由主设备发起。当存在多个从设备时,通过各自的片选信号进行管理。

alt

图1. 一主一从模式

alt

图2. 一主多从模式 ### 3)SPI信号线。 SPI接口包含四条信号线:
MISO:主机输入,从机输出(数据来自从机);
MOSI:主机输出,从机输入(数据来自主机);
SCLK:串行时钟信号,由主机产生发送给从机;
CS	:片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。

4)SPI通信协议。

SPI通信寻址依靠片选信号CS,无应答机制,在传输过程中所有的控制来自SCLK时钟信号。 主要有三点需要注意,分别是传输流程、数据更新与采集、移位寄存这三点。 ==强调容易混淆的两点:== ①SPI通信只有收发,无读写说法。 ②SPI为全双工,因此数据的接收和发送在MOSI与MISO两个数据线上是同时进行的。

A.传输流程

  • ①主机将片选信号CS拉低,开始数据交换;

  • ②主机发送SCLK时钟信号,告诉从机进行数据交换;

  • ③主从机之间进行数据交互,每次以字节或者字为单位(8bit或者16bit)。后面会讲到为啥是这个单位。

      	1字 	= 	2字节		(1 word = 2 byte	)
      	1字节	=	8位		(1 byte = 8bit		)
    

alt

图3. 数据传输图示
1  :主设备拉低使能信号CS,告诉从设备开始通信;
2-5:主从设备进行数据交互,图示一个字节为单位,每次发送1个bit;
6  :主设备拉高使能信号CS,停止数据交互。

B.数据更新与采集

SPI工作时,除了需要确定时钟频率外,还需要确定时钟线空闲状态,以及数据更新与采集发生在时钟的上升沿还是下降沿。SPI共有四种模式,每种模式中数据更新与采集的时间不同,主从设备的工作模式必须一致,某些特定的设备固定了工作模式,主设备必须去和其保持一致。四种模式由时钟极性(CPOL)和时钟相位(CPHA)决定。 CPOL:时钟极性, 表示 SPI 在空闲时, 时钟信号是高电平还是低电平。

当CPOL=0时,时钟信号在空闲时为低电平;
当CPOL=1时,时钟信号在空闲时为高电平。

CPHA:时钟相位, 表示 SPI 设备是在 SCK 管脚上的时钟信号变为上升沿时触发数据采样, 还是在时钟信号变为下降沿时触发数据采样。

当CPHA=0时,在串行同步时钟的第一个跳边沿(上升沿或下降沿)数据被采样;
当CPHA=1时,在串行同步时钟的第二个跳边沿(上升沿或下降沿)数据被采样。

这两种信号的变化,组合成了SPI的四种工作模式:

工作模式 状态 描述
模式0 CPOL= 0,CPHA=0 SCK串行时钟线空闲是为低电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿更新
模式1 CPOL= 0,CPHA=1 SCK串行时钟线空闲是为低电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿更新
模式2 CPOL= 1,CPHA=0 SCK串行时钟线空闲是为高电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿更新
模式3 CPOL= 1,CPHA=1 SCK串行时钟线空闲是为高电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿更新

alt

图4. SPI四种工作模式

==再强调一点:== SPI里面经常提到的数据的更新与采样:“更新”是指数据从移位寄存器发送到MOSI与MISO通信线上,此时数据已经更新;“采样”是将MOSI与MISO上的数据读进SPI内部的移位寄存器。具体的移位寄存在下方 “C移位寄存” 详细介绍。

C.移位寄存

前面我们一直提到一个概念,SPI通信是“数据交换”,每此发送一个数据的同时就会读到一个数据。如下图所示,SPI内部有数据缓冲区和移位寄存器。如下图所示,Master 设备和 Slave 设备之间通过用 SDO 和 SDI 管脚产生一个数据链路回环。 alt

图5. SPI典型连接图示

“数据缓冲区”的物理本质是一个FIFO,以 FIFO 的形式保存传输过程中的临时数据,FIFO的位宽一般是8bit或者是16bit,因此主从设备之间的数据单位是8bit或16bit;主(Master)与从(Slave)之间交换的数据都是 SPI 内部移位寄存器SSPSR从 SSPBUF“数据缓冲区”里面拷贝的。 下面简单介绍下数据交换流程。

1),在发送数据之前,先将数据移入到数据缓冲区SSPBUF;(这部分不描述) 2),然后根据 Channel-Width 从数据缓冲区SSPBUF移出到移位寄存器SSPSR; (Channel-Width简单理解为主机与从机之间的数据位宽) 3),Master 设备和 Slave 设备之间通过 SDO 和 SDI 管脚的数据链路回环,一位一位的传输数据; 4),经过Channel-Width次的数据交互后,完成一个单位的数据交换; 5),移位寄存器SSPSR根据数据位宽Channel-Width,将数据移入 数据缓冲区SSPBUF ; 6),将数据缓冲区SSPBUF的数据读出。(这部分不描述) 下图为SPI数据交换的示意图,图片出处找不到了,暂不标注出处。

alt

图6. SPI数据交换图示

2.RS232简介

串口作为常用的三大低速总线(UART、SPI、IIC)之一,UART和SPI、IIC不同的是,它是异步通信接口,异步通信中的接收方并不知道数据什么时候会到达,所以双方收发端都要有各自的时钟,在数据传输过程中是不需要时钟的,发送方发送的时间间隔可以不均匀,接受 方是在数据的起始位和停止位的帮助下实现信息同步的。 ==此内容不是本片关键,后续单独讲解,此处只是引用,后续更新文章连接。== 关键词:异步通信,有起始位和停止位。

3.FLASH简介

Flash芯片,是一种非易失性储存芯片,掉电后数据不会丢失,在FPGA工程的设计中,Flash主要用作外接芯片来存储FPGA程序,使FPGA在上电后可以立 即执行我们想要执行的程序。SPI-Flash芯片就是支持SPI通讯协议的Flash芯片。 ==具体的FLASH信息,后续遇到什么更新什么,不去专门讲解==

未完------ FPGA部分见下节。

#FPGA##FPGA工程师##FPGA学习##SPI#
FPGA学习 文章被收录于专栏

记录、分享与交流FPGA学习问题

全部评论

相关推荐

🕒 岗位/笔试时间光学编解码/硬件设计开发11号上午线下面试🤪 背景本科双非/硕士师范硕(均非目标院校)走的特批通道,相当于另一种途径的选拔,需要在某些地方有突出优势本人的经历是(电赛国一、嵌入式芯片设计大赛国一,均团队主战+排名第一),有实习经历(小厂,偏FPGA+硬件设计),除此之外还有暑期学校助教经验、集创赛助教经验,开发经验稍微充足一点。🤔 面试感受面试1h左右,总共三位面试。其中一位应该是工程师,一位总工,另外一位是研究院的领导之一。线下面因为之前去过这个地方,有过一些工作上面的交接,所以还算比较熟,没有什么紧张的感觉。主要聊天沟通的内容就是关于我的简历上面项目的介绍,问了一些关于个人专业能力方面的知识,比如FPGA的项目,比如STM32的代码设计,光源的PCB设计和驱动等等,通信接口也问了一些。也跟我介绍了一下他们主要做的东西,主要偏向于光学系统的编解码,具体的话碍于保密不方便公开,但主要还是跟光学发送和接收有关系的,主要是做一套成体系的系统。在介绍系统的时候,领导对我做的主要的自动聚焦平台提出了一些新颖的想法和设计思路,这点非常感谢,确实之前有些地方没有考虑好。然后也沟通交流后续可以在我项目的基础上做一些优化升级改进。后续的话基本上就是一些简单的家庭介绍等等。🤔 后续大概5月14号的时候打电话过来问我什么时候过去实习,他那边可以开始对接任务,当时考虑了一下还是拒绝了,一个是当时的确有比赛要做,另外一个是感觉如果未来不是去那里就业的话,暑期实习或许能学习到的东西会比较少一点,而且方向并不是很匹配,能不能用FPGA去做光学编解码还是个未知数。
查看3道真题和解析
点赞 评论 收藏
分享
6 3 评论
分享
牛客网
牛客企业服务