I.MX RT1170之FlexSPI(2):LUT表格的组成和FlexSPI结构体配置

news2024/12/24 8:17:44

从上一节FlexSPI的框图中可知,SEQ_CTL实现了对外部存储器的时序控制。不同的存储器有着不同的时序,这个时序就是由LUT(Look Up Table)指定的。LUT有它自己的寄存器,当我们设置好之后,外部存储器的读、写和擦除等操作就会根据LUT寄存器中配置执行。另外除了配置LUT表格外,还需要配置FlexSPI的一些参数,以适应不同的硬件上的设计和不同的外部存储器。

文章目录

  • 1 LUT表格的组成
  • 2 FlexSPI结构体配置
    • 2.1 flexspi_config_t
    • 2.2 flexspi_device_config_t
  • 3 总结

1 LUT表格的组成

LUT表格的组成如下图所示,一个表格中包含多个Sequence,一个Sequence包含8个Instruction,而Instruction则是由opcodenum_padsoperand三个字段组成。
在这里插入图片描述
(1)opcode
这是由FlexSPI硬件上定义的一些固定的操作码,如读数据操作、空指令、停止指令等都有其对于的操作码。

NameOpcodepurposeTransmit DataBits/Bytes/Cycle Number
CMD_SDR/CMD_DDR0x01/0x21命令代码Operand[7:0]8 bits
RADDR_SDR/RADDR_DDR0x02/0x22行地址Row_address[31:0]由operand[7:0]指定行地址的bits
CADDR_SDR/CADDR_DDR0x03/0x23列地址Column_address[31:0]由operand[7:0]指定列地址的bits
MODE1_SDR/MODE1_DDR0x04/0x24模式序列Operand[0]1 bit
MODE2_SDR/MODE2_DDR0x05/0x25模式序列Operand[1:0]2 bit
MODE4_SDR/MODE4_DDR0x06/0x26模式序列Operand[3:0]4 bit
MODE8_SDR/MODE8_DDR0x07/0x27模式序列Operand[7:0]8 bit
WRITE_SDR/WRITE_DDR0x08/0x28写数据IP TX FIFO or AHB_TX_BUFAHB Burst size or IPCR1[IDATSZ]
READ_SDR/READ_DDR0x09/0x29读数据-AHB Burst size or IPCR1[IDATSZ]
LEARN_SDR/LEARN_DDR0x0A/0x2A读数据/引导位(学习时序)-由operand[7:0]决定
DATSZ_SDR/DATSZ_DDR0x0B/0x2B当前序列读/写数据长度主要用于FPGA,取决于其内部逻辑由operand[7:0]决定
DUMMY_SDR/DUMMY_DDR0x0C/0x2C延时等待-由operand[7:0]决定Dummy的cycle(SCLK)
DUMMY_RWDS_SDR/DUMMY_RWDS_DDR0x0D/0x2DHyperBus设备中用于数据和命令的时钟同步-与operand[7:0]和DQS pin有关
JMP_ON_CS0x1F序列跳转--
STOP0x00停止序列--
  • 对于JMP_ON_CSSTOP来说,它们的num_pads会被忽略;而其它的指令则根据不同的指令指定num_pads

(2)num_pads
与外部存储器通信时用的数据线的个数,取值如下:

#define FLEXSPI_1PAD 0
#define FLEXSPI_2PAD 1
#define FLEXSPI_4PAD 2
#define FLEXSPI_8PAD 3

比如对于八线的HyperRAM来说,传输数据时这个参数就是FLEXSPI_8PAD ,即数据在硬件连接的所有线上传输。但对于某些指令来说,num_pads只需要设置为FLEXSPI_1PAD,如停止指令,它只需要一个数据位即可。

(3)operand
即前面的操作码对应的参数。

2 FlexSPI结构体配置

