欢迎光临散文网 会员登陆 & 注册

STM32CUBEMX(13)--SPI,W25Q128外部Flash移植

2021-06-14 17:28 作者:记帖  | 我要投稿

概述

    SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如 EEPROM,FLASH,实时时钟,AD转换器。

    W25Q128 是一款SPI接口的Flash芯片,其存储空间为 128Mbit,相当于16M字节。W25Q128可以支持 SPI 的模式 0 和模式 3,也就是 CPOL=0/CPHA=0 和CPOL=1/CPHA=1 这两种模式。

硬件准备

   首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板。   

    Flash就是淘宝上SPI接口的W25Q128模块。

选择芯片型号

    使用STM32CUBEMX选择芯片stm32f030r8,如下所示:

配置时钟源

    HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:

配置时钟树

    STM32F0的最高主频到48M,所以配置48即可:

串口配置

    本次实验使用的串口1进行串口通信,波特率配置为115200。


    开启DMA。

    中断。

SPI配置

    本次实验使用的SPI与Flash通信,配置如下。

    SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。

  1. MISO– Master Input Slave Output,主设备数据输入,从设备数据输出;

  2. MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入;

  3. SCLK – Serial Clock,时钟信号,由主设备产生;

  4. CS – Chip Select,从设备使能信号,由主设备控制。

接线方式

    负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。因此,至少需要8次时钟信号的改变(上沿和下沿为一次),才能完成8位数据的传输。

    时钟信号线SCLK只能由主设备控制,从设备不能控制。同样,在一个基于SPI的设备中,至少有一个主设备。这样的传输方式有一个优点,在数据位的传输过程中可以暂停,也就是时钟的周期可以为不等宽,因为时钟线由主设备控制,当没有时钟跳变时,从设备不采集或传送数据。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。芯片集成的SPI串行同步时钟极性和相位可以通过寄存器配置,IO模拟的SPI串行同步时钟需要根据从设备支持的时钟极性和相位来通讯。

    最后,SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。

    其中,CS是从芯片是否被主芯片选中的控制信号,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。这就使在同一条总线上连接多个SPI设备成为可能。
    随便配置一个端口为CS片选,并且命名为CS。

生成工程设置

    注意在生产工程设置中不能出现中文,不然会报错。

代码生成设置

    最后设置生成独立的初始化文件。

生成代码

配置keil

W25Q128的原理及应用

    W25Q128将16M的容量分为256个块(Block),每个块大小为64K字节,每个块又分为16个扇区(Sector),每个扇区4K个字节。W25Q128的最小擦除单位为一个扇区,也就是每次必须擦除4K个字节。

    芯片ID如下所示。

  • 0XEF13,表示芯片型号为W25Q80

  • 0XEF14,表示芯片型号为W25Q16

  • 0XEF15,表示芯片型号为W25Q32

  • 0XEF16,表示芯片型号为W25Q64

  • 0XEF17,表示芯片型号为W25Q128

驱动代码

    W25Qx.c

    W25Qx.h

    写好的W25Qx.c放入Src文件夹内,W25Qx.h放入Inc文件夹内,之后需要在keil中加入这2个文件。


代码

    本例程向1,2,3扇区中写入数据,并且读取出来,例程代码如下。
    头文件定义。

    串口接收和flash数组定义。

    串口重定向。

    #include "stm32f0xx_it.c"文件中断外部变量引用。

    串口1中断函数。

    在main.c函数中,初始化串口和W25Q128。

    主程序。

演示效果

    W25Q128芯片型号的ID为0XEF17,下方读取为0XEF17,所以读取成功。
    开机会打印出1,2,3扇区的前0x200个数据,即打印2页的数据。

    打印完原始数据之后将数据全部清零,清零完成如下图所示。

    串口定义了ReceiveBuff[0]的数据为写入什么扇区,ReceiveBuff[0]为1写入扇区1,ReceiveBuff[0]为2写入扇区2,ReceiveBuff[0]为3写入扇区3,若为其他数据,则打印输入错误;ReceiveBuff[1]则为写入的位置。

    输入:01 05 01 02 03 04

    向扇区1的的05号位置开始写入数据01 02 03 04。

    输入:01 28 11 12 13 14 15
    向扇区1的的40(28是十六进制)号位置开始写入数据11 12 13 14 15。

    输入:03 10 aa bb
    向扇区3的的16(10是十六进制)号位置开始写入数据aa bb。

视频


STM32CUBEMX(13)--SPI,W25Q128外部Flash移植的评论 (共 条)

分享到微博请遵守国家法律