OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6262|回复: 0

关于stm32f750的QSPI的管教配置问题

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2019-6-12
在线时间
3 小时
发表于 2019-9-10 15:07:51 | 显示全部楼层 |阅读模式
1金钱
最近我有用到stm32f750的QSPI,驱动一个flash(W25Q128),
买的demo开发版是用的W25Q64.
但是我用该程序去驱动W25Q128就是驱动不起来。
请大家帮忙找找问题。
我现在比较不确定的点是:那个QSPi的管脚复用有两个:一个是GPIO_AF9_QUADSPI,一个是GPIO_AF10_QUADSPI。
我根据管脚的不一样,怎么确定用哪个呢?

以下是我用的板子的QSPI的驱动管脚:
#define QSPI_FLASH_SIZE                   23

#define QSPI_FLASH_CS_PIN                 GPIO_PIN_6               
#define QSPI_FLASH_CS_GPIO_PORT           GPIOB                  
#define QSPI_FLASH_CS_GPIO_CLK_ENABLE()   __GPIOB_CLK_ENABLE()
#define QSPI_FLASH_CS_GPIO_AF             GPIO_AF10_QUADSPI

#define QSPI_FLASH_CLK_PIN                 GPIO_PIN_2                  
#define QSPI_FLASH_CLK_GPIO_PORT           GPIOB                       
#define QSPI_FLASH_CLK_GPIO_ENABLE()       __GPIOB_CLK_ENABLE()
#define QSPI_FLASH_CLK_GPIO_AF             GPIO_AF9_QUADSPI
//qspi-bk1_io0
#define QSPI_FLASH_BK1_IO0_PIN             GPIO_PIN_11               
#define QSPI_FLASH_BK1_IO0_PORT            GPIOD                  
#define QSPI_FLASH_BK1_IO0_CLK_ENABLE()    __GPIOD_CLK_ENABLE()
#define QSPI_FLASH_BK1_IO0_AF              GPIO_AF10_QUADSPI
//qspi-bk1_io1
#define QSPI_FLASH_BK1_IO1_PIN             GPIO_PIN_12               
#define QSPI_FLASH_BK1_IO1_PORT            GPIOD                     
#define QSPI_FLASH_BK1_IO1_CLK_ENABLE()    __GPIOD_CLK_ENABLE()
#define QSPI_FLASH_BK1_IO1_AF              GPIO_AF10_QUADSPI
//qspi-bk1_io2
#define QSPI_FLASH_BK1_IO2_PIN             GPIO_PIN_2               
#define QSPI_FLASH_BK1_IO2_PORT            GPIOE                     
#define QSPI_FLASH_BK1_IO2_CLK_ENABLE()    __GPIOE_CLK_ENABLE()
#define QSPI_FLASH_BK1_IO2_AF              GPIO_AF9_QUADSPI
//qspi-bk1_io3
#define QSPI_FLASH_BK1_IO3_PIN             GPIO_PIN_13               
#define QSPI_FLASH_BK1_IO3_PORT            GPIOD                     
#define QSPI_FLASH_BK1_IO3_CLK_ENABLE()    __GPIOD_CLK_ENABLE()
#define QSPI_FLASH_BK1_IO3_AF              GPIO_AF9_QUADSPI


以下网上买得板子的QSPI的驱动管脚:这个复用配置是对的
#define QSPI_FLASH_SIZE                   22 //W25Q64

#define QSPI_FLASH_CS_PIN                 GPIO_PIN_6               
#define QSPI_FLASH_CS_GPIO_PORT           GPIOB                  
#define QSPI_FLASH_CS_GPIO_CLK_ENABLE()   __GPIOB_CLK_ENABLE()
#define QSPI_FLASH_CS_GPIO_AF             GPIO_AF10_QUADSPI

