注意:此型号的JEDEC ID是0xEF6018,不同于网上满天飞的驱动,调试此器件驱动一定要确认。
官方SDK里面的驱动有问题,读写数据乱码,个人感觉是完全搬运野火电子的,因为除了名不一样,格式一毛一样。
drv_spi.h
#ifndef _DRV_SPI_H_
#define _DRV_SPI_H_
#ifdef __cplusplus
extern "C" {
#endif
// Includes ---------------------------------------------------------------------
#include "cm32m101a.h"
// Public macros / types / typedef ----------------------------------------------
#define sFLASH_DUMMY_BYTE 0xA5
#define sFLASH_SPI_PAGESIZE 0x100
#define sFLASH_SPI SPI1
#define sFLASH_SPI_CLK RCC_APB2_PERIPH_SPI1
#define sFLASH_SPI_SCK_PIN GPIO_PIN_5 /* PA.05 */
#define sFLASH_SPI_SCK_GPIO_PORT GPIOA /* GPIOA */
#define sFLASH_SPI_SCK_GPIO_CLK RCC_APB2_PERIPH_GPIOA
#define sFLASH_SPI_MISO_PIN GPIO_PIN_6 /* PA.06 */
#define sFLASH_SPI_MISO_GPIO_PORT GPIOA /* GPIOA */
#define sFLASH_SPI_MISO_GPIO_CLK RCC_APB2_PERIPH_GPIOA
#define sFLASH_SPI_MOSI_PIN GPIO_PIN_7 /* PA.07 */
#define sFLASH_SPI_MOSI_GPIO_PORT GPIOA /* GPIOA */
#define sFLASH_SPI_MOSI_GPIO_CLK RCC_APB2_PERIPH_GPIOA
#define sFLASH_CS_PIN GPIO_PIN_4 /* PA.04 */
#define sFLASH_CS_GPIO_PORT GPIOA /* GPIOA */
#define sFLASH_CS_GPIO_CLK RCC_APB2_PERIPH_GPIOA
/**
* @brief Select sFLASH: Chip Select pin low
*/
#define sFLASH_CS_LOW() GPIO_ResetBits(sFLASH_CS_GPIO_PORT, sFLASH_CS_PIN)
/**
* @brief Deselect sFLASH: Chip Select pin high
*/
#define sFLASH_CS_HIGH() GPIO_SetBits(sFLASH_CS_GPIO_PORT, sFLASH_CS_PIN)
// Public functions prototypes --------------------------------------------------
void drv_spi_init(void);
uint16_t sFLASH_SendHalfWord(uint16_t HalfWord);
void sFLASH_WriteEnable(void);
void sFLASH_WaitForWriteEnd(void);
void sFLASH_LowLevel_DeInit(void);
void sFLASH_LowLevel_Init(void);
u8 SPI1_ReadWriteByte(u8 byte);
#ifdef __cplusplus
}
#endif
#endif
drv_spi.c
// Includes ---------------------------------------------------------------------
#include "drv_spi.h"
#include "drv_systicks.h"
// Private macros / types / typedef ---------------------------------------------
// Private variables ------------------------------------------------------------
// Private constants ------------------------------------------------------------
// Public variables -------------------------------------------------------------
// Public constants -------------------------------------------------------------
// Private functions prototypes -------------------------------------------------
// Private Functions ------------------------------------------------------------
void sFLASH_LowLevel_DeInit(void)
{
GPIO_InitType GPIO_InitStructure;
/*!< Disable the sFLASH_SPI */
SPI_Enable(sFLASH_SPI, DISABLE);
/*!< DeInitializes the sFLASH_SPI */
SPI_I2S_DeInit(sFLASH_SPI);
/*!< sFLASH_SPI Periph clock disable */
RCC_EnableAPB2PeriphClk(sFLASH_SPI_CLK, DISABLE);
/*!< Configure sFLASH_SPI pins: SCK */
GPIO_InitStructure.Pin = sFLASH_SPI_SCK_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Input;
GPIO_InitPeripheral(sFLASH_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure sFLASH_SPI pins: MISO */
GPIO_InitStructure.Pin = sFLASH_SPI_MISO_PIN;
GPIO_InitPeripheral(sFLASH_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure sFLASH_SPI pins: MOSI */
GPIO_InitStructure.Pin = sFLASH_SPI_MOSI_PIN;
GPIO_InitPeripheral(sFLASH_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
/*!< Configure sFLASH_CS_PIN pin: sFLASH Card CS pin */
GPIO_InitStructure.Pin = sFLASH_CS_PIN;
GPIO_InitPeripheral(sFLASH_CS_GPIO_PORT, &GPIO_InitStructure);
}
/**
* @brief Initializes the peripherals used by the SPI FLASH driver.
*/
void sFLASH_LowLevel_Init(void)
{
GPIO_InitType GPIO_InitStructure;
GPIO_InitStruct(&GPIO_InitStructure);
/*!< sFLASH_SPI_CS_GPIO, sFLASH_SPI_MOSI_GPIO, sFLASH_SPI_MISO_GPIO
and sFLASH_SPI_SCK_GPIO Periph clock enable */
RCC_EnableAPB2PeriphClk(
sFLASH_CS_GPIO_CLK | sFLASH_SPI_MOSI_GPIO_CLK | sFLASH_SPI_MISO_GPIO_CLK | sFLASH_SPI_SCK_GPIO_CLK, ENABLE);
/*!< sFLASH_SPI Periph clock enable */
RCC_EnableAPB2PeriphClk(sFLASH_SPI_CLK|RCC_APB2_PERIPH_AFIO, ENABLE);
/*!< Con