嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > MIMXRT1176 Flexspi访问两片QSPI Flash

MIMXRT1176 Flexspi访问两片QSPI Flash

    MIMRT1176 MCU有两个灵活的串行外围接口-FlexSPI1和FlexSPI2。每个FlexSPI主机控制器支持两个SPI端口-A和B。每个端口最多支持两个芯片选择输出。FlexSPI2的每个端口支持单/双/四/八线模式数据传输(1/2/4/8条双向数据线),而FlexSPI1的每个端口都支持单/双/四线模式数据传送(1/2/4条双向数据线路)。FlexSPI1使用带有端口A和B的4位总线,而FlexSPI2使用带有端口B和A的8位总线。

    主要功能包括:

•同时支持SDR模式和DDR模式

•支持单独/并行模式

•HyperBus设备(HyperFlash/HHyperRAM)

    有两个 FlexSPI接口端口(A端口和B端口)。每个端口通过提供2个芯片选择输出来支持2个Flash器件。注:FlexSPI配置取决于芯片配置。FlexSPI支持 4个器件的连接图如下:

    FlexSPI1可以外接2片 QSPI Flash存储器,FlexSPI2可以外接2片 HyperFlash 8线Flash 存储器。

•闪存A1和A2可以是两个芯片或同一器件封装上的两个闪存Die。FlexSPI的B1和B2与A1和A2相同。

•闪存A1和B1可以使用并行模式并行访问。FlexSPI将自动合并/拆分Flash闪存读取/编程数据。A2和B2与A1和B1相同。

•在并行模式下,无法同时访问A1和A2。B1和B2与A1和A2相同。

•在单独模式下,无法同时访问A1、A2、B1和B2。但这四个设备可以单独访问。有一种组合模式,通过将A端口(A_DATA[3:0])和B端口(B_DATA[3:0]])组合在一起来提供八进制 Flash 支持。正常模式也可以支持八进制模式,但A端口和B端口 I/O宽度应为8。组合模式连接图如下:

    比如在Flexspi A1和A2口各接一个 8MB的QSPI Flash,硬件共用时钟和数据线,就只是片选不同。Flexspi A1作为程序运行代码存储区,Flexspi A2作为数据存储区。A2的地址是接着A1的地址访问的。在数据访问时,需要加上偏移A1的地址,如下擦/写/读操作代码示例供参考。 Flash 映射单个和并行模式下的地址如下:

    Flash 存储器独立模式下的地址映射: 

• Flash A1 地址范围:: 0x00000000 ~ FA1_SIZE 

• Flash A2 地址范围:: FA1_SIZE ~ (FA1_SIZE + FA2_SIZE) 

• Flash B1 地址范围: (FA1_SIZE + FA2_SIZE) ~ (FA1_SIZE + FA2_SIZE + FB1_SIZE)

• Flash B2 地址范围: FA1_SIZE + FA2_SIZE + FB1_SIZE) ~ (FA1_SIZE + FA2_SIZE + FB1_SIZE + FB2_SIZE) 

    Flash 存储器组合模式下的地址映射: 

• Flash A1+B1 地址范围: 0x00000000 ~ FA1_SIZE*2 

• Flash A2+B2 地址范围: FA1_SIZE*2 ~ (FA1_SIZE*2 + FA2_SIZE*2)

    FLEXSPI_SetFlashConfig(base, &deviceconfig, kFLEXSPI_PortA1);

    FLEXSPI_SetFlashConfig(base, &deviceconfig, kFLEXSPI_PortA2);

    

status = flexspi_nor_flash_erase_sector(EXAMPLE_FLEXSPI, 0x800000 + EXAMPLE_SECTOR * SECTOR_SIZE);

status = flexspi_nor_flash_page_program(EXAMPLE_FLEXSPI, 0x800000 + EXAMPLE_SECTOR * SECTOR_SIZE, (void *)s_nor_program_buffer);

#define FlexSPI1_AMBA_BASE                       (0x30000000U)

#define EXAMPLE_FLEXSPI_AMBA_BASE       FlexSPI1_AMBA_BASE

memcpy(s_nor_read_buffer, (void *)(EXAMPLE_FLEXSPI_AMBA_BASE + 0x800000 + EXAMPLE_SECTOR * SECTOR_SIZE),sizeof(s_nor_read_buffer));

    当将Flash A1和Flash A2连接到FlexSPI的端口A时,AN12564文档实际上提供了一种实现RWW功能的方法,采用 DMA传输方式。建议用户将Flash A1和Flash B1分别连接到端口A和端口B,以实现RWW功能。https://www.nxp.com/docs/zh/application-note/AN12564.pdf

     在AN12564第4页中写道,“Flash 擦除API功能的通用代码也可用于RWW实现,它在SDK包中可用”。在SDK的 flexspi(\driver_examples\flexspi)例程项目中。

    为什么 CPU传输会导致硬件 HardFault?因为 CPU内核通过64位AHB总线(即AHB命令)预取代码,代码程序通过32位 IPS总线(即IP IP命令)调用 FlexSPI驱动程序擦除或编程数据 Flash。当它们都想要处理 Flash时,ARB_CTL仲裁器将确定哪种类型的命令将优先控制为ARB命令,并且在那个时候只服务于一个命令。

    当 DMA将页面数据传输到 Flash B1进行编程时,是可以让 CPU做其他事情(例如中断处理、计算…),需要将代码重新映射到RAM才能执行。AN12564第5页图5 Flash 程序流程图禁用中断,直到FlexSPI总线再次空闲。