#define QSPI_FLASH_CLK_PIN                 GPIO_PIN_2                  
#define QSPI_FLASH_CLK_GPIO_PORT           GPIOB                       
#define QSPI_FLASH_CLK_GPIO_ENABLE()       __GPIOB_CLK_ENABLE()
#define QSPI_FLASH_CLK_GPIO_AF             GPIO_AF9_QUADSPI

//qspi-bk1_io0
#define QSPI_FLASH_BK1_IO0_PIN             GPIO_PIN_8               
#define QSPI_FLASH_BK1_IO0_PORT            GPIOF                  
#define QSPI_FLASH_BK1_IO0_CLK_ENABLE()    __GPIOF_CLK_ENABLE()
#define QSPI_FLASH_BK1_IO0_AF              GPIO_AF10_QUADSPI
//qspi-bk1_io1
#define QSPI_FLASH_BK1_IO1_PIN             GPIO_PIN_9               
#define QSPI_FLASH_BK1_IO1_PORT            GPIOF                     
#define QSPI_FLASH_BK1_IO1_CLK_ENABLE()    __GPIOF_CLK_ENABLE()
#define QSPI_FLASH_BK1_IO1_AF              GPIO_AF10_QUADSPI
//qspi-bk1_io2
#define QSPI_FLASH_BK1_IO2_PIN             GPIO_PIN_7               
#define QSPI_FLASH_BK1_IO2_PORT            GPIOF                     
#define QSPI_FLASH_BK1_IO2_CLK_ENABLE()    __GPIOF_CLK_ENABLE()
#define QSPI_FLASH_BK1_IO2_AF              GPIO_AF9_QUADSPI
//qspi-bk1_io3
#define QSPI_FLASH_BK1_IO3_PIN             GPIO_PIN_6               
#define QSPI_FLASH_BK1_IO3_PORT            GPIOF                     
#define QSPI_FLASH_BK1_IO3_CLK_ENABLE()    __GPIOF_CLK_ENABLE()
#define QSPI_FLASH_BK1_IO3_AF              GPIO_AF9_QUADSPI


//以下是配置程序
void qspi_flash_init(void)

