大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT全系列FlexSPI外设的LUT长度。
事情起源于一个 RT600 客户, 他们读芯片用户手册发现 FlexSPI 外设 LUT 长度为 128 words(这是 RT500/RT10xx/RT1170 上的两倍),他们想尝试用起来,发现后 64 words 不起作用。
说实话,痞子衡用了这么久的 FlexSPI 外设,还真没注意到这个细节,原因是 64 words 的 LUT 已经能够支持实现 16 条时序,这对于大部分应用场景都绰绰有余。于是痞子衡找了一块 RT600 开发板测试了一下,发现确实有问题,这应该是 RT600 用户手册上的美丽勘误。借此机会痞子衡就和大家梳理一下 i.MXRT 全系列 LUT 长度与设计:
- Note: 该勘误存在于 RT600 UM Rev 1.8 以及 SDK v25.06 版本及之前
一、LUT设计差异
LUT 组件可以说是 FlexSPI 外设最核心的部分,关于其工作原理,详见痞子衡旧文?《从头开始认识i.MXRT启动头FDCB里的lookupTable》。客户在 RT600 手册以及 SDK 里发现的勘误主要是 FlexSPI 结构体原型定义里 LUT 长度 FLEXSPI_LUT_COUNT 被设为了 128,而实际上应该是 64(头文件一般是根据手册内容自动生成的)。
LUT 指标除了总长度之外,还有一个重要指标,即单条时序最大长度(也可认为子时序数量),大部分 i.MXRT 上 FlexSPI 单条时序支持的最多子时序为 8 条(每条子时序长度固定 2Bytes),即如下图。
- Note:这里需要注意,当某条时序中子时序不满 8 条时,剩余空间也不可另作它用,因为 FlexSPI->IPCR1[ISEQID] 里所标示的时序 index 对应得 LUT 里步长单位是时序最大长度。
RT700 上外设升级到了 XSPI,其单条时序支持的最多子时序为 10 条,即如下图所示,其余 LUT 用法和 FlexSPI 类似。
目前来看 RT1180 最强,支持的时序数量最多,不过对于其它 i.MXRT 也不用慌。如果工程里实际需要的时序大于 16,可以动态更新 LUT 表以分时复用空间,这样实际能实现的时序数量是不限的。
二、LUT长度对驱动影响
当前 SDK 包里的 flexspi 驱动和例程是以 16 条时序来设计的,这对于除了 RT1180 之外的其它 i.MXRT 型号是合适的。而在 RT1180 上,例程里我们只需把 CUSTOM_LUT_LENGTH 改为 128,然后在 customLUT 里添加更多时序实现即可。
- 例程路径: SDKboardsevkmimxrt1180driver_examplesflexspinor
#define?CUSTOM_LUT_LENGTH ? ? ? ?128
const?uint32_t?customLUT[CUSTOM_LUT_LENGTH] = {
? ? ? ??// 时序...
};
而至于 fsl_flexspi.c 驱动(V2.7.0及之前),里面和 LUT 相关的就一个如下函数 FLEXSPI_UpdateLUT(),这个函数用于更新 LUT 表,在例程里我们是一次性更新进去,所以参数里的 index 检查没有问题;如果是动态单条更新 LUT,那么函数里面的第一句 assert() 检查就需要为 RT1180 做相应改动。
至此,i.MXRT全系列FlexSPI外设的LUT长度痞子衡便介绍完毕了,掌声在哪里~~~
429