SPI总线概述
SPI总线介绍
SPI是由摩托罗拉(Motorola)公司开发的全双工同步串行总线,是微处理控制单元(MCU)和外围设备之间进行通信的同步串行端口。主要应用在EEPROM、Flash、实时时钟(RTC)、数模转换器(ADC)、网络控制器、MCU、数字信号处理器(DSP)以及数字信号解码器之间。
SPI总线接口和物理拓扑结构
接口:
五线制接口(四线SPI):全双工
MOSI(主出从入)、MISO(主入从出)、SCK、CS、GND
四线制接口(三线SPI):半双工
IO(双向通信数据线)、SCK、CS、GND
物理拓扑结构:支持一主多从,依靠片选线区分从设备,每增加一个从设备就要增加一个片选线,消耗一个IO口。
SPI总线通信原理
通信数据线:MOSI、MISO,时钟线:SCK,芯片选择线:CS
通信过程:
将CS拉低,选择和那个设备通信
操作时钟线,让MISO和MOSI准备数据
操作时钟线,让MISO和MOSI发送数据
将CS拉高,释放通信总线
SPI总线数据格式
数据格式不固定:数据位长度可以变化,SPI支持暂停功能,一般数据长度是8位。
数据格式需要注意:那种边沿发送数据,那种边沿准备数据,总线空闲时时钟状态
CPHA:相位 决定了在第几个时钟边沿进行数据采集:为0,选择第一个边沿也就是前沿,为1,选择第二个边沿,也就是后沿
CPOL:时钟极性,决定时钟的空闲状态。为1,空闲时为高,为0,空闲时为低电平
也就是说一共有四种模式:工作在模式0的设备,他一定能工作在模式3
CPHA=0 | CPHA=1 | |
---|---|---|
CPOL=0 极性低 | 上升沿采样 :模式0 | 下降沿采样:模式1 |
CPOL=1 极性高 | 下降沿采样 :模式2 | 上升沿采样:模式3 |
每发送以为数据就会接收到一位数据。
时序操作:
每发送一个数据为的时间由发送速度决定。通信速度一般在Mhz以上,最快可达上百M。
STM32中的SPI总线
STM32中SPI总线介绍
在大容量产品和互联型产品上,SPI接口可以配置为支持SPI协议或者支持I2S音频协议。SPI接 口默认工作在SPI方式,可以通过软件把功能从SPI模式切换到I2S模式。
串行外设接口(SPI)允许芯片与外部设备以半/全双工、同步、串行方式通信。此接口可以被配置 成主模式,并为外部从设备提供通信时钟(SCK)。接口还能以多主配置方式工作。 它可用于多种用途,包括使用一条双向数据线的双线单工同步传输,还可使用CRC校验的可靠通信。
STM32中SPI框架
发送缓冲区和接收缓冲区共用同一个寄存器,两者不影响,类似于串口的发送和接收数据寄存器。
从选择NSS管脚作用分析:
用来切换主设备还是从设备,动态改变,由硬件和软件进行配置。作为主设备时可以不使用NSS,作为从设备时必须有一个NSS管脚作为片选线。
从上图中可以看出SPI在从模式管理上是有两个输入可以选择的,一个是寄存器SSI位一个是NSS管脚。具体使用哪个输出信号由寄存器SSM位控制,如果SSM位为0则选择NSS管脚,此时为硬件模式。SSM位为1,选择SSI位控制,此时为软件模式。
软件(SSM=1): | 内部NSS的值=SSI,此时NSS管脚可以ling作他用。 |
---|---|
硬件(SSM=0): | 输入:NSS片选,被选择/可以用作多主模式; |
输出:SSOE=1,允许输出,NSS输出低电平,选择从机SSOE=0:禁止输出 |
STM32中SPI相关寄存器
W25Q64存储芯片概述
W25Q64介绍
华邦公司生产的FLASH存储芯片,
容量:64Mbit->8Mbyte
硬件接口:SPI
一页空间:256Byte,不能跨页存储
标准SPI接口时支持的时钟速度:80Mhz
最小擦除单位为:4Kbyte ->一个扇区
块擦除:32Kbyte-64Kbyte
擦除数据10万次,数据保存20年
W25Q64在写入数据时,不支持写1,只支持写0操作。擦除时会将擦除区域写1,保存之前先擦除。
W25Q64管脚介绍
使用标准SPI接口时:
DO:从设备输出管脚
DI:从设备输入管脚
CLK:时钟管脚
CS:片选
WP、HOLD、DI、DO可以拓展工作模式,作为2倍,4倍SPI接口时的数据接口
W25Q64工作原理
支持SPI模式0和模式3,上升沿数据采集
W25Q64要工作,需要通过指令进行设置
常用的指令:
写使能0X06:写数据之前要发送写使能指令
读寄存器指令0X05:用来判断芯片是否正忙
写指令0X02:写入数据
读ID指令0X9F:用来判断芯是否正常工作
W25Q64操作时序
Write Enable (06h):写使能操作
拉底片选
向硬件SPI寄存器发送一个数据
拉高片选
Read Status Register-1 (05h):读状态寄存器
拉低片选
向硬件SPI寄存器发送一个数据0x05/0x35
发送0xFF,第一次发送的数据是无意义的,只是由于SPI环形传输的特性,所以要接收数据,必须要发送一个数据
拉高片选
Page Program (02h):页写数据
拉低片选
发送0x02
发送起始地址(24位)数据,发送三次8位数据
发送数据内容
拉高片选
Read Data (03h):读数据
拉低片选
发送24位地址数据
发送数据(一般位0xff),此时发送的数据无意义,需要关注返回的数据也就是要读的内容。
Sector Erase (20h):扇区擦除
拉低片选
发送指令0x02
发送要擦出的扇区首地址
拉高片选
Read Manufacturer / Device ID (90h):获取芯片ID
拉低片选
发送0x90
发送三个地址数据,数据位都0
发送两字节数据,获取返回值,返回值就是工厂信息和设备ID
拉高片选
Flash驱动
硬件原理图:
PB12—CS
PB13—SCK
PB14—MISO
PB15—MOSI
代码实现流程:
配置GPIO
CS:通用推挽输出
CSK /MOSI:复用推挽输出
MISO:浮空输入
配置SPI
双向全双工
主机模式
SPI模式0或者3
编写读写时序:自己实现或者移植代码
STM32固件库里提供了一份SPI_FLASH的驱动代码,我们只需要稍加修改即可:
路径:
STM32F10x_StdPeriph_Lib_V3.5.0UtilitiesSTM32_EVALCommon