admvip 发表于 2021-1-25 22:46

使用SPI1重映射无法读取W25Q64

使用的是F403A,W25Q64,用的403标准库的flash例程改的,闪存接403A SPI1口,管教重映射到PB.3 4 5引脚,编译后无法读取闪存。请教如下SPI初始化代码是否有问题?

uint8_t SpiFlash_Init(void)
{
GPIO_InitType GPIO_InitStructure;
SPI_InitTypeSPI_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_AFIO, ENABLE);        /*AFIO复用时钟开启*/
       
RCC_APB2PeriphClockCmd(SPIx_RCC_CLK | SPIx_GPIO_RCC_CLK, ENABLE);
RCC_AHBPeriphClockCmd(SPIx_DMA_RCC_CLK, ENABLE);
       
GPIO_PinsRemapConfig(GPIO_Remap01_SPI1, ENABLE);        /*SPI1 引脚重映射*/

/* Configure SPI_FLASH pins*/
GPIO_InitStructure.GPIO_Pins =SPIx_PIN_MOSI;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(SPIx_PORT_MOSI, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pins = SPIx_PIN_MISO;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(SPIx_PORT_MISO, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pins = SPIx_PIN_NSS;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;
GPIO_Init(SPIx_PORT_NSS, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pins =SPIx_PIN_SCK;
GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(SPIx_PORT_SCK, &GPIO_InitStructure);

FLASH_CS_HIGH();

muyichuan2012 发表于 2021-1-26 19:40

你好,请把spi_flash.h的宏定义也贴一下

admvip 发表于 2021-1-27 10:05

谢谢回复!

这是spi_flash.h宏定义部分的代码

/* SPI define ----------------------------------------------------------------*/
/*
* SPI_MODE
* 0 --> DMA
* 1 --> pooling
*/
#define SPI_MODE                1

#define BUF_SIZE                SPIF_PAGE_SIZE
#define FLASH_SPI               SPI1
#define SPIx_RCC_CLK            RCC_APB2PERIPH_SPI1
#define SPIx_GPIO_RCC_CLK       RCC_APB2PERIPH_GPIOB
#define SPIx_PIN_NSS            GPIO_Pins_9
#define SPIx_PORT_NSS         GPIOB
#define SPIx_PIN_SCK            GPIO_Pins_3
#define SPIx_PORT_SCK         GPIOB
#define SPIx_PIN_MISO         GPIO_Pins_4
#define SPIx_PORT_MISO          GPIOB
#define SPIx_PIN_MOSI         GPIO_Pins_5
#define SPIx_PORT_MOSI          GPIOB

#define SPIx_DMA                DMA1
#define SPIx_DMA_RCC_CLK      RCC_AHBPERIPH_DMA1
#define SPIx_Rx_DMA_Channel   DMA1_Channel2
#define SPIx_Rx_DMA_FLAG      DMA1_FLAG_TC2
#define SPIx_Tx_DMA_Channel   DMA1_Channel3
#define SPIx_Tx_DMA_FLAG      DMA1_FLAG_TC3

#define FLASH_CS_HIGH()         GPIO_SetBits(SPIx_PORT_NSS, SPIx_PIN_NSS)
#define FLASH_CS_LOW()          GPIO_ResetBits(SPIx_PORT_NSS, SPIx_PIN_NSS)

admvip 发表于 2021-1-27 11:40

顺便上传项目附件,这是标注库403A SPI例子里面外部flash的例子改的。

林堪堪 发表于 2021-1-27 14:38

PB3/4跟SWJTAG相关引脚重了,MCU上电默认是给SWJTAG用的。需要关闭JTAG或者SW,腾出PB3/4给SPI用。
加上这句:GPIO_PinsRemapConfig(AFIO_MAP7_SWJTAG_0010, ENABLE);

admvip 发表于 2021-1-28 16:31

林堪堪 发表于 2021-1-27 14:38
PB3/4跟SWJTAG相关引脚重了,MCU上电默认是给SWJTAG用的。需要关闭JTAG或者SW,腾出PB3/4给SPI用。
加上这 ...

非常感谢您的热心解答,确实如您所述,PB3 4引脚别占用,加上您给的重映射函数后,就正常工作了,看来单独重映射SPI1步骤是不完整的。

小白儿 发表于 2021-2-27 11:44

谢谢
页: [1]
查看完整版本: 使用SPI1重映射无法读取W25Q64