对于不同的外部存储器来说,有不同的行/列寻址宽度、不同的存储器大小等参数,而这些参数都是在FlexSPI相关结构体中配置。首先我们就以HyperRAM的初始化代码为例,看一下FlexSPI的初始化代码:

flexspi_device_config_t deviceconfig = {
    .flexspiRootClk = 332000000,
    ......//略
};
flexspi_config_t config;
/* Get FLEXSPI default settings and configure the flexspi. */
FLEXSPI_GetDefaultConfig(&config);
FLEXSPI_Init(EXAMPLE_FLEXSPI, &config);
/* Configure RAM settings according to serial RAM feature. */
FLEXSPI_SetFlashConfig(EXAMPLE_FLEXSPI, &deviceconfig, kFLEXSPI_PortA1);
/* Update LUT table. */
FLEXSPI_UpdateLUT(EXAMPLE_FLEXSPI, 0, customLUT, ARRAY_SIZE(customLUT));
/* Do software reset. */
FLEXSPI_SoftwareReset(EXAMPLE_FLEXSPI);

从上面的代码可以知道,在初始化过程中,flexspi_config_tflexspi_device_config_t这两个结构体需要我们进行填充。其中flexspi_config_t主要是对FlexSPI的一些功能的配置,而flexspi_device_config_t则是对特定的存储器的一些时序、参数配置。

2.1 flexspi_config_t

flexspi_config_t结构体的定义如下,各个参数的详细解释我都写在注释中了。

typedef struct _flexspi_config
{
	/* 读数据使用的时钟源 */
    flexspi_read_sample_clock_t rxSampleClock; 
    /* 在没有外部驱动时,SCK将以固定频率产生脉冲 */
    bool enableSckFreeRunning;
    /* 使能PORTA和PORTB的数组组合来支持8位访问 */
    bool enableCombination;
    /* 是否使能低功耗Dozeoze模式 */
    bool enableDoze;
 	 /* 将时钟速率减缓一半,减慢传输速度但增大容错率 */
    bool enableHalfSpeedAccess; 
 	 /* 使能SCKB作为SCKA的差分时钟,若使能PORTB的设备无法访问 */
    bool enableSckBDiffOpt;
 	 /* 若使能FLASHA1CRx寄存器的配置会共享给其它的设备 */
    bool enableSameConfigForAll;
    /* 命令执行的超时周期,防止系统卡在等待某个状态上,系统将在ahbGrantTimeoutCyle*1024个串行时钟周期后返回超时 */
    uint16_t seqTimeoutCycle; 
  	/* IP命令执行的超时周期,系统将在ipGrantTimeoutCycle*1024个AHB时钟周期后返回超时 */
    uint8_t ipGrantTimeoutCycle;
  	/* IP发送FIFO大小,与串口watermark类似,只有满了才发 */
    uint8_t txWatermark;
  	/* 接收FIFO大小,只有满了才收 */
    uint8_t rxWatermark;
    struct
    {
   		 /* FlexSPI从AHB总线获取执行命令的访问权限的超时时间 */	 
        uint8_t ahbGrantTimeoutCycle;
   		 /* AHB读写访问超时周期 */
        uint16_t ahbBusTimeoutCycle;
    	/* FlexSPI支持暂停当前命令序列而稍后执行,该值表示在后续恢复命令前等待的空闲周期数 */
        uint8_t resumeWaitCycle;
        /* 使能在每次数据传输完成后清除RX/TX的buffer */
        bool enableClearAHBBufferOpt; 
    	/* 控制是否移除AHB读取突发起始地址对齐限制,若使能,突发读取地址没有字节对齐限制 */
        bool enableReadAddressOpt;
    	/* 使能AHB读取预取功能:在完成当前AHB突发读取后,预先读取一些额外的数据到缓冲区中以加快后续读取,但这会增加功耗 */
        bool enableAHBPrefetch; 
    	/* 是否开启AHB写缓冲访问:在执行写命令后,不等待其执行完毕就返回,允许后续指令继续执行,提高系统的并发性 */
        bool enableAHBBufferable;
    	/* 使能AHB总线缓存读取,若命中则从缓存中读取,但要确保数据的一致性 */
        bool enableAHBCachable;       /*!< Enable AHB bus cachable read access support. */
    } ahbConfig;
} flexspi_config_t;

