秉火429笔记之十七 SPI--操作FLASH

2019-09-11来源: eefocus关键字:秉火  SPI  操作FLASH

1. SPI协议概述

关于SPI协议不做赘述,见详解。


https://blog.csdn.net/XieWinter/article/details/94738361


2. STM32 SPI特性及架构

STM32芯片也集成了专门用于SPI协议通讯的外设。


2.1 SPI外设简介

STM32的SPI外设可用作通讯的主机及从机,支持最高的SCK时钟频率为fpclk/2 (STM32F429型号的芯片默认fpclk1为90MHz,fpclk2为45MHz),完全支持SPI协议的4种模式,数据帧长度可设置为8位或16位,可设置数据MSB先行或LSB先行。


双线双工模式: 通常使用


双线单向模式:MOSI/MISO数据线向一个方向传输数据,可以加快一倍的速度


单线模式:半双工


● 基于三条线的全双工同步传输


● 基于双线的单工同步传输,其中一条可作为双向数据线


● 8 位或 16 位传输帧格式选择


● 主模式或从模式操作


● 多主模式功能


● 8 个主模式波特率预分频器(最大值为 fPCLK/2)


● 从模式频率(最大值为 fPCLK/2)


● 对于主模式和从模式都可实现更快的通信


● 对于主模式和从模式都可通过硬件或软件进行 NSS 管理:动态切换主/从操作


● 可编程的时钟极性和相位


● 可编程的数据顺序,最先移位 MSB 或 LSB


● 可触发中断的专用发送和接收标志


● SPI 总线忙状态标志


● SPI TI 模式


● 用于确保可靠通信的硬件 CRC 功能:


       — 在发送模式下可将 CRC 值作为最后一个字节发送


      — 根据收到的最后一个字节自动进行 CRC 错误校验


● 可触发中断的主模式故障、上溢和 CRC 错误标志


● 具有 DMA 功能的 1 字节发送和接收缓冲器:发送和接收请求


2.2 STM32的SPI架构剖析

 

2.2.1 通讯引脚

SPI的所有硬件架构都从图 中左侧MOSI、MISO、SCK及NSS线展开的。


处于不同外设总线上的SPI,最高通信速率有所差异。其中SPI1、SPI4、SPI5、SPI6是APB2上的设备,最高通信速率达45Mbtis/s,SPI2、SPI3是APB1上的设备,最高通信速率为22.5Mbits/s。


2.2.2 时钟控制逻辑

SCK线的时钟信号,由波特率发生器根据“控制寄存器CR1”中的BR[0:2]位控制,该位是对fpclk时钟的分频因子,对fpclk的分频结果就是SCK引脚的输出时钟频率。

2.2.3 数据控制逻辑

SPI的MOSI及MISO都连接到数据移位寄存器上,数据移位寄存器的数据来源及目标接收、发送缓冲区以及MISO、MOSI线。


通过写SPI的“数据寄存器DR”把数据填充到发送缓冲区中,通讯读“数据寄存器DR”,可以获取接收缓冲区中的内容。


其中数据帧长度,可以通过“控制寄存器CR1”的“DFF位”配置成8位及16位模式;配置“LSBFIRST位”可选择MSB先行还是LSB先行。


3. 通信过程

 主模式收发流程及事件说明如下:


(1) 控制NSS信号线,产生起始信号(图中没有画出);


(2) 把要发送的数据写入到“数据寄存器DR”中,该数据会被存储到发送缓冲区;


(3) 通讯开始,SCK时钟开始运行。MOSI把发送缓冲区中的数据一位一位地传输出去;MISO则把数据一位一位地存储进接收缓冲区中;


(4) 当发送完一帧数据的时候,“状态寄存器SR”中的“TXE标志位”会被置1,表示传输完一帧,发送缓冲区已空;类似地,当接收完一帧数据的时候,“RXNE标志位”会被置1,表示传输完一帧,接收缓冲区非空;


(5) 等待到“TXE标志位”为1时,若还要继续发送数据,则再次往“数据寄存器DR”写入数据即可;等待到“RXNE标志位”为1时,通过读取“数据寄存器DR”可以获取接收缓冲区中的内容。


4. 硬件设计

