STM32
直播中

蒋美燕

7年用户 901经验值
私信 关注
[问答]

STM32通过FSMC控制NAND FLASH的COPY-BACK命令使用,无法复制数据的原因?

本人使用STM32F103ZET7,通过FSMC总线控制NAND FLASH 芯片K9F1208,能够正常读、写、擦除以及读取状态等,但是在COPY-BACK这个功能上遇到了问题,貌似无法复制数据。我的代码如下,麻烦哪位大神遇到过这个问题赐教一下:

uint32_t NAND_CopyBack(NAND_ADDRESS SourAdd, NAND_ADDRESS DestAdd)
{
    *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_AREA_A;

    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00;
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS(SourAdd));
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS(SourAdd));
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS(SourAdd));

    *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_CPYBAK;
   
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = 0x00;
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS(DestAdd));
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS(DestAdd));
    *(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(ROW_ADDRESS(DestAdd));
   
    *(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE_TRUE1;
   
    return (NAND_GetStatus());
}





回帖(1)

刘艳

2024-5-10 16:57:06
在分析这个问题之前,我们先了解一下STM32通过FSMC控制NAND FLASH的COPY-BACK命令的基本原理。COPY-BACK命令是一种用于在NAND FLASH内部复制数据的命令,它可以在不经过CPU的情况下,直接在NAND FLASH内部进行数据复制,从而提高数据传输的效率。

根据您提供的代码片段,我将逐步分析可能导致无法复制数据的原因:

1. 首先,确保您的NAND FLASH芯片K9F1208支持COPY-BACK命令。不同的NAND FLASH芯片可能支持不同的命令集,因此请查阅K9F1208的数据手册以确认其是否支持该命令。

2. 检查FSMC初始化配置。确保FSMC的时钟、地址、数据和控制线都已正确配置,以便与NAND FLASH进行通信。

3. 检查NAND_ADDRESS SourAdd和NAND_ADDRESS DestAdd参数。确保这两个地址是有效的NAND FLASH地址,并且它们指向的块、页面和扇区都是可读写的。

4. 检查CMD_AREA和ADDR_AREA的定义。确保这些宏定义正确地映射到了NAND FLASH的命令和地址寄存器。

5. 检查您的代码中是否正确地发送了COPY-BACK命令。根据K9F1208的数据手册,COPY-BACK命令的发送步骤如下:

   a. 发送NAND_CMD_AREA_A命令到CMD_AREA。
   b. 发送源地址的第1个周期到ADDR_AREA。
   c. 发送NAND_CMD_AREA_C命令到CMD_AREA。
   d. 发送目标地址的第1个周期到ADDR_AREA。
   e. 发送NAND_CMD_AREA_TRUE1命令到CMD_AREA。

   请确保您的代码遵循了这些步骤。

6. 检查NAND FLASH的状态。在执行COPY-BACK命令之前,您需要检查NAND FLASH的状态,确保它处于可执行该命令的状态。您可以使用NAND_ReadStatus()函数来读取状态寄存器。

7. 检查您的代码中是否有其他潜在的错误,例如内存泄漏、数组越界等。

8. 如果以上步骤都无法解决问题,您可以尝试使用NAND FLASH的制造商提供的示例代码或库,以确保您的操作是正确的。

总之,要解决这个问题,您需要确保NAND FLASH芯片支持COPY-BACK命令,FSMC配置正确,地址参数有效,命令发送步骤正确,以及NAND FLASH的状态正确。希望这些建议能帮助您解决问题。
举报

更多回帖

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