I.MX RT1170之FlexSPI(4):HyperRAM手册分析和参数配置详解

news2024/9/22 15:35:08

在上一篇文章中我分析了NOR Flash的手册和FlexSPI的相关配置,在这篇文章中,我将以HyperRAM为例,看看八线的HyperRAM在硬件设计和软件配置上有增加什么引脚和参数,然后以ISIS型号为IS66WVH64M8DALL/BLL的HyperRAM为例,看看如何根据手册来配置FlexSPI的参数。

文章目录

  • 1 HyperRAM原理图
  • 2 手册解读和代码配置
    • 2.1 DQS采样
    • 2.2 flexspi_device_config_t配置
    • 2.3 LUT表格配置
  • 3 总结

1 HyperRAM原理图

以下是官方EVKBoard中的八线Flash的原理图,由于大多数的Hyper存储器的封装都为FBGA 24-Ball 5 x 5 Array,所以可以直接进行替换。如下图所示,将R383和R400取掉,再将R401和R384焊上即可使用同封装的HyperRAM,连线非常简单,就是把一个FlexSPI的PortA和PortB都连上了,有八个数据线。
在这里插入图片描述
在8线的Flash/HyperRAM中会多一个DQS引脚,它用于SCLK双边沿采样,仅在存储设备发送数据给单片机时起作用,用于通知单片机数据线上的数据已经就绪。其它的注意CS引脚和RST引脚建议硬件上拉,不过忘记了硬件上拉还可以软件上拉。

2 手册解读和代码配置

在代码上和上一节的NOR Flash手册分析和参数配置详解十分相似,对于一些相同的部分,这篇文章就不再赘述。来看一下不同的地方:

2.1 DQS采样

首先,单片机的采样时钟选择DQS信号:

config.rxSampleClock = kFLEXSPI_ReadSampleClkExternalInputFromDqsPad;
...
FLEXSPI_Init(EXAMPLE_FLEXSPI, &config);

2.2 flexspi_device_config_t配置

因为不同的HyperRAM的参数肯定不一样,这一小节以IS66WVH64M8DALL/BLL为例看看如何进行配置FlexSPI设备结构体:

typedef struct _flexspi_device_config
{
    uint32_t flexspiRootClk;
    bool isSck2Enabled;
    uint32_t flashSize;
    flexspi_cs_interval_cycle_unit_t CSIntervalUnit;
    uint16_t CSInterval;
    uint8_t CSHoldTime;
    uint8_t CSSetupTime;
    uint8_t dataValidTime;
    uint8_t columnspace;
    bool enableWordAddress;
    uint8_t AWRSeqIndex;
    uint8_t AWRSeqNumber
    uint8_t ARDSeqIndex;
    uint8_t ARDSeqNumber;
    flexspi_ahb_write_wait_unit_t AHBWriteWaitUnit;
    uint16_t AHBWriteWaitInterval;
    bool enableWriteMask;
} flexspi_device_config_t;

先来看一些基本参数:

#define HYPERRAM_CMD_LUT_SEQ_IDX_READDATA 0
#define HYPERRAM_CMD_LUT_SEQ_IDX_WRITEDATA 1

.flexspiRootClk = 200000000,
.isSck2Enabled = false,
.flashSize = (0x10000U),
.enableWordAddress = true,
.AWRSeqIndex = HYPERRAM_CMD_LUT_SEQ_IDX_WRITEDATA,
.AWRSeqNumber = 1,
.ARDSeqIndex = HYPERRAM_CMD_LUT_SEQ_IDX_READDATA,
.ARDSeqNumber = 1,
.AHBWriteWaitUnit = kFLEXSPI_AhbWriteWaitUnit2AhbCycle,
.AHBWriteWaitInterval = 0,
.enableWriteMask = true,

(1)flexspiRootClk:FlexSPI的频率,这里根据手册设置为最高200MHz,8线(bit)双边沿200MHz=400MB/s的速率。
在这里插入图片描述
(2)isSck2Enabled:设置为false,这个是用于并行模式中,即硬件上在FlexSPI的PortA和PortB各接一个Flash,然后由FlexSPI自动组合/拆分数据的,这里没有用到。
(3)flashSize:512Mb = 64MB = 0x10000KB。
在这里插入图片描述
(4)enableWordAddress:手册中有提到,是word-wide address boundaries,所以这里填true,表示按字寻址。
在这里插入图片描述

(5)AWRSeqIndex和ARDSeqIndex:对应写和读的时序序列在LUT中的索引
(6)AWRSeqNumber和ARDSeqNumber:有的Flash需要多个Sequence完成一个操作,这里表示写和读的序列在一个LUT的Sequence(8个instruction)内就能完成。
(7)AHBWriteWaitUnit和AHBWriteWaitInterval:二者相乘为Flash写操作后需要等待的时间,在下面写时序图最后传输完数据后,CS#线马上就上拉,所以该芯片写完数据后无需等待,AHBWriteWaitInterval填0。
在这里插入图片描述
(8)enableWriteMask:在向HyperRAM写入数据时,可以用DQS线控制写入时是否使用掩码,主要用于IP指令。可以指定低四位是否使用掩码,即是否忽略这四位的值,该掩码在IPCR2寄存器中设置:
在这里插入图片描述
这个功能没有用到,可以打开也可以不打开。


现在来看一下

.CSIntervalUnit = kFLEXSPI_CsIntervalUnit1SckCycle,
.CSInterval = 2,
.CSHoldTime = 1,
.CSSetupTime = 1,
.dataValidTime = 1,
.columnspace = 3,

(1)CSIntervalUnit和CSInterval:二者相乘即两次片选的间隔时间。原理图中HyperRAM的电源是1.8V,所以这里最低要为5ns,即1/200M,也就是一个时钟周期,这里将CSIntervalUnit 设置为kFLEXSPI_CsIntervalUnit1SckCycle,然后CSInterval就不设置地这么极端,这里就填2。
在这里插入图片描述
(2)CSHoldTime和CSSetupTime:数据的保持时间和建立时间,这里仅要求0.5ns,所以这两个参数都设置为1。
在这里插入图片描述
(3)dataValidTime:数据有效时间如下,同样,这里设置为1即可。
在这里插入图片描述
(4)columnspace:列地址宽度,对于这个HyperRAM来说,是用行列进行寻址的,这里列地址的宽度为3位。
在这里插入图片描述

2.3 LUT表格配置

这里就以读和写两个时序序列为例分析一下参数的配置,LUT表格如下:

uint32_t customLUT[20] = {
	/* Read Data */
	[4 * HYPERRAM_CMD_LUT_SEQ_IDX_READDATA] =
		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0xA0, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
	[4 * HYPERRAM_CMD_LUT_SEQ_IDX_READDATA + 1] = FLEXSPI_LUT_SEQ(
		kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, 6),
	[4 * HYPERRAM_CMD_LUT_SEQ_IDX_READDATA + 2] =
		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),
	/* Write Data */
	[4 * HYPERRAM_CMD_LUT_SEQ_IDX_WRITEDATA] =
		FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DDR, kFLEXSPI_8PAD, 0x20, kFLEXSPI_Command_RADDR_DDR, kFLEXSPI_8PAD, 0x18),
	[4 * HYPERRAM_CMD_LUT_SEQ_IDX_WRITEDATA + 1] = FLEXSPI_LUT_SEQ(
		kFLEXSPI_Command_CADDR_DDR, kFLEXSPI_8PAD, 0x10, kFLEXSPI_Command_DUMMY_RWDS_DDR, kFLEXSPI_8PAD, 6),
	[4 * HYPERRAM_CMD_LUT_SEQ_IDX_WRITEDATA + 2] = FLEXSPI_LUT_SEQ(
		kFLEXSPI_Command_WRITE_DDR, kFLEXSPI_8PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),
};

可以看到读和写的时序序列十分类似,下面来分析一下这些opcode和operand:
(1)kFLEXSPI_Command_DDR
这里我们使用的是8线差分的HyperRAM,在时钟的双边沿都采用,所以就可以进入DDR模式进行数据的读写。对于读数据的operand固定为0xA0,写数据的operand固定为0x20。

  • HyperRAM和HyperFlash是基于Cypress Semiconductor的HyperBus™接口规范设计的存储器产品,这个operand是在该规范中定义的,这里虽然是ISIS的产品,但也遵循这个规范,所以operand固定为0xA0

(2)kFLEXSPI_Command_RADDR_DDR和kFLEXSPI_Command_CADDR_DDR:行地址和列地址的位数。来看看手册:
在这里插入图片描述
在CK为低电平,CK#为高电平时,FlexSPI的前三个时钟周期将传输48位的Command/Address的数据,这表示了一个时序的开始,这48位的定义如下:
在这里插入图片描述
由于HyperRAM连接的是8线的HyperRAM,所以一次传输的字节一定是8的倍数,所以对于FlexSPI来说,如果RADDR_DDRCADDR_DDR不足8位,会自动在低位插入保留位(这个值是什么不影响)。另外,如果你传的行列地址大于特定大小的HyperRAM最大的行和列,FlexSPI会自动将高位置0。

先来看一下列地址,上表中显示低16位是列地址,有效位有3位,高13位是预留兼容的列地址位,需要置0。所以这里列地址的时序参数需要填16,即0x10。

再来看一下行地址,IS66WVH64M8DALL/BLL有512Mbit,即 2 26 2^{26} 226Byte,而在一个时钟周期中的双边沿将采样2字节的数据,列地址还有3位,所以理论上行地址需要传输26-1-3=22位,即可寻址整个HyperRAM。然后向8位对齐,不然FlexSPI会在低位补0,就不是我们要访问的地址了。所以参数为0x18,即24位。
这里我们注意到行地址范围是bit44~16,有29位,向8位对齐为32,为什么不填32呢?
我的猜测是高3位指示传输的一些参数,也需要8位对齐,FlexSPI根据我们的kFLEXSPI_Command_DDR传这三位的时候,肯定也是一次传8位了,所以对于1Gbit的设备,在传高三位的同时,也会根据用户提供的地址把bit44~40的位也给填充了。

(3)kFLEXSPI_Command_DUMMY_RWDS_DDR:HyperBus设备中用于数据和命令的时钟同步延时,这个值必须非常精准。。由于读写的DUMMY Cycle一般都一样,这里以IS66WVH64M8DALL/BLL中的读时序为例,看看这个值要设置为多少:
在这里插入图片描述
在手册中并没有明确地标出Dummy cycle的时序图,这个图主要是为了说明一些AC参数,但从图中可以粗略地看出,当48位的CA数据发完后,再经过7个时钟周期,DQ线上就开始传输数据。但实际测试发现,填6时读写的数据才正常。所以实际的值还是得实际调试确定。

(4)kFLEXSPI_Command_READ_DDR和kFLEXSPI_Command_WRITE_DDR:即读数据和写数据的命令,其参数为AHB的Burst size,即读或写数据的大小,即一次读写的最小字节数。大部分设备是4字节对齐的,这里就填0x04。
(5)kFLEXSPI_Command_STOP:停止指令。

3 总结

本文通过分析HyperRAM的手册和FlexSPI的参数对一个8线的HyperRAM的参数配置进行了讲解,对于不同的HyperRAM来说,其寻址方式不太相同,比如有的HyperRAM列地址的高列地址和低列地址并不是连续的,这个时候设置的行地址位数的参数就不能以8位对齐了,而是要预留低位,让FlexSPI自动去填充。所以,这些存储设备的配置代码并没有一个通用的模板,对于不同的芯片,都需要阅读其手册来配置。

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

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

相关文章

402 · 连续子数组求和

链接:LintCode 炼码 - ChatGPT!更高效的学习体验! 题解: 九章算法 - 帮助更多程序员找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 九章算法 - 帮助更多程序员找到好工作,硅谷顶尖IT企业…

微信小程序开发与应用——字体样式设置

要求:设置字体样式。 1、打开微信开发者工具,创建一个小程序,如下: 2、设置小程序的项目名称和路径,并选择开发语言为JavaScript,如下: 3、小程序的主体部分由三个文件组成,且都要…

2023.07.08力扣6题

167. 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < …

Carla与Ros联合仿真教学与踩坑经历

Carla与Ros联合仿真教学与踩坑经历 前言 本人需要用到carla进行仿真&#xff0c;做实验&#xff0c;研究了这个平台几个月。 需要注意的是&#xff0c;本人没有保留所有的ros包&#xff0c;而是选择一些进行使用&#xff0c;其他大家可以进行扩展。 carla0.9.5版本和carla0.…

雅思口语考试的顺序与技巧?

雅思口语的考试顺序&#xff0c;也是学生们在开始考试前要了解的信息。雅思的口语考试到底有怎样的考试顺序&#xff1f;下面就听小编讲讲它的考试顺序&#xff0c;以及考试中的技巧。 一、雅思口试考试顺序 众所周知&#xff0c;雅思考试分为笔试和口试。正常情况下&#xff…

YOLOV5-Lite轻量化部署与训练

文章目录 前言项目下载项目运行自定义数据集训练使用LabelImg标注制作数据集划分训练文件生成标签聚合操作辅助脚本需要运行的脚本 开始训练 总结 前言 没啥意思&#xff0c;很简单&#xff0c;需要实现一个目标检测&#xff0c;但是&#xff0c;不能占用太多运算资源&#xf…

【双指针】977. 有序数组的平方

977. 有序数组的平方 解题思路 思路: 设置前后指针最大的元素一定是存在再前后位置,然后因为负数平方之后可能大于整数的平方每次比较前后指针指向的元素的平方 然后存下较大的元素平方 然后移动指针 class Solution {public int[] sortedSquares(int[] nums) {// 设置前后指…

Git--远程操作

文章目录 前言一、理解分布式版本控制系统二、远程仓库1.新建远程仓库2.克隆远程仓库3.向远程仓库推送4.拉取远程仓库5.配置Git忽略特殊文件 给命令配置别名 总结 前言 正文开始!!! 一、理解分布式版本控制系统 我们目前所说的所有内容(工作区,暂存区,版本库等等),都是在本地…

scratch角色跟随

scratch 角色跟随 本程序实现了角色跟随功能&#xff0c;第一个角色面向鼠标指针&#xff0c;其它角色面向前一个角色&#xff0c;在距离较小时暂停。 5个角色的程序依次为&#xff1a;

RegNeRF,FreeNeRF: 神经辐射场的自由频率正则化,几何正则化,外观正则化,遮挡正则化

目录 概要&#xff1a; 一 论文 RegNeRF: Regularizing Neural Radiance Fields for View Synthesis from Sparse Inputs 1.几何正则化 2.外观正则化 二 论文 FreeNeRF: Improving Few-shot Neural Rendering with Free Frequency Regularization 3 频率正则化 和自由频…

155 mini_stack

Title Description 155. 最小栈 - 力扣&#xff08;Leetcode&#xff09; resolvent 觉得比较困难的地方就是在minstack那个部分: 两个创新点: 1.使用了INTMAX防止存放有效避免指针的问题 2.使用了min_stack时间换空间 class MinStack { public:stack<int> stack1;s…

ChatGPT带我做四轴飞行器和自平衡小车

按照ChatGPT的说法&#xff0c;这款主板的的主控MCU、无线通信、电源管理、外设接口可以共用&#xff0c;需要差异化的有电机驱动、传感器的选择、控制算法和软件、电源供电。ChatGPT说的共用部分没啥争议&#xff0c;有差异化的地方需要细想下&#xff1a;电机驱动显然应该不同…

three.jsgsap滚动交互网页实现 2-创建文字并添加离开动画

添加动画 让聚光灯的角度随着下滑增大&#xff0c;展示完整的场景 const container document.querySelector("#container");gsap.to(light, {angle: 0.7,scrollTrigger: {trigger: container,start: 0,end: innerHeight,scrub: 1},});这样下滑一个屏幕高度聚光灯的角…

Redis——初窥门径

前言 在这篇文章中&#xff0c;荔枝整理了初步了解Redis的一些基础知识和常见指令。通过这篇文章我们可以弄懂Redis具体是什么以及主要的功能、基本数据类型和操作指令。这里注意如果标题后面带*则是仅需要了解就行的知识点哈。 文章目录 前言 一、Redis概述和配置 1.1 概述…

Android Compose UI实战练手----Google Bloom 主页实现(完结)

目录 1.概述2.页面展示2.1 亮色主题2.2 深色主题 3.页面拆分及实现3.1 主页的UI整体UI架构实现3.2 底部导航栏BottomBar的实现3.3 搜索栏SearchBar的实现3.4 Banner实现3.5 中间信息列表BloomInfoList的实现 4.源码地址 1.概述 主页的页面比前面的欢迎页和登录页面要复杂得多&…

Microsoft Visual Studio 2022添加.NET Framework 4.6.2框架,然后说下.NET目标包的作用。

众所周知&#xff0c;Microsoft Visual Studio 2022不再支持.NET Framework 4.6以下的框架。从而导致前期使用老框架开发的某些应用无法打开&#xff08;打开时提示安装框架&#xff0c;但又安装不成功&#xff09;的情况出现。 前于如何安装.NET Framework 4.5及更早版本框架的…

Java中的字符串类

提示&#xff1a;字符串类是编程中最常用的一种数据类型&#xff0c;比较重要❗ 文章目录 前言一、字符串类创建对象方式静态创建动态创建 二、String字符串内容不可改变三、字符串常用方法length方法charAt方法substring方法indexOf与lastIndexOfindexOf方法lastIndexOf方法 替…

计算机基础--->数据结构(9)【并查集】

文章目录 并查集的概述并查集的主要用途并查集的实现创建和初始化集合查找当前元素的集合根节点判断两个元素是否处于同一集合合并两个集合对节点的路径进行压缩 并查集的概述 并查集是一种用于解决集合合并和查询问题的数据结构&#xff0c;主要用于实现有关集合的操作&#x…

Skywalking高级使用

Skywalking高级使用 RPC调用监控Mysql调用监控Skywalking常用插件获取追踪ID过滤指定的端点告警功能Skywalking原理Open Tracing介绍 RPC调用监控 Skywalking(6.5.0)支持的RPC框架有以下几种&#xff1a; (1) Dubbo 2.5.4 -> 2.6.0 (2) Dubbox 2.8.4 (3) Apache Dubbo 2.7.…

动态规划 DP (六) 字符串编辑

1.字符串编辑 字符串编辑问题是一类常见的问题&#xff0c;通常涉及对字符串进行插入、删除、替换等操作&#xff0c;以达到某种特定的目标。 常见的字符串编辑问题包括&#xff1a; 编辑距离&#xff08;Edit Distance&#xff09;&#xff1a;给定两个字符串&#xff0c;通…