STM32
直播中

刘高

10年用户 958经验值
擅长:嵌入式技术
私信 关注
[问答]

求助,关于STM32F407通过FSMC访问NAND FLASH问题求解

问题描述:STM32F407通过FSMC外设访问三星NAND FLASH,系统时钟是168MHz,始化外设GPI0D的PD0、PD1、PD3、PD4、PD6、PD11、PD12、PD14、PD15,还有PE的PE7、PE8、PE9、PE10等时钟及GPIO复用,设置FSMC对应的bank2或bank3,访问NAND FLASH ID 时,函数如下:
void FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID)
{
    /* Send Command to the command area */
    *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_READID;
        /* Send Address to the address area */
    *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00;

    /* Sequence to read ID from NAND flash */
    NAND_ID->Maker_ID   = *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);
    NAND_ID->Device_ID  = *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);
    NAND_ID->Third_ID   = *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);
    NAND_ID->Fourth_ID  = *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);
    NAND_ID->Fifth_ID   = *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);
}

程序能够正常单步执行 *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_READID;
单步执行*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00时,程序就有问题,不能正常执行,像是跑别的地方去了,停止仿真时,程序指向复位中断。
上述问题,不仅仅是访问NAND FLASH ID出现,执行擦除函数时也是这样,执行第一句函数正常,但是执行第二句就有问题,不知何故,请高手指教,谢谢。

回帖(1)

贾永世

2024-5-9 16:15:01

首先,您需要确保已经正确配置了FSMC的时钟、GPIO复用和初始化了NAND FLASH。以下是一些关键步骤:

1. 配置系统时钟:确保HCLK和内存时钟已经设置为合适的值。

2. 配置GPIO复用:根据您的描述,您已经配置了GPIO复用,但请确保所有与NAND FLASH连接的引脚都已正确配置。

3. 初始化FSMC:设置FSMC的时钟、地址和数据线,以及NAND FLASH的访问模式(如同步或异步)。

4. 初始化NAND FLASH:发送适当的命令以初始化NAND FLASH,例如发送NAND_CMD_READID以读取设备ID。

关于您提供的函数,它看起来是用于读取NAND FLASH的设备ID的。但是,函数中的代码不完整,我将为您提供一个更完整的示例:

```c
void FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID)
{
    /* Send Command to the command area */
    *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_READID;

    /* Wait for the NAND FLASH to process the command */
    // 这里可以添加一个延时或检查NAND FLASH的状态寄存器以确保命令已被处理

    /* Read the NAND FLASH ID */
    NAND_ID->Maker_Id = *(vu8 *)(NAND_FLASH_START_ADDR | 0x00);
    NAND_ID->Device_Id = *(vu8 *)(NAND_FLASH_START_ADDR | 0x01);
    NAND_ID->Third_Id = *(vu8 *)(NAND_FLASH_START_ADDR | 0x02);
    NAND_ID->Fourth_Id = *(vu8 *)(NAND_FLASH_START_ADDR | 0x03);
}
```

请注意,您可能需要根据您的具体硬件配置和NAND FLASH型号调整上述代码。此外,确保在读取ID之前已经正确初始化了FSMC和NAND FLASH。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分