2.2 flexspi_device_config_t

flexspi_device_config_t结构体的定义如下:

typedef struct _flexspi_device_config
{
    /* FLEXSPI串行根时钟频率 */
    uint32_t flexspiRootClk;
    /* 是否启用第二个串行时钟线:硬件上连了两个时钟线 */
    bool isSck2Enabled;
    /* 外部存储设备的大小,以KB为单位 */
    uint32_t flashSize;
    /* 定义在连续的CS信号之间的时间间隔单位:1或256个串行时钟周期 */
    flexspi_cs_interval_cycle_unit_t CSIntervalUnit;
    /* CS线的保持时间,单位为CSIntervalUnit */
    uint16_t CSInterval;
    /* CS线的保持时间 */
    uint8_t CSHoldTime;
    /* CS线设置时间,即在发送片选信号之前需要等待的时间 */
    uint8_t CSSetupTime;
    /* 在读取数据之后,数据保持有效的时间 */
    uint8_t dataValidTime;
    /* 列地址宽度 */
    uint8_t columnspace;
    /* 是否使用字地址来访问外部设备,有的存储设备支持按字传输,如读0地址的数据将返回0~3地址的数据(4字节) */
    bool enableWordAddress;
    /* AHB写命令的序列ID:对应LUT表格中的顺序 */
    uint8_t AWRSeqIndex;
    /* AHB写命令的序列号 */
    uint8_t AWRSeqNumber;
    /* AHB读命令的序列ID:对应LUT表格中的顺序 */
    uint8_t ARDSeqIndex;
    /* AHB读命令的序列号 */
    uint8_t ARDSeqNumber;
    /* AHB写等待单位 */
    flexspi_ahb_write_wait_unit_t AHBWriteWaitUnit;
    /* AHB写等待间隔,乘以AHB写等待单位得到AHB写等待周期数,即写完后等待外部存储器处理完数据的时间 */
    uint16_t AHBWriteWaitInterval;
    /* 是否启用写入屏蔽。指示在向外部设备写入数据时是否将FLEXSPI的DQS引脚用作写入屏蔽 */
    bool enableWriteMask;
} flexspi_device_config_t;

AHB读/写命令的序列号?
以写命令的序列号AWRSeqNumber为例:对于某些存储设备(例如HyperFlash/HyperRam/Serial NAND),Flash编程访问是通过几个命令序列完成,也就是说AHB写命令将触发LUT中第(AWRSeqNumber+1)个命令序列。

3 总结

本节介绍了LUT表格的组成和FlexSPI配置结构体的各个参数的含义,有了这些基础知识后,我们就可以初始化不同的外部存储器设备了。下一节将举一个例子,通过外部存储器与FlexSPI连接的原理图和外部存储器的时序手册,来看看这些参数是如何初始化的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/668864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《网络安全0-100》安全事件案例

网络安全事件案例分析 2017年Equifax数据泄露事件 Equifax是美国一家信用评级机构&#xff0c;2017年9月&#xff0c;该公司披露发生了一起重大的数据泄露事件&#xff0c;涉及1.43亿美国人的个人信息&#xff0c;包括姓名、出生日期、社会安全号码等敏感信息。经过调查&#…

《OpenCV 计算机视觉编程攻略》学习笔记(一:图像编程入门)

1、参考引用 OpenCV 计算机视觉编程攻略&#xff08;第3版&#xff09;本书结合 C 和 OpenCV 3.2 全面讲解计算机视觉编程所有代码均在 Ubuntu 系统中用 g 编译执行 0. 安装 OpenCV 库 在Ubuntu上安装OpenCV及使用OpenCV 库分为多个模块&#xff0c;常见模块如下 opencv_core …

Python数据可视化 - 使用Python dash搭建交互式地图可视化看板

1.前言 前几年刚接触Dash库的时候&#xff0c;Dash生态还不太成熟&#xff0c;做些简单的web还行&#xff0c;复杂的、系统性还是得用flask或django来实现。随着这两年dash的不断迭代更新&#xff0c;以及dash大佬feffery相继开发了feffery_antd_components、feffery_leaflet_…

编译原理笔记7:语法分析(1)语法分析器的任务、语法错误的处理

目录 语法分析器是编译器前端的核心语法错误的处理语法错误的处理目标语法错误的基本恢复策略 语法分析器是编译器前端的核心 语法分析器的两项主要任务&#xff0c;分别&#xff1a; 是根据词法分析器提供的记号流&#xff0c;为语法正确的输入构造分析树&#xff08;或语法树…

uboot下UCLASS框架详解---结合项目工作中spi master和flash驱动开发

文章目录 一、综述二、UCLASS架构解析2.1 uclass2.2 udevice2.3 uclass driver2.4 driver2.4.1 spi master driver 三、uboot代码解析3.1 DM的初始化3.2 spi norflash设备识别3.3 设备树内容3.4 .config配置3.5 spi读写测试 四、其他相关链接1、SPI协议详细总结附实例图文讲解通…

IDEA合并分支和.gitignore可能遇到的问题

将本地的 v1 分支合并到 master 分支上 1.确认你在 master 分支上&#xff0c;在命令行执行以下命令&#xff0c;这将切换到 master 分支。 git checkout master 2.拉取最新代码 在合并分支之前&#xff0c;请确保您的代码库是最新的。在命令行执行以下命令&#xff0c;这将从…

一文解决C/C++中所有指针相关知识点

本篇会对C/C中【常见指针相关知识】一直进行总结迭代&#xff0c;记得收藏吃灰不迷路&#xff0c;一起学习分享喔 请大家批评指正&#xff0c;一起学习呀~ 一、指针基本知识1.1 指针的定义1.2 &#xff08;*&#xff09; 和&#xff08; &&#xff09; 运算符1.3 如何声明…

使用omp并行技术加速bfs广度优先算法

基本思想 从初始状态S开始&#xff0c;利用规则&#xff0c;生成所有可能的状态。构成树的下一层节点&#xff0c;检查是否出现目标状态G&#xff0c;若未出现&#xff0c;就对该层所有状态节点&#xff0c;分别顺序利用规则。生成再下一层的所有状态节点&#xff0c;对这一层的…

chatgpt赋能python:Python在SEO中的排名

Python在SEO中的排名 Python作为一门高级编程语言&#xff0c;已经有近三十年的历史&#xff0c;被广泛用于各个领域的开发&#xff0c;包括 Web开发、数据分析、机器学习等。在 SEO 中&#xff0c;Python 也具有很高的应用价值。本文将会介绍 Python 在 SEO 中的应用以及其排…

C语言进阶教程(一个可执行文件生成的具体步骤)

文章目录 前言一、预处理二、编译三、汇编四、链接总结 前言 本篇文章来讲解一个.c文件生成一个可执行文件的完整过程&#xff0c;我们学习了那么久&#xff0c;只知道在编译器中按下编译运行就可以将一个.c文件运行起来了&#xff0c;但是我们并不了解其中的具体步骤&#xf…

【openGauss简单数据库管理---快速入门】

【openGauss简单数据库管理---快速入门】 &#x1f53b; 一、openGauss数据库管理&#x1f530; 1.1 连接openGauss数据库&#x1f530; 1.2 创建数据库&#x1f530; 1.3 查看数据库和切换数据库&#x1f530; 1.4 修改数据库&#x1f530; 1.5 删除数据库&#x1f530; 1.6 启…