FLASH芯片中还有WP和HOLD引脚。WP引脚可控制写保护功能,当该引脚为低电平时,禁止写入数据。我们直接接电源,不使用写保护功能。HOLD引脚可用于暂停通讯,该引脚为低电平时,通讯暂停,数据输出引脚输出高阻抗状态,时钟和数据输入引脚无效 。详情见芯片数据手册


“dummy”指该处可为任意数据,


5. 软件设计

注意:根据SPI协议可知,时钟是由主机提供的,因此,读字节的时候,发送数据使主机产生时钟,从而是主从的移位寄存器按位移动数据,从而使得从机的数据,转移到主机的数据寄存器,从而获取从机的相应数据。


#ifndef __SPI_FLASH_H__

#define __SPI_FLASH_H__

 

#include "stm32f4xx.h"

#include

 

/* Private typedef -----------------------------------------------------------*/

//#define  sFLASH_ID                       0xEF3015     //W25X16

//#define  sFLASH_ID                       0xEF4015     //W25Q16

//#define  sFLASH_ID                        0XEF4017     //W25Q64

#define  sFLASH_ID                       0XEF4018     //W25Q128

 

 

//#define SPI_FLASH_PageSize            4096

#define SPI_FLASH_PageSize              256

#define SPI_FLASH_PerWritePageSize      256

 

/* Private define ------------------------------------------------------------*/

/*命令定义-开头*******************************/

#define W25X_WriteEnable       0x06 

#define W25X_WriteDisable       0x04 

#define W25X_ReadStatusReg     0x05 

#define W25X_WriteStatusReg   0x01 

#define W25X_ReadData         0x03 

#define W25X_FastReadData       0x0B 

#define W25X_FastReadDual       0x3B 

#define W25X_PageProgram       0x02 

#define W25X_BlockErase       0xD8 

#define W25X_SectorErase       0x20 

#define W25X_ChipErase       0xC7 

#define W25X_PowerDown       0xB9 

#define W25X_ReleasePowerDown   0xAB 

#define W25X_DeviceID         0xAB 

#define W25X_ManufactDeviceID    0x90 

#define W25X_JedecDeviceID     0x9F 

 

#define WIP_Flag                  0x01  /* Write In Progress (WIP) flag */

#define Dummy_Byte                0xFF

/*命令定义-结尾*******************************/

 

 

/*SPI接口定义-开头****************************/

//SPI号

#define FLASH_SPI                           SPI3

#define FLASH_SPI_CLK                       RCC_APB1Periph_SPI3

#define FLASH_SPI_CLK_INIT                  RCC_APB1PeriphClockCmd

//SCK引脚

#define FLASH_SPI_SCK_PIN                   GPIO_Pin_3                  

#define FLASH_SPI_SCK_GPIO_PORT             GPIOB                       

#define FLASH_SPI_SCK_GPIO_CLK              RCC_AHB1Periph_GPIOB

#define FLASH_SPI_SCK_PINSOURCE             GPIO_PinSource3

#define FLASH_SPI_SCK_AF                    GPIO_AF_SPI3

//MISO引脚

#define FLASH_SPI_MISO_PIN                  GPIO_Pin_4                

#define FLASH_SPI_MISO_GPIO_PORT            GPIOB                   

#define FLASH_SPI_MISO_GPIO_CLK             RCC_AHB1Periph_GPIOB

#define FLASH_SPI_MISO_PINSOURCE            GPIO_PinSource4

#define FLASH_SPI_MISO_AF                   GPIO_AF_SPI3

//MOSI引脚

#define FLASH_SPI_MOSI_PIN                   GPIO_Pin_5                

#define FLASH_SPI_MOSI_GPIO_PORT            GPIOB                      

#define FLASH_SPI_MOSI_GPIO_CLK             RCC_AHB1Periph_GPIOB

#define FLASH_SPI_MOSI_PINSOURCE            GPIO_PinSource5

#define FLASH_SPI_MOSI_AF                    GPIO_AF_SPI3

//CS(NSS)引脚

#define FLASH_CS_PIN                         GPIO_Pin_8                

#define FLASH_CS_GPIO_PORT                  GPIOI                     

#define FLASH_CS_GPIO_CLK                   RCC_AHB1Periph_GPIOI

 

//控制CS(NSS)引脚输出低电平

