ZHCAFK3 July   2025 AM625 , AM62P

 

  1.   1
  2.   摘要
  3.   商标
  4. 1简介
  5. 2访问 SPI NOR 闪存寄存器
    1. 2.1 修改 U-Boot 源代码,以在 U-Boot 控制台中访问 NOR 闪存寄存器
    2. 2.2 修改 MCU Plus 和 RTOS SDK 源代码,以访问 NOR 闪存寄存器
  6. 3调试 NOR 闪存的使用示例
    1. 3.1 在 U-Boot 控制台中读取和写入 NOR Flash 寄存器
    2. 3.2 在 MCU Plus SDK 中读写 NOR Flash 寄存器
  7. 4总结
  8. 5参考资料

修改 MCU Plus 和 RTOS SDK 源代码,以访问 NOR 闪存寄存器

在 MCU Plus SDK 中,某些闪存需要额外的配置才能完全正常工作。混合扇区配置就是例子。这是一个添加此类特性的挂钩,在闪存驱动程序中打开函数的末尾调用此处提到的函数。在 MCU plus SDK 中,该默认函数位于 ~/ /source/board/flash/ospi/flash_nor_ospi.c,名称为 Flash_quirkSpansionUNHYSADisable()。使用此函数添加一些调试信息,以帮助解决与 NOR 闪存相关的问题。使用以下示例,添加寄存器打印,并在驱动器中将 NOR 闪存模式从统一模式更改为混合顶部模式。

注意以下步骤:

  1. 使用易失性寄存器地址进行读取;使用非易失性寄存器地址进行写入。
  2. 请勿随意修改(写入)NOR 闪存寄存器。在更改配置寄存器的值之前,请联系 NOR 闪存供应商,并提交 E2E 工单,以确认更改。
  3. 使用以下模板(首先读出,不相等时再写入)写入寄存器,以避免多次写入。使用以下代码,强制 NOR FLASH 进入统一模式。
void loop_forever()
{
    volatile uint32_t loop = 1;
    while(loop)
        ;
}
int32_t Flash_quirkSpansionUNHYSADisable(Flash_Config *config)
{
    int32_t status = SystemP_SUCCESS;
    uint8_t regData = 0x00;
uint32_t write = 0;
status |= Flash_norOspiRegRead(config, 0x65, 0x00800002, &regData);
DebugP_log("Value of Configuration Register 1: %u \r\n", regData);
regData = 0x00;
status |= Flash_norOspiRegRead(config, 0x65, 0x00800004, &regData);
DebugP_log("Value of Configuration Register 3: %u \r\n", regData);
    /* Hybrid Sector Disable */
    status = Flash_norOspiRegRead(config, 0x65, 0x00800004, &regData);
        if((regData & ((uint8_t)(1 << 3))) == 0)
        {
            /* Set UNHYSA bit */
            regData |= (1 << 3);
            write = 1U;
        }
        else
        {
            /* No action */
        }
    if(write)
    {
        status = Flash_norOspiRegWrite(config, 0x71, 0x04, regData);
}
regData = 0x00;
status = Flash_norOspiRegRead(config, 0x65, 0x00800000, &regData);
    if(regData!=0)
    {
DebugP_log("ERROR!!!!!! Need Reset board, State Register1 !=0. Value of State Register 1: %u \r\n", regData);
loop_forever();
}
return status;
}

打开闪存驱动程序后,将打印调试信息。