{
    GPIO_InitTypeDef GPIO_InitStruct;

    /* 使能 QSPI 及 GPIO 时钟 */
    QSPI_FLASH_CLK_ENABLE();
    QSPI_FLASH_CLK_GPIO_ENABLE();
    QSPI_FLASH_BK1_IO0_CLK_ENABLE();
          QSPI_FLASH_BK1_IO1_CLK_ENABLE();
          QSPI_FLASH_BK1_IO2_CLK_ENABLE();
    QSPI_FLASH_BK1_IO3_CLK_ENABLE();
    QSPI_FLASH_CS_GPIO_CLK_ENABLE();

    //设置引脚
    /*!< 配置 QSPI_FLASH 引脚: CLK */
    GPIO_InitStruct.Pin = QSPI_FLASH_CLK_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStruct.Alternate = QSPI_FLASH_CLK_GPIO_AF;

    HAL_GPIO_Init(QSPI_FLASH_CLK_GPIO_PORT, &GPIO_InitStruct);

               
        /*!< 配置 QSPI_FLASH 引脚: IO0 */
    GPIO_InitStruct.Pin = QSPI_FLASH_BK1_IO0_PIN;
    GPIO_InitStruct.Alternate = QSPI_FLASH_BK1_IO0_AF;
    HAL_GPIO_Init(QSPI_FLASH_BK1_IO0_PORT, &GPIO_InitStruct);

        /*!< 配置 QSPI_FLASH 引脚: IO1 */
    GPIO_InitStruct.Pin = QSPI_FLASH_BK1_IO1_PIN;
    GPIO_InitStruct.Alternate = QSPI_FLASH_BK1_IO1_AF;
    HAL_GPIO_Init(QSPI_FLASH_BK1_IO1_PORT, &GPIO_InitStruct);

        /*!< 配置 QSPI_FLASH 引脚: IO2 */
    GPIO_InitStruct.Pin = QSPI_FLASH_BK1_IO2_PIN;
    GPIO_InitStruct.Alternate = QSPI_FLASH_BK1_IO2_AF;
    HAL_GPIO_Init(QSPI_FLASH_BK1_IO2_PORT, &GPIO_InitStruct);

        /*!< 配置 QSPI_FLASH 引脚: IO3 */
    GPIO_InitStruct.Pin = QSPI_FLASH_BK1_IO3_PIN;
    GPIO_InitStruct.Alternate = QSPI_FLASH_BK1_IO3_AF;
    HAL_GPIO_Init(QSPI_FLASH_BK1_IO3_PORT, &GPIO_InitStruct);

        /*!< 配置 SPI_FLASH_SPI 引脚: NCS */
    GPIO_InitStruct.Pin = QSPI_FLASH_CS_PIN;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Alternate = QSPI_FLASH_CS_GPIO_AF;
    HAL_GPIO_Init(QSPI_FLASH_CS_GPIO_PORT, &GPIO_InitStruct);

    /* QSPI_FLASH 模式配置 */
    QSPI_Handler.Instance = QUADSPI;
        /*二分频,时钟为216/(1+1)=108MHz */
    QSPI_Handler.Init.ClockPrescaler = 1;
        /*FIFO 阈值为 4 个字节*/
    QSPI_Handler.Init.FifoThreshold = 4;
        /*采样移位半个周期*/
    QSPI_Handler.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE;
        /*Flash大小为16M字节,2^24,所以取权值24-1=23*/
    QSPI_Handler.Init.FlashSize = QSPI_FLASH_SIZE;
        /*片选高电平保持时间,至少50ns,对应周期数6*9.2ns =55.2ns*/
    QSPI_Handler.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_6_CYCLE;
        /*时钟模式选择模式0,nCS为高电平(片选释放)时,CLK必须保持低电平*/
    QSPI_Handler.Init.ClockMode = QSPI_CLOCK_MODE_0;
        /*根据硬件连接选择第一片Flash*/
        QSPI_Handler.Init.FlashID = QSPI_FLASH_ID_1;
    HAL_QSPI_Init(&QSPI_Handler);
    /*初始化QSPI接口*/
        BSP_QSPI_Init();

}

uint8_t BSP_QSPI_Init(void)
{
        QSPI_CommandTypeDef s_command;
        uint8_t value = W25Q128FV_FSR_QE;
       
        /* QSPI存储器复位 */
        if (QSPI_ResetMemory() != QSPI_OK)
        {
                return QSPI_NOT_SUPPORTED;
        }
       
        /* 使能写操作 */
        if (QSPI_WriteEnable() != QSPI_OK)
        {
                return QSPI_ERROR;
        }       
        /* 设置四路使能的状态寄存器,使能四通道IO2和IO3引脚 */
        s_command.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
        s_command.Instruction       = WRITE_STATUS_REG2_CMD;
        s_command.AddressMode       = QSPI_ADDRESS_NONE;
        s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
        s_command.DataMode          = QSPI_DATA_1_LINE;
        s_command.DummyCycles       = 0;
        s_command.NbData            = 1;
        s_command.DdrMode           = QSPI_DDR_MODE_DISABLE;
        s_command.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
        s_command.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;
        /* 配置命令 */
        if (HAL_QSPI_Command(&QSPI_Handler, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
        {
                return QSPI_ERROR;
        }
        /* 传输数据 */
        if (HAL_QSPI_Transmit(&QSPI_Handler, &value, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
        {
                return QSPI_ERROR;
        }
        /* 自动轮询模式等待存储器就绪 */  
        if (QSPI_AutoPollingMemReady(W25Q128FV_SUBSECTOR_ERASE_MAX_TIME) != QSPI_OK)
        {
                return QSPI_ERROR;
        }
        return QSPI_OK;
}


请大神解读;并指出错误;



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-22 21:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表