STM32学习笔记(11_1)- SPI简介和工作原理

本文讲述了作者在学习STM32过程中对SPI通信协议的学习,包括SPI与I2C的比较,以及如何通过软件和硬件方式操作W25Q64Flash存储器。详细介绍了SPI的通信流程、硬件连接和工作原理。
摘要由CSDN通过智能技术生成

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。

最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com

本期学习另一个通信协议SPI,和I2C差不多,都是实现主控芯片和各种外挂芯片之间的数据交流。学习流程也是一样,先学习SPI协议的软硬件规定。先用软件模拟的SPl,实现读写这个W25Q64 Flash存储器,之后再学习STM32中的SPI外设,再用硬件SPI实现一样的功能。

W25Q64是一个flash存储器芯片,内部可存8M,并且掉电不丢失。

I2C可以在消耗最低硬件资源的情况下,实现最多的功能,但是时序复杂,通信速度慢(标准模式下100KHz)。高位先行,只有在SCL高电平时才会读取SDA的电平。

SPI传输速度快,最大传输速率取决于芯片厂商的设计,比如W25Q64,手册里写的SPI时钟频率,最大可达80MHz;其次设计简单,没有I2C那么复杂;最后,硬件开销比较大,占用的通信线多。高位先行,数据位的输入和输出都是在SCK的上升沿或下降沿进行的。

在SPI中通常采用指令码加读写数据的模型,即SPI的通信流程是起始后+第一个字节(指令码里面的指令)+读/写指令。在SPI从机的芯片手册上,都会定义好对应的指令集。

SPI简介

这四根通信线可能还会有其他名称,比如SCLK、CLK、CK、DO、DI、NSS、CS等,下面以SPI官方文档为准。

数据位的输入和输出都是在SCK的上升沿或下降沿进行的。

左一是W25Q64,flash存储器芯片,内部可存8M。其上面DI指的是W25Q64的数据输入口,即MOSI。左二为SPI通信的OLED。左三为2.4G无线通信模块,芯片型号为NRF24L01。最后是micro SD卡,也是可以利用SPI进行读写。

SPI硬件电路

从机:比如存储器、显示屏、通信模块、传感器等等等等。

 SPI通信线上的电压都是对GND来说的,所以主机和从机还要共地

SS是低电平有效,主机想指定谁,就把对应的SS输出线置低电平。同一时间,主机只能选择一个从机进行通信。

当从机的SS引脚为高电平时,它的MISO引脚必须切换为高阻态(相当于引脚断开,不输出任何电平);当从机的SS引脚为低电平时,它的MISO引脚才允许为推挽输出。当然这个切换过程是在从机里进行,我们写主机程序并不需要用这个。

SPI移位示意图

 内部都有一个8位移位寄存器,高位先行,每来一个时钟,左移一次。SCK时钟源是由主机提供的,叫波特率发生器。

具体工作流程:首先,波特率发生器时钟的上升沿,所以移位寄存器向左移动一位,移出去的位放在引脚上;时钟下降沿,引脚上的位,采样输入到移位寄存器的最低位。

 下图是一个时钟采样后的现象,也就是波特率发生器来一个时钟信号,上升沿时,把主机的最高位1输出到MOSI线上、从机的最高位0输出到MISO线上;下降沿时,从机把MOSI线上的1采样输入到从机移位寄存器最低位、主机把MISO线上的0采样输入到主机移位寄存器。

这样8次后就实现了主机和从机一个字节的交换。那主机只发送不接收呢?还是数据交换的流程,不读取主机接收的数据即可;只接收不发送呢?也是一样的流程,主机随便发个数据到从机即可(一般发送0x00或0xFF)。

 SPI时序基本单元

SS下降沿是通信的开始,SS上升沿是通信的结束,在整个通信过程,SPI始终要保持低电平。

什么时候移位、上升沿移位还是下降沿移位?SPI并没有限定死,而是可以通过CPOL(clock polarity时钟极性)和CPHA(clock phase时钟相位)进行配置,共四种模式。

 这里介绍交换一个字节模式1,但是常用的是模式0.

模式0数据变化会提前半个周期。 

SPI时序例子

这里以W25Q64为例,在SPI中通常采用指令码加读写数据的模型,过程就是SPI起始后,第一个交换发送给从机的数据一般叫指令码,在从机中一般会定义一个指令集。需要发送什么指令时,就可以在起始后第一个字节发送指令集里面的数据。有的指令只需要一个字节的指令码就可以完成,比如W25Q64的写使能、写失能等指令;而有的指令后面还需要再跟读写的数据,比如W25Q64的写数据、读数据等,写数据就得跟上我在哪里写、写什么。在SPI从机的芯片手册上,都会定义好对应的指令集。

发送指令(单字节)

下图使用的是模式0

指定地址写 

因为W25Q64有8M的flash,8位地址不够表示,所以这里的地址是24位的。

8个时钟后SPI交换完成,0x02代表要写入数据 

 下图这里的三个字节表示从机收到的24位地址为0x123456

最后一个字节表示我要写入0x55这个数据,即在0x123456地址下写入0x55。只写入一个数据的话,这里就可以把SS拉高,结束通信了;还要写数据的话,在0x55的后一个字节继续写入数据就好。这里和I2C一样,每读写一次,地址指针会自动加1.

 指定地址读

发送读指令和指定地址都和指定地址写一样 ,这里就直接看最后一个字节读数据。

这时从机就会把0x123456地址下的数据通过MISO发给主机。

程序现象

用四根SPI通信线把W25Q64和STM32连接,STM32操作引脚电平,实现SPI通信时序,进而实现读写存储器芯片的目的。

第一行显示ID号,MID是厂商ID,读出来是0xEF;DID是设备ID,读出来是0x4017。ID号是手册固定的,我们用SPI读取ID号,就可以进行最简单的测试了。第二行W是写的内容,是4个字节,0x01、02、03、04。第三行是读的内容,也是0x01、02、03、04。写入和读出的数据一样,说明测试没什么问题。

软件SPI读写W25Q64

硬件SPI读写W25Q64

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值