高等代数复习(二)

本篇复习内容有 求解标准正交基 证明标准正交基 证明正交变换 利用共轭变换证明 求解与给定矩阵的相似矩阵--对角矩阵 1.求标准正交基 在求标准正交基时&#xff0c;通常要先正交化&#xff0c;然后单位化&#xff0c;即可求出标准正交基。 2.证明标准正交基 标准正交基单位…

chatgpt赋能python:Python提取指定位置字符

Python 提取指定位置字符 Python 是一种高级程序语言&#xff0c;其易读性、简单易学性和易维护性使其成为最受欢迎的编程语言之一。它可以用于各种数据分析和科学计算&#xff0c;包括搜索引擎优化&#xff08;SEO&#xff09;。 在SEO中&#xff0c;提取和处理数据是一个重…

C++——string容器模拟实现

目录 1. 基本成员变量 2. 默认成员函数 2.1 构造函数 2.2 析构函数 2.3 拷贝构造函数 2.4 赋值运算符重载 3. 容量与大小相关函数 3.1 size 3.2 capacity 4. 字符串访问相关函数 4.1 operator[ ]重载 4.2 迭代器 5. 增加函数接口 5.1 reserve 5.2 resize 5.3 …

【二叉树part01】| 二叉树的递归遍历、二叉树的迭代遍历

目录 ✿二叉树的递归遍历❀ ☞LeetCode144.前序遍历 ☞LeetCode145.二叉树的后序遍历 ☞LeetCode94.二叉树的中序遍历 ✿二叉树的迭代遍历❀ ☞LeetCode144.前序遍历 ☞LeetCode145.二叉树的后序遍历 ☞LeetCode94.二叉树的中序遍历 ✿二叉树的递归遍历❀ ☞LeetCode…

docker-compose启动opengauss数据库——华为“自研”数据库

文章目录 1. 启动数据库2. 登录2.1 本地登录2.2 远程登录 1. 启动数据库 yml文件 创建opengauss目录&#xff0c;里边创建docker-compose.yml文件内容如下&#xff1a; 华为开源数据库&#xff0c;默认5432端口&#xff0c;是不是很熟悉&#xff0c;疑似又是个套壳子的事件。果…

Cortext-M3系列:调试系统架构(8)

1、调试特性概述 单片机的调试功能在程序开发中有着十分重要的地位&#xff0c;好的调试工具&#xff0c;能让程序开发大大加快。笔者在刚开始学单片机相关知识时&#xff0c;使用的是pintf打印相关参数&#xff0c;进行调试&#xff08;虽然现在很多时候也这样&#xff09;&am…

MyBatis 的使用方法

观前提示:本篇博客演示使用的 IDEA 版本为2021.3.3版本,使用的是Java8(又名jdk1.8) 前端使用 VSCode(Visual Studio Code1.78.2) 电脑使用的操作系统版本为 Windows 10 目录 Mybatis是什么? Mybatis 有什么用? Mybatis 框架交流 Mybatis 项目环境搭建 1. 添加 Mybatis…

设计模式之生成器(建造者)模式笔记

设计模式之建造者模式笔记 说明Builder(生成器)目录UML生成器(建造者)模式示例类图自行车类建造者抽象类摩拜单车对象类小黄车单车对象类指挥者类测试类优缺点 模式扩展手机类测试类 说明 记录下学习设计模式-生成器(也叫建造者)模式的写法。 Builder(生成器) 意图:将一个复…

监控中的计算机科学

文章目录 一、前言二、监控分类2.1 模拟摄像头2.1 数字摄像头 三、监控系统四、后端产品4.1 硬盘录像机4.2 视频矩阵4.3 控制设备4.4 显示设备 五、传输端5.1 光纤视频线5.1.2 单模光纤5.1.3 多模光纤5.1.4 光端机 5.1 双绞线 六、畅享 一、前言 布林肯访华&#xff0c;黑我们…