查看: 9749|回复: 1

[分享] 【 RT1050学习笔记】-FlexSPI简介

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3922

    主题

    7540

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39952
    最后登录
    2025-8-21
    发表于 2021-10-11 15:48:17 | 显示全部楼层 |阅读模式
    1 前言
    接下来我们学习一下RT1050一个最重要的外部存储器接口FlexSPI,因为其对于RT的启动,XIP以及外部存储器的拓展都息息相关,实打实的核心。


    2 扩展SPI
    相信大家对于传统SPI并不陌生,四个信号线,四种工作模式,同步全双工通讯,在这里我就不多做介绍了,接下来让我们了解一下SPI的扩展协议(Dual/Quad/Octal SPI)。下表列出了这四种SPI之间的对比。


    除了以上的区别,扩展SPI还增加了SDR(Single Data Rate)和DDR(Double Data Rate)两种模式。在标准SPI 协议的SDR 模式下,只在SCK 的单边沿进行数据传输,即一个SCK 时钟只传输一位数据;而在DDR 模式下,会在SCK 的上升沿和下降沿都进行数据传输,即一个SCK 时钟能传输两位数据,传输速率提高一倍,这个就跟SDRAM的DDR原理是差不多的。
    13.png
    3 FlexSPI
    RT1050的FlexSPI就是针对SPI协议设计的一个超级灵活SPI外设,下面是它的一些特性:


    Single/Dual/Quad/Octal 模式的传输(即1/2/4/8 根数据线的传输)。
    支持SDR/DDR通讯模式,在SDR模式下,它仅支持SPI 中的模式0(CPOL=0, CPHA=0),即SCK 空闲时为低电平,采样时刻为奇数边沿的模式。
    支持控制SPI接口的串行NOR/NAND Flash 设备、HyperBus 协议设备以及FPGA 设备。 支持读写单个串行FLASH以及读写多个并联的串行FLASH 的模式(Individual Mode 及Parallel Mode)。
    支持IP操作,支持把存储器地址映射至通过AHB总线读写。 支持使用DMA进行访问,从而减少CPU 的介入。
    支持以下多种模式以适配不同的功耗状态:模块关闭模式(Module Disable mode)、打盹儿模式(Dozemode)、停止模式(Stop mode)以及正常模式 (Normal mode)。
    最多支持4个存储设备,每个存储设备最大容量为4GB,不过要注意如果同时使用FlexSPI外接多个存储设备,那么这些存储设备容量的总和也不能超过4GB。
    下图为FlexSPI的结构图:
    14.png
    3.1 IO_CTL
    FlexSPI 外设包含有A/B 两组SPI 通讯接口,即图 22-5 中第①部分IO_CTL(IO 控制逻辑)引出的“SPI Bus FA port”和“SPI Bus FB port”。每组接口最多可外接2 个设备,即A1、A2、B1 和B2,下面列出第一组接口定义(两组一样):
    15.png
    当工作在Octal 模式下,也就是八数据线模式下,它会以SIOB[3:0]数据信号线作为高4位的数据线,此时仅A 组可以工作,B 组不能使用。如下图所示:
    16.png
    3.2 SEQ_CTL
    这一部分为序列控制模块,主要负责具体命令时序的组合,其中有一个非常重要的部分叫做LUT表(Look Up Table),它是一个寄存器组,我们可以在这组寄存器中存储命令序列,之后我们可以通过调用索引来直接调用LUT中存储的命令序列,它是为了让通过IP命令操作更加方便快捷服务的。


    LUT寄存器组一共有64个寄存器(LUT0~LUT64),每个寄存器可以存储2个指令,8个指令组成一个指令序列,所以一个支持16个指令序列。接下来让我们看看一个指令中包含了哪些信息,LUT寄存器介绍如下:
    17.png
    18.png
    其中OPERAND参数是跟着OPCODE指令编码来决定的。


    ①对于CMD_SDR 指令,它的功能是向FLASH 发送命令,此时要发送的FLASH命令代码就是CMD_SDR 指令的参数,即由OPERAND 域指定。例如W25Q256 型号的FLASH 的读取ID 命令代码为0xAB,当RT1052 要读取FLASH 的ID 时,利用CMD_SDR指令同时把命令代码0xAB 赋予到OPERAND 域,这样FlexSPI 控制的时候就会通过SPI 接口把FLASH 命令0xAB 发送出去了。


    ②对于RADDR_SDR 指令,它的功能是向FLASH 发送要读写的存储单元地址,该地址由IPCR0 寄存器指定,同时OPERAND 域用于指定地址的长度。例如部分FLASH 的空间比较小,只使用16 位来表示地址,那么该命令的OPERAND 域的值就应为16,对于W25Q256 这种地址为24 或32 位的存储器,OPERAND 域的值就应设置为24 或32。


    ③对于DUMMY_SDR 指令,它的功能是释放FlexSPI 对数据线的控制,而时钟正常运行,该指令是针对FLASH 存储器的部分时序要求,这时FLASH 存储器会忽略数据线上的内容,实质它是要求主机进行等待,在这种情况下可通过OPERAND 指定该过程要占多少个SCK 的周期数。


    一些常见的LUT指令大家可以参考官方指南中的Table 27-7. Instruction set,在这里就不一 一列举了,我截图截一部分。
    19.png
    所以我们只需要提前将一些常见的FLASH操作命令写入LUT寄存器组中,我们就可以通过将指令序列索引和指令序列数量写入IPCR1中,就可以调用我们预先设置的LUT表指令。


    (注意:在使用LUT表过程中,我们需要了解和注意一下几点:
    ①对于指令编码01和21,它们的作用都是发送FLASH命令,唯一的区别就是实现方式的不同,01为通过SDR模式发送,21为通过DDR模式发送。


    ②在前面说到我们可以通过改变指令中NUM_PADS参数来确定使用几根信号线发送数据,1/2/4/8,但是不是所有的指令编码都可以改变NUM_PADS,对于STOP指令和大多数FLASH的CMD指令来说,只能使用single模式,也是使用一根线来传输。


    ③每一个指令通常不会单独执行,而是组成一个指令序列,一般的FLASH操作通常使用序列并配合STOP 指令(停止指令)使用,所有对于指令数不满8 个的序列,需要使用STOP 指令表示结束,其中STOP命令的LUT参数全部为0,所以在设计LUT表时,不加也是可以的。)


    注:关于LUT表的相关使用在我的三篇FlexSPI使用文章中也有详细的解释。


    3.3 ARB_CTL
    ARB_CTL(仲裁器逻辑),它主要用来决定执行哪一套命令。在其前面有一个AHB_CTL(AHB 命令控制逻辑)和IP_CTL(IP 命令控制逻辑),它们分别代表了内核对FlexSPI 的两种控制方式 ,该仲裁器逻辑就是决定它们谁拥有对前面逻辑单元(SEQ_CTL 和IO_CTL)的控制权。


    3.4 IP_CTL
    这一部分决定了我们可以通过访问寄存器的形式完成对FlexSPI外设的操作。IP_RX_FIFO 和IP_TX_FIFO用来缓冲收发的数据,它们均为16*64Bits 大小。。IP_CTL 连接至32 位的ARM IP 总线,通过它可以向ARB_CTL(仲裁器逻辑)发送控制命令,从而利用FlexSPI 访问外部SPI 设备。


    IP操作具体流程如下:


    往IP_TX_FIFO 填充要传输的数据;
    通过IPCR0 寄存器和IPCR1寄存器设置要写入的FLASH 内部存储单元的首地址,要传输的数据大小以及要执行的LUT 命令序列的编号;
    对寄存器IPCMD 的TRG 位置1 触发FlexSPI 访问;
    检查寄存器INTR 的IPCMDDONE 位以等待至FlexSPI 外设执行完该指令;
    若执行的命令序列有会接收数据,那么接收到的数据会被缓存至IP_RX_FIFO 中。
    3.5 AHB_CTL
    AHB_CTL 是AHB 命令控制逻辑,它包含有128 * 64Bits 大小的AHB_RX_BUF 和8 * 64Bits 大小的AHB_TX_BUF 用来缓冲收发的数据,AHB_CTL 连接至64 位的AHBP 总线,通过它可以向ARB_CTL(仲裁器逻辑)发送控制命令,从而FlexSPI访问外部SPI 设备。


    使用AHB 命令的方式是直接访问RT1052 内部的0x600 0000-0x1000 0000 地址,对这些地址的读写访问会触发FlexSPI 产生SPI 控制时序。


    以上对FlexSPI的结构进行了一个简单的介绍,接下来我们会对其一些日常的使用做一些简单的介绍。





    qiandao qiandao
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-5-9 00:37
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    0

    主题

    3

    帖子

    0

    新手上路

    Rank: 1

    积分
    34
    最后登录
    2024-10-24
    发表于 2024-5-8 14:38:14 | 显示全部楼层
    非常棒,感谢分享
    加油加油
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-21 15:56 , Processed in 0.084459 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表