痞子衡嵌入式:简析i.MXRT1170 XECC功能特点及其保护串行NOR Flash和SDRAM之道 (2)

  芯片出厂,默认是没有激活 XECC 特性的,如果需要开启 XECC,需要烧写 efuse,fusemap 中 0x840[3] 对应的是 XECC_ENABLE bit,我们需要将这个 bit 烧写成 1,才能激活 XECC 特性。

痞子衡嵌入式:简析i.MXRT1170 XECC功能特点及其保护串行NOR Flash和SDRAM之道

2.2 初始化存储器接口外设

  在初始化 XECC 模块之前一般先初始化存储器接口外设,这里我们先初始化 FlexSPI1,因为测试板卡 MIMXRT1170-EVK 上默认是 FlexSPI1 连接的串行 NOR Flash。

void init_flexspi_flash(void) { flexspi_nor_flash_init(FLEXSPI1); // 尽量等待 FlexSPI 总线空闲再退出 if ((FLEXSPI1->MCR0 & FLEXSPI_MCR0_MDIS_MASK) != FLEXSPI_MCR0_MDIS_MASK) { while (!FLEXSPI_GetBusIdleStatus(FLEXSPI1)); } FLEXSPI_SoftwareReset(FLEXSPI1); } 2.3 SDK驱动初始化XECC

  然后可以直接利用 SDK 里的 fsl_xecc 驱动对 XECC 模块进行初始化,代码非常简单,如下示例代码就是初始化 XECC_FLEXSPI1,使能 0x30000000 - 0x30000FFF 区域的读写 ECC 功能:

#include "fsl_xecc.h" void init_flexspi_xecc(void) { xecc_config_t config; XECC_GetDefaultConfig(&config); // 同时使能读写 XECC config.enableXECC = true; config.enableWriteECC = true; config.enableReadECC = true; // 设置 ECC 区域(0x30000000 - 0x30000FFF) config.Region0BaseAddress = FlexSPI1_AMBA_BASE; config.Region0EndAddress = FlexSPI1_AMBA_BASE + 0x1000; // 初始化 XECC 模块 XECC_Init(XECC_FLEXSPI1, config); } 2.4 AHB方式读写ECC目标区域

  最后就是利用 《其实i.MXRT下改造FlexSPI driver同样支持AHB方式去写入NOR Flash》 一文 3.3 节里的 flexspi_nor_flash_program() 函数来对 Flash 做 AHB 方式的写入,以激活 XECC 工作。为了验证 XECC 是否工作正常,可以分别用 IPG 和 AHB 方式读回写入的区域看最终结果。

SDK_ALIGN(static uint8_t s_nor_program_buffer[256], 4); static uint8_t s_nor_ipg_read_buffer[256]; static uint8_t s_nor_ahb_read_buffer[256]; void test_flash_ecc_rw(void) { // 擦除 Flash 0x30000000 开始的 4KB 区域(1个Sector) flexspi_nor_flash_erase_sector(FLEXSPI1, 0x0); for (uint32_t i = 0; i < 0xFFU; i++) { s_nor_program_buffer[i] = i; } // AHB 方式写 256 字节数据进 Flash 0x30000000 开始的地址 flexspi_nor_flash_program(FLEXSPI1, 0x30000000, s_nor_program_buffer, 256); DCACHE_CleanInvalidateByRange(0x30000000, 0x1000); // IPG 方式从 Flash 0x30000000 开始的地址读出 256 字节数据 flexspi_nor_flash_read(FLEXSPI1, 0x0, (void *)s_nor_ipg_read_buffer, 256); // AHB 方式从 Flash 0x30000000 开始的地址读出 256 字节数据 memcpy((void *)s_nor_ahb_read_buffer, (void *)0x30000000, 256); }

痞子衡嵌入式:简析i.MXRT1170 XECC功能特点及其保护串行NOR Flash和SDRAM之道

  至此,简析i.MXRT1170 XECC功能特点及其保护串行NOR Flash和SDRAM之道痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:简析i.MXRT1170 XECC功能特点及其保护串行NOR Flash和SDRAM之道

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzgyj.html