打印
[STM32F1]

STM32中的SPI总线

[复制链接]
980|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tifmill|  楼主 | 2024-3-18 08:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
五线制接口(四线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

使用特权

评论回复
沙发
小夏天的大西瓜| | 2024-3-18 16:51 | 只看该作者
全双工与半双工具体上有那些区别?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

1367

帖子

0

粉丝