打印
[STM32L4]

STM32降频后SPIFLASH读写异常

[复制链接]
514|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyf部长|  楼主 | 2020-10-11 22:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32L431单片机,如果一开机就跑80MHZ,SpiFlash读写正常。
如果一开机就跑20MHZ,SpiFlash读写也正常。

但是一旦启用智能低功耗模式,从80M切换到20MHZ,,,按照上电的统一代码流程,复位了SPI接口,重新初始化SPI,但是SpiFlash读写偶尔出现异常。

使用特权

评论回复
沙发
xxrs| | 2020-10-11 22:23 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
zyf部长|  楼主 | 2020-10-11 22:28 | 只看该作者

SpiFlash芯片初始化函数如下:
HAL_StatusTypeDef  bsp_w25qxx_init(void)
{
        GPIO_InitTypeDef  GPIO_InitStruct;
        
        /*## Enable peripherals and GPIO Clocks #################################*/
        //Enable GPIO clock
        __HAL_RCC_GPIOB_CLK_ENABLE();
        //Enable SPI2 clock
        __HAL_RCC_SPI2_CLK_ENABLE();
        
        /*## Configure peripheral GPIO ##########################################*/  
        //SPI CS GPIO pin configuration
        //PB2-power, PB12-CS,
        GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_12;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
        //PB2-power-on
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
        HAL_GPIO_WritePin(W25QXX_HWCS_GPIO_PORT, W25QXX_HWCS_PIN, GPIO_PIN_SET);
        //SPI SCK MOSI MISO GPIO pin configuration
        //PB13-SCK, PB14-MISO, PB15-MOSI
        GPIO_InitStruct.Pin       = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
        GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull      = GPIO_PULLDOWN;
        GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
        
        /*## Configure the SPI peripheral #######################################*/
        //Set the SPI parameters
        SpiDataFlashHandle.Instance               = SPI2;
        HAL_SPI_DeInit(&SpiDataFlashHandle);//SPI-DeInit
        __HAL_RCC_SPI2_FORCE_RESET();
        __HAL_RCC_SPI2_RELEASE_RESET();
        if(UserUsageCfg.LowPowerRunFlag){
                SpiDataFlashHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//20M/2=10M, STM32L4 SPI2 MaxCLK <= 40M
        }else{
                SpiDataFlashHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;//80M/4=20M, STM32L4 SPI2 MaxCLK <= 40M
        }
        SpiDataFlashHandle.Init.Direction         = SPI_DIRECTION_2LINES;
        SpiDataFlashHandle.Init.CLKPhase          = SPI_PHASE_1EDGE;
        SpiDataFlashHandle.Init.CLKPolarity       = SPI_POLARITY_LOW;
        SpiDataFlashHandle.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;
        SpiDataFlashHandle.Init.CRCPolynomial     = 7;
        SpiDataFlashHandle.Init.DataSize          = SPI_DATASIZE_8BIT;
        SpiDataFlashHandle.Init.FirstBit          = SPI_FIRSTBIT_MSB;
        SpiDataFlashHandle.Init.NSS               = SPI_NSS_SOFT;
        SpiDataFlashHandle.Init.TIMode            = SPI_TIMODE_DISABLE;
        SpiDataFlashHandle.Init.Mode              = SPI_MODE_MASTER;
        if(HAL_SPI_Init(&SpiDataFlashHandle) != HAL_OK)        {
                return HAL_ERROR;//Initialization Error
        }else{
                return HAL_OK;
        }
}

使用特权

评论回复
地板
zyf部长|  楼主 | 2020-10-11 22:31 | 只看该作者
应该是SPI重新配置后,哪里没配置成功吧;

使用特权

评论回复
5
wangpe| | 2020-10-11 22:36 | 只看该作者
用示波器先看下相关的引脚

使用特权

评论回复
6
huwr| | 2020-10-11 22:42 | 只看该作者
SPI本身跟频率无关,看看相关初始化函数。

使用特权

评论回复
7
morrisk| | 2020-10-11 22:45 | 只看该作者
初始化之后延时一段时间试试

使用特权

评论回复
8
xxrs| | 2020-10-11 22:50 | 只看该作者
应该不是降频的问题  等待一个周期之后在看看是不是还是异常

使用特权

评论回复
9
zyf部长|  楼主 | 2020-10-11 22:54 | 只看该作者

好的,我明天去单位试一下,多谢各位大侠了哈

使用特权

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

本版积分规则

694

主题

7102

帖子

8

粉丝