RT1050 FLEXSPI 控制flash简述

FLEXSPI 控制flash简述

注:参考野火的库开发指南及RM手册,简单描述关于Flexspi 控制flash的流程

下图为flexspi的架构图。

 RT1050 FLEXSPI 控制flash简述

1.通讯引脚

    FlexSPI 外设包含有 A/B 两组 SPI 通讯接口, 即图 16-5中第①部分 IO_CTLIO 控制逻辑) 引出的SPI Bus FA port”和“SPI Bus FB port” 。 每组接口最多可外接 2个设备具体引脚参考rm手册。

2.LUT查找表

  访问 FLASH存储器通常包含一些读写功能的的控制指令, 主控设备可通过这些指令访问 FLASH存储器。

  为了适应这种需求, FlexSPI 外设中包含有一个指令查找表 LUTLook Up Table),即图 16-5中第②部分 SEQ_CTL(序列控制逻辑) 的主要内容, 它用来预存储访问外部设备时可能使用到的指令,需要对 FLASH进行访问时, FlexSPI 会从查找表 LUT 中获取相应的指令然后通过 SPI 接口对 FLASH 发起通讯。 

  该表使用序列的形式缓存指令,最多支持 16 个指令序列, 每个序列最多支持 8 个指令。例如,在某序列中缓存指令 C1 C2 C3…,当控制执行该序列时,指令 C1 C2 C3…会被按顺序执行。 

RT1050 FLEXSPI 控制flash简述 

查找表LUT的构成

3. 命令仲裁器

  图 16-5中第③部分是 ARB_CTL(仲裁器逻辑) ,它主要用来决定执行哪一套命令。在其后有一个 AHB_CTLAHB命令控制逻辑)和 IP_CTLIP 命令控制逻辑) ,它们分别代表了内核对 FlexSPI 的两种控制方式 该仲裁器逻辑就是决定它们谁拥有对前面逻辑单元(SEQ_CTL IO_CTL)的控制权。 

4.IP commond 控制:

    图16-5中第④部分 IP_CTL IP 命令控制逻辑, 它包含 IP_RX_FIFO IP_TX_FIFO用来缓冲收发的数据,它们均为 16*64Bits大小。 IP_CTL连接至 32位的 ARM IP 总线,通过它可以向 ARB_CTL(仲裁器逻辑)发送控制命令, 从而利用 FlexSPI 访问外部 SPI 设备。 IP 命令实际上就是内核通过访问外设寄存器的方式控制外设FlexSPI 外设的寄存器大都是为这种控制方式服务的包括 IP_RX_FIFO IP_TX_FIFO都是以寄存器的形式提供给用户进行访问,这种方式其实与前面的 GPIO LPI2CLPUART 等外设的控制方式一样,
这样命名主要是为了与后面的 AHB命令方式进行区分。
IP 命令的控制流程如下:
(1) IP_TX_FIFO填充要传输的数据;
(2) 通过 IPCR0寄存器设置要写入的 FLASH内部存储单元的首地址,要传输的数据
大小以及要执行的 LUT 命令序列的编号;
(3) 对寄存器 IPCMD TRG位置 1触发 FlexSPI 访问;
(4) 检查寄存器 INTR IPCMDDONE 位以等待至 FlexSPI 外设执行完该指令;
(5) 若执行的命令序列有会接收数据,那么接收到的数据会被缓存至 IP_RX_FIFO中。

  读取IP_RX_FIFO中的数据,可以通过两种地址方式,①ips bus(100-180)②ahb bus(7fc00000-10000200),同时可以通过DMA读取

IP_TX_FIFO填充数据同读取。

5. AHB 命令控制逻辑

  图16-5中第⑤部分 AHB_CTL AHB命令控制逻辑,它包含有 128*64Bits 大小AHB_RX_BUF 8*64Bits 大小的 AHB_TX_BUF 用来缓冲收发的数据, AHB_CTL连接至64位的 AHBP 总线,通过它可以向 ARB_CTL(仲裁器逻辑)发送控制命令,从而FlexSPI访问外部 SPI 设备。

AHB命令访问flash只能对flash进行读或者写操作,无法实现相关的状态功能,如擦除,配置模式等功能。
使用AHB命令的方式是直接访问RT1052内部的0x600 0000-0x1000 0000地址, 对这些地址的读写访问会触发 FlexSPI 产生 SPI 控制时序, 然后对连接的 FLASH内部存储单元进行读写,这种功能称为地址映射。

例如可以把外部 NOR Flash存储器的内部地址 0x0映射到 RT10520x60000000地址,初始化好 FlexSPI 后,当我们直接使用指针读取 RT10520x60000000地址的内容时,会自动触发FlexSPI外设访问外部的 NOR Flash存储器的0x0地址获得数据,访问时它会自动使用AHB_RX_BUFAHB_TX_BUF缓冲数据。
AHB 命令仅支持对 FLASH存储单元的读写访问,对 FLASH存储器的工作模式或状态寄存器的读取需要使用 IP 命令实现。
特别地IP命令的两个 FIFO也可以通过地址映射来访问,其中IP_RX_FIFO映射0x7FC00000 -0x10000200地址,而IP_TX_FIFO映射0x7F800000 -0x11000400地址。  

 

触发AHB write command 的条件有以下三种:

  • l当前AHB burst的最后一个beat完成
  • l当前的beat数据填充后AHB TX 缓存已经满了
  • lAHB总线编程IDLE?或者新的AHB burst发来且TX缓存区内容不为空。

下面是RM手册原文:

 RT1050 FLEXSPI 控制flash简述

AHB总线访问flash时通讯等待时间由以下两个(寄存器)来设置:

 RT1050 FLEXSPI 控制flash简述

 RT1050 FLEXSPI 控制flash简述

 

AHB flash操作流程图

 

在这段代码中对整个扇区写入时没有使用 AHB命令,因为经过我们测试和调整各种参数的努力后,使用 AHB 命令写入大量数据时仍然不正常,在靠后的数据总是无法写入,考虑到写入操作还要对扇区进行擦除操作(AHB 命令是不支持擦除操作的),所以我们不建议使用 AHB 命令对 FLASH 进行写入。不过使用 AHB命令对 FLASH进行读取还是比较推荐的,这种方式操作非常方便。 

更详细的内容请参考:

IMXRT1050RM手册30章

野火i.MX RT库开发指南