打印
[AT32F403/403A]

使用SPI1重映射无法读取W25Q64

[复制链接]
925|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
admvip|  楼主 | 2021-1-25 22:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
使用的是F403A,W25Q64,用的403标准库的flash例程改的,闪存接403A SPI1口,管教重映射到PB.3 4 5引脚,编译后无法读取闪存。请教如下SPI初始化代码是否有问题?

uint8_t SpiFlash_Init(void)
{
  GPIO_InitType GPIO_InitStructure;
  SPI_InitType  SPI_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的例子改的。
W25Q_Flash.zip (2.65 MB)

使用特权

评论回复
5
林堪堪| | 2021-1-27 14:38 | 只看该作者
PB3/4跟SWJTAG相关引脚重了,MCU上电默认是给SWJTAG用的。需要关闭JTAG或者SW,腾出PB3/4给SPI用。
加上这句:GPIO_PinsRemapConfig(AFIO_MAP7_SWJTAG_0010, ENABLE);

2.png (5.78 KB )

2.png

使用特权

评论回复
6
admvip|  楼主 | 2021-1-28 16:31 | 只看该作者
林堪堪 发表于 2021-1-27 14:38
PB3/4跟SWJTAG相关引脚重了,MCU上电默认是给SWJTAG用的。需要关闭JTAG或者SW,腾出PB3/4给SPI用。
加上这 ...

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

使用特权

评论回复
7
小白儿| | 2021-2-27 11:44 | 只看该作者
谢谢

使用特权

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

本版积分规则

6

主题

87

帖子

1

粉丝