FPBA学习记录1——SPI读数据(一)
一、前言
突然想记录下接触到的东西,用于记录、总结和回顾,就从FPGA的SPI开始。
二、目标
通过SPI读取FLASH数据,并通过串口RS232反馈。
三 、基础知识
1.SPI简介
1)SPI为全双工,同步串行数据总线。
全双工:数据可以同时双向传输。与之相对的半双工,也是可以双向传输,但是不能同时双向。
同步:发送端和接收端时钟一致,在一个时钟下发送与接收;
串行:数据在一根信号线上按位传输。与之相对的并行通信,数据的每一位同时在多根数据线上传输。
2)SPI主从模式。
SPI分为主、从两种模式,一个SPI通讯系统需要包含一个主设备,一个或多个从设备,主设备只能有一个。
提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave)。
SPI的读写操作,都是由主设备发起。当存在多个从设备时,通过各自的片选信号进行管理。
图1. 一主一从模式
图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 )
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时钟的下降沿更新 |
==再强调一点:== SPI里面经常提到的数据的更新与采样:“更新”是指数据从移位寄存器发送到MOSI与MISO通信线上,此时数据已经更新;“采样”是将MOSI与MISO上的数据读进SPI内部的移位寄存器。具体的移位寄存在下方 “C移位寄存” 详细介绍。
C.移位寄存
前面我们一直提到一个概念,SPI通信是“数据交换”,每此发送一个数据的同时就会读到一个数据。如下图所示,SPI内部有数据缓冲区和移位寄存器。如下图所示,Master 设备和 Slave 设备之间通过用 SDO 和 SDI 管脚产生一个数据链路回环。
图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数据交换的示意图,图片出处找不到了,暂不标注出处。
图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学习问题