#define SPI_FLASH_CS_LOW()      {FLASH_CS_GPIO_PORT->BSRRH=FLASH_CS_PIN;}

//控制CS(NSS)引脚输出高电平

#define SPI_FLASH_CS_HIGH()     {FLASH_CS_GPIO_PORT->BSRRL=FLASH_CS_PIN;}

 

/*SPI接口定义-结尾****************************/

 

/*等待超时时间*/

#define SPIT_FLAG_TIMEOUT         ((uint32_t)0x1000)

#define SPIT_LONG_TIMEOUT ((uint32_t)(10

[1] [2] [3] [4]
关键字:秉火  SPI  操作FLASH 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic474180.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32 SPI发送与接收用一个函数实现的问题
下一篇:关于STM32f103 SPI时钟速度的问题

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

秉火429笔记之十 EXTI-外部中断/事件
1. EXTI 简介外部中断/事件控制器(EXTI)管理了控制器的23个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。EXTI 控制器的主要特性如下: 每个中断/事件线上都具有独立的触发和屏蔽每个中断线都具有专用的状态位支持多达 23 个软件事件/中断请求检测脉冲宽度低于 APB2 时钟宽度的外部信号。 2. EXTI 功能框图3. 功能点要产生中断,必须先配置好并使能中断线。要产生事件,必须先配置好并使能事件线。通过在软件中对软件中断/事件寄存器写“1”,也可以产生
发表于 2019-09-12
秉火429笔记之十 EXTI-外部中断/事件
秉火429笔记之十一 Systick--滴答定时器
SysTick—系统定时器是属于CM4内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数器。所有基于CM4内核的单片机都具有这个系统定时器,使得软件在CM4单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。2. 寄存器说明CTRL  SysTick控制及状态寄存器LOAD  SysTick重装载数值寄存器VAL SysTick当前数值寄存器CALIB SysTick校准数值寄存器(可忽略)3. 编程要点__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks){  if ((ticks
发表于 2019-09-12
秉火429笔记之十一 Systick--滴答定时器
秉火429笔记之十二 看门狗
1. 概述STM32有两个看门狗,一个是独立看门狗,另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬。一般情况下,使用频次较高是独立看门狗,也即是通常意义的看门狗。2. 独立看门狗(IWDG)一个12位的递减计数器,最大值为0XFFF,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数没减到0之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作.看门狗时钟独立看门狗的时钟由独立的RC振荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。LSI的频率一般在30~60KHZ之间,
发表于 2019-09-12
秉火429笔记之十二 看门狗
秉火429笔记之十五 DMA--直接存储区访问
1. 简介直接存储器访问 (DMA) 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传 输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可 供其它操作使用。从硬件层次上来说,DMA控制器是独立于Cortex-M4内核的,有点类似GPIO、USART外设一般,只是DMA的功能是可以快速移动内存数据。STM32F4xx系列的DMA支持外设到存储器传输、存储器到外设传输和存储器到存储器传输三种传输模式。这里的外设一般指外设的数据寄存器,比如ADC、SPI、I2C、DCMI等等外设的数据寄存器,存储器一般是指片内SRAM、外部存储器、片内Flash等等。外设到存储器传输。比如进行ADC采
发表于 2019-09-12
秉火429笔记之十五 DMA--直接存储区访问
秉火429笔记之十四 USART--串口通信
1. 串口通讯协议简介串口通讯(Serial Communication)是一种设备间常用的串行通讯方式,因为简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。1.1 物理层串口通讯的物理层有很多标准及变种,我们主要讲解RS-232标准 ,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。两个通讯设备的“DB9接口”之间通过串口信号线建立起连接,串口信号线中使用
发表于 2019-09-12
秉火429笔记之十四 USART--串口通信
秉火429笔记之九 中断应用概述
1. 中断类型在此不严格区分中断和异常,即简单的认为中断与异常一个概念。M4 内核搭载了异常响应系统,支持众多的系统异常和外部中断。其中,F429芯片,系统异常10个,外部中断91个。除个别异常的优先级固定外,其它均可编程。stm32f4xx.htypedef enum IRQn{/******  Cortex-M4 Processor Exceptions Numbers ****************************************************************/  NonMaskableInt_IRQn         =
发表于 2019-09-12
秉火429笔记之九 中断应用概述
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved