打印
[STM32F1]

IO模拟SPI _读写 SPI FLASH-25Q32

[复制链接]
472|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangchui|  楼主 | 2021-5-9 19:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

/******************** (C) COPYRIGHT ********************
* 文件名  :spi_flash.c
* 描述    :spi 底层应用函数库      
* 硬件连接 ----------------------------
*         | PC8-SPI2-NSS  : W25X40-CS  |
*         | PD14-SPI2-SCK  : W25X40-CLK |
*         | PC7-SPI2-MISO : W25X40-DO  |
*         | PD13-SPI2-MOSI : W25X40-DIO |
*         | PC6-WRITE    : W25X40-DIO |
*         | PD15-HOLD    : W25X40-DIO |
*          ----------------------------
* 库版本  :ST3.0.0
*
* 作者    :
* 博客    :
**********************************************************************************/
#include "spi_flash.h"
#include "gpio.h"

/* Private typedef -----------------------------------------------------------*/
//#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

使用特权

评论回复
沙发
huangchui|  楼主 | 2021-5-9 19:10 | 只看该作者

void SPI_FLASH_Write_Protect_ENABLE(void)//flash 打开写保护
{
  SPI_FLASH_Write_Protect_Assert();
}

使用特权

评论回复
板凳
huangchui|  楼主 | 2021-5-9 19:12 | 只看该作者
void SPI_FLASH_Write_Protect_DISABLE(void)//flash 关闭写保护
{
  SPI_FLASH_Write_Protect_Deassert();
}

使用特权

评论回复
地板
huangchui|  楼主 | 2021-5-9 19:14 | 只看该作者
void SPI_FLASH_Hold_ENABLE(void)//flash HOLD ENABLE
{
  SPI_FLASH_Hold_Assert();
}

使用特权

评论回复
5
huangchui|  楼主 | 2021-5-9 19:16 | 只看该作者
void SPI_FLASH_Hold_DISABLE(void)//flash HOLD DISABLE
{
  SPI_FLASH_Hold_Deassert();
}

使用特权

评论回复
6
huangchui|  楼主 | 2021-5-9 19:17 | 只看该作者

/*******************************************************************************
* Function Name  : SPI_FLASH_Init
* Description    : Initializes the peripherals used by the SPI FLASH driver.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_FLASH_Init(void)
{
#ifdef _BOARD  //DEMO Board

GpioInitTypeDef gpioInitStr;   
   
    // 初始化模拟SPI的IO口
    // SPI_FLASH_SCK_S  PA5
        gpioInitStr.GpioPin = SPI_FLASH_SCK_PIN_S;
        gpioInitStr.GpioSpeed = GpioSpeed2MHz;
        gpioInitStr.GpioMode = Gpio_Mode_Out_PP;
        GpioInit(SPI_FLASH_SCK_PORT_S, &gpioInitStr);
    // SPI_FLASH_MOSI_S PA7
           gpioInitStr.GpioPin = SPI_FLASH_MOSI_PIN_S;
        GpioInit(SPI_FLASH_MOSI_PORY_S, &gpioInitStr);
    // SPI_FLASH_NSS_S  PA4
    gpioInitStr.GpioPin = SPI_FLASH_NSS_PIN_S;
        GpioInit(SPI_FLASH_NSS_PORT_S, &gpioInitStr);
   
    // SPI_FLASH_MISO_S PA6
           gpioInitStr.GpioPin = SPI_FLASH_MISO_PIN_S;
        gpioInitStr.GpioMode = Gpio_Mode_IN_FLOATING;
      //gpioInitStr.GpioMode = Gpio_Mode_IPU;
        GpioInit(SPI_FLASH_MISO_PORY_S, &gpioInitStr);
        
#else  
#ifdef SPI_FLASH_HAL  
  
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  
  /* Enable SPI1 and GPIO clocks */
  /*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,
       SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO
       and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */
  // spi2管脚重映射
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);

  /*!< SPI_FLASH_SPI Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  /*!< AFIO Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  
  
  /*!< Configure SPI_FLASH_SPI pins: SCK */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /*!< Configure SPI_FLASH_SPI pins: MISO */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /*!< Configure SPI_FLASH_SPI pins: MOSI */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /*!< Configure SPI_FLASH_SPI_CS_PIN pin: SPI_FLASH Card CS pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();

  /* SPI1 configuration */
  // W25X40: data input on the DIO pin is sampled on the rising edge of the CLK.
  // Data on the DO and DIO pins are clocked out on the falling edge of CLK.
  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;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  //高位先发
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI2, &SPI_InitStructure);

  /* Enable SPI1  */
  SPI_Cmd(SPI2, ENABLE);
  
#else
    GpioInitTypeDef gpioInitStr;   
   
    // 初始化模拟SPI的IO口
    // SPI_FLASH_SCK_S  PD14
        gpioInitStr.GpioPin = SPI_FLASH_SCK_PIN_S;
        gpioInitStr.GpioSpeed = GpioSpeed2MHz;
        gpioInitStr.GpioMode = Gpio_Mode_Out_PP;
        GpioInit(SPI_FLASH_SCK_PORT_S, &gpioInitStr);
    // SPI_FLASH_MOSI_S PD13
           gpioInitStr.GpioPin = SPI_FLASH_MOSI_PIN_S;
        GpioInit(SPI_FLASH_MOSI_PORY_S, &gpioInitStr);
    // SPI_FLASH_NSS_S  PC8
    gpioInitStr.GpioPin = SPI_FLASH_NSS_PIN_S;
        GpioInit(SPI_FLASH_NSS_PORT_S, &gpioInitStr);
   
    // SPI_FLASH_MISO_S PC7
           gpioInitStr.GpioPin = SPI_FLASH_MISO_PIN_S;
        gpioInitStr.GpioMode = Gpio_Mode_IN_FLOATING;
      //gpioInitStr.GpioMode = Gpio_Mode_IPU;
        GpioInit(SPI_FLASH_MISO_PORY_S, &gpioInitStr);
#endif   
  
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
      //Write_Protect PC6
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;        
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
      //Hold  PD15
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;        
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
        
        SPI_FLASH_Write_Protect_DISABLE();//flash 关闭写保护
        SPI_FLASH_Hold_DISABLE();//flash HOLD DISABLE
#endif        
        
}

使用特权

评论回复
7
xiaoqizi| | 2021-6-2 15:02 | 只看该作者
spi本来就挺好用的 为什么要模拟呢

使用特权

评论回复
8
木木guainv| | 2021-6-2 15:05 | 只看该作者
实测运行稳定吗

使用特权

评论回复
9
磨砂| | 2021-6-2 15:35 | 只看该作者
代码配置需求比较多

使用特权

评论回复
10
晓伍| | 2021-6-2 15:39 | 只看该作者
模拟spi调试的时候顺手吗

使用特权

评论回复
11
八层楼| | 2021-6-2 15:43 | 只看该作者
请问如何调整时序呢

使用特权

评论回复
12
東南博士| | 2021-6-2 15:43 | 只看该作者
学习学习!

感觉还是硬件比较好!

使用特权

评论回复
13
观海| | 2021-6-2 15:46 | 只看该作者
定义那么多id是用来干嘛的呢

使用特权

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

本版积分规则

918

主题

12323

帖子

4

粉丝