×
单片机 > 单片机程序设计 > 详情

嵌入式stm32学习:SPI-读写串行FLASH

发布时间:2020-05-27 发布时间:
|

bsp_spi_flash.h


#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接口定义-开头****************************/

#define FLASH_SPI                           SPI5

#define FLASH_SPI_CLK                       RCC_APB2Periph_SPI5

#define FLASH_SPI_CLK_INIT                  RCC_APB2PeriphClockCmd


#define FLASH_SPI_SCK_PIN                   GPIO_Pin_7                  

#define FLASH_SPI_SCK_GPIO_PORT             GPIOF                       

#define FLASH_SPI_SCK_GPIO_CLK              RCC_AHB1Periph_GPIOF

#define FLASH_SPI_SCK_PINSOURCE             GPIO_PinSource7

#define FLASH_SPI_SCK_AF                    GPIO_AF_SPI5


#define FLASH_SPI_MISO_PIN                  GPIO_Pin_8                

#define FLASH_SPI_MISO_GPIO_PORT            GPIOF                   

#define FLASH_SPI_MISO_GPIO_CLK             RCC_AHB1Periph_GPIOF

#define FLASH_SPI_MISO_PINSOURCE            GPIO_PinSource8

#define FLASH_SPI_MISO_AF                   GPIO_AF_SPI5


#define FLASH_SPI_MOSI_PIN                  GPIO_Pin_9                

#define FLASH_SPI_MOSI_GPIO_PORT            GPIOF                      

#define FLASH_SPI_MOSI_GPIO_CLK             RCC_AHB1Periph_GPIOF

#define FLASH_SPI_MOSI_PINSOURCE            GPIO_PinSource9

#define FLASH_SPI_MOSI_AF                   GPIO_AF_SPI5


#define FLASH_CS_PIN                        GPIO_Pin_6               

#define FLASH_CS_GPIO_PORT                  GPIOF                     

#define FLASH_CS_GPIO_CLK                   RCC_AHB1Periph_GPIOF


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

#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 * SPIT_FLAG_TIMEOUT))


/*信息输出*/

#define FLASH_DEBUG_ON         1


#define FLASH_INFO(fmt,arg...)           printf("<> "fmt"n",##arg)

#define FLASH_ERROR(fmt,arg...)          printf("<> "fmt"n",##arg)

#define FLASH_DEBUG(fmt,arg...)          do{

                                          if(FLASH_DEBUG_ON)

                                          printf("<> [%d]"fmt"n",__LINE__, ##arg);

                                          }while(0)




void SPI_FLASH_Init(void);

void SPI_FLASH_SectorErase(u32 SectorAddr);

void SPI_FLASH_BulkErase(void);

void SPI_FLASH_PageWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite);

void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite);

void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead);

u32 SPI_FLASH_ReadID(void);

u32 SPI_FLASH_ReadDeviceID(void);

void SPI_FLASH_StartReadSequence(u32 ReadAddr);

void SPI_Flash_PowerDown(void);

void SPI_Flash_WAKEUP(void);



u8 SPI_FLASH_ReadByte(void);

u8 SPI_FLASH_SendByte(u8 byte);

u16 SPI_FLASH_SendHalfWord(u16 HalfWord);

void SPI_FLASH_WriteEnable(void);

void SPI_FLASH_WaitForWriteEnd(void);


#endif /* __SPI_FLASH_H */


bsp_spi_flash.c


#include "./flash/bsp_spi_flash.h"



static __IO uint32_t  SPITimeout = SPIT_LONG_TIMEOUT;   


static uint16_t SPI_TIMEOUT_UserCallback(uint8_t errorCode);


 /**

  * @brief  SPI_FLASH初始化

  */

void SPI_FLASH_Init(void)

{

  SPI_InitTypeDef  SPI_InitStructure;

  GPIO_InitTypeDef GPIO_InitStructure;


  /* 使能FLASH_SPI 及GPIO 时钟 */

  /*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO, 

       SPI_FLASH_SPI_MISO_GPIO,SPI_FLASH_SPI_SCK_GPIO 时钟使能 */

  RCC_AHB1PeriphClockCmd (FLASH_SPI_SCK_GPIO_CLK | FLASH_SPI_MISO_GPIO_CLK|FLASH_SPI_MOSI_GPIO_CLK|FLASH_CS_GPIO_CLK, ENABLE);


  /*!< SPI_FLASH_SPI 时钟使能 */

  FLASH_SPI_CLK_INIT(FLASH_SPI_CLK, ENABLE);


  //设置引脚复用

  GPIO_PinAFConfig(FLASH_SPI_SCK_GPIO_PORT,FLASH_SPI_SCK_PINSOURCE,FLASH_SPI_SCK_AF); 

    GPIO_PinAFConfig(FLASH_SPI_MISO_GPIO_PORT,FLASH_SPI_MISO_PINSOURCE,FLASH_SPI_MISO_AF); 

    GPIO_PinAFConfig(FLASH_SPI_MOSI_GPIO_PORT,FLASH_SPI_MOSI_PINSOURCE,FLASH_SPI_MOSI_AF); 


  /*!< 配置 SPI_FLASH_SPI 引脚: SCK */

  GPIO_InitStructure.GPIO_Pin = FLASH_SPI_SCK_PIN;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;  


  GPIO_Init(FLASH_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);


    /*!< 配置 SPI_FLASH_SPI 引脚: MISO */

  GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MISO_PIN;

  GPIO_Init(FLASH_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);


    /*!< 配置 SPI_FLASH_SPI 引脚: MOSI */

  GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MOSI_PIN;

  GPIO_Init(FLASH_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);  


    /*!< 配置 SPI_FLASH_SPI 引脚: CS */

  GPIO_InitStructure.GPIO_Pin = FLASH_CS_PIN;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

  GPIO_Init(FLASH_CS_GPIO_PORT, &GPIO_InitStructure);


  /* 停止信号 FLASH: CS引脚高电平*/

  SPI_FLASH_CS_HIGH();


  /* FLASH_SPI 模式配置 */

  // FLASH芯片 支持SPI模式0及模式3 据此设置CPOL CPHA

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

SP


关键字:stm32  SPI  读写串行FLASH

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析