iMX RT FlexSPI 时序及驱动程序参数设置解析 (一)
FlexSPI是一个功能强大的接口,和普通SPI相比,使用比较复杂,较难上手。近期调试FlexSPI与FPGA接口,将通过系列博客进行记录。
先看RT1052参考手册1694页
在这之前先介绍一个概念:serial root clock ,手册中提及的serial root clock 是FlexSPI接口工作的基础时钟,SCK可以在serial root clock的基础上得到。在SDR模式下,SCK周期是serial root clock的两倍,DDR模式下,SCK周期等于serial root clock。之前对这部分理解有误。
/* Set flexspi root clock to 332MHZ. */const clock_usb_pll_config_t g_ccmConfigUsbPll = {.loopDivider = 0U};CLOCK_InitUsb1Pll(&g_ccmConfigUsbPll);CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 26); /* Set PLL3 PFD0 clock 332MHZ. */CLOCK_SetMux(kCLOCK_FlexspiMux, 0x3); /* Choose PLL3 PFD0 clock as flexspi source clock. */CLOCK_SetDiv(kCLOCK_FlexspiDiv, 5);
27.5.13 FlexSPI输出时序
本节描述FlexSPI中的输出计时。
27.5.13.1 数据与SCLK之间的输出时序
本节描述数据(A口/B口)和SCLK的输出时序关系。数据输出定时有三种情况:
SDR序列中的SDR指令
SDR序列是只包含SDR指令的序列。在这种情况下,所有数据位在FlexSPI接口持续一个串行根时钟周期。下面的图表示了串行根时钟、数据和SCLK的关系:
DDR序列中的SDR指令
DDR序列是一个flash访问命令序列,它包含的DDR指令不是无效填充的,它可以选择性地包含SDR指令。在DDR序列的SDR指令情况下,所有数据位在FlexSPI接口持续两个串行根时钟周期。下面的图表示了串行根时钟、数据和SCLK的关系:
DDR指令按DDR顺序执行
在DDR指令在DDR序列的情况下,所有的数据位在FlexSPI接口持续一个串行根时钟周期。下面的图表示了串行根时钟、数据和SCLK的关系:
27.5.13.2 CS与SCLK之间的输出时序
本节描述芯片选择(在A_SS0_B/A SS1 B/B_SS0 B/B_SS1 B)和SCLK的输出时序关系。SDR序列和DDR序列的时间关系略有不同。
SDR序列下的片选时序
对SDR序列来说,从CS片选有效到SCLK上升边的时延为(FLSHxCR1[TCSS]+0.5)个串行根时钟周期;
从SCLK下降沿到片选无效的延迟是FLSHxCR1[TCSH]个串行根时钟周期。片选与SCLK之间的时序关系如下图所示:
•DDR顺序的片选时序
对于DDR序列,芯片选择有效和SCLK上升边产生的延迟为(TCSS+0.5)个串行根时钟周期;来自SCLK下降边缘和芯片选择无效的延迟是(TCSH+0.5)个串行根时钟的周期。芯片选择与SCLK之间的时序关系如下图所示:
对于某些设备(如FPGA设备),芯片选择有效的间隔是有限制的。如果寄存器字段FLSHxCR1[CSINTER VAL]被设置为非零值,FlexSPI将确保芯片选择之间的延迟时间有效。延迟时间为:CSINTERVAL*1024周期的串行根时钟,无论SDR或DDR序列。
如果外部设备没有此限制,请将此寄存器字段值设置为零。下图显示了芯片选择间隔的时间。
27.5.14 FlexSPI输入时序
本节描述FlexSPI的输入时序。
27.5.14.1 RX时钟源特性
本节描述每个RX时钟源的特性。
内部虚拟读探测和内部环回流(MCR0 [RXCLKSRC = = 0) (kFLEXSPI_ReadSampleClkLoopbackInternally)
支持零设备输出保持时间的遗留设备;
节省一个引脚(DQS pad);
支持低频时钟开机使用。
内部虚拟读探测和环路从DQS引脚(MCR0[RXCLKSRC]==1)(kFLEXSPI_ReadSampleClkLoopbackFromDqsPad)
比上一种模式频率更高(66M);
支持不提供读选通脉冲的器件。
Flash提供读取选通脉冲信号(MCRO[RXCLKSRC]==3) (kFLEXSPI_ReadSampleClkExternalInputFromDqsPad)
支持最高频率(166M);
支持装置提供读取选通脉冲。
27.5.14.2用伪读选通脉冲采样的输入时序
本节描述了使用内部虚拟读取读选通脉(MCR0[RXCLKSRC]设置为0x0或0x1)采样时的输入时序。内部虚拟读环回和从DQS引脚环回的时序是非常类似的。但在DQS引脚上采用虚拟读环回采样,可以补偿SCLK输出路径和数据引脚输入路径的延迟,从而实现更高的读取频率。SDR模式和DDR模式的输入时序不同。
在SDR模式下使用虚拟读取脉冲进行采样的输入时序
对于SDR读/学习指令,FlexSPI用虚拟读脉冲的下降边对输入数据引脚进行采样。下图显示了SDR模式下使用虚拟读取脉冲采样的输入时序
DDR模式下使用伪读脉冲进行采样的输入时序
对于DDR读/学习指令,FlexSPI在虚拟读脉冲上升和下降边缘采样输入数据引脚。下图显示了DDR模式下使用伪读脉冲进行采样的输入时序
27.5.14.3 带有读脉冲采样的输入时序
本节描述了用外部提供的读脉冲进行采样时的输入时序(MCRO[RXCLKSRC]设置为0x3)。SDR模式和DDR模式的输入时序不同。
注意:没有已知的器件能提供读脉冲并且支持SDR模式操作。
有两种FLASH提供的读脉冲:
FLASH提供读取脉冲与SCLK
对于某些闪存设备,它通过SCLK提供读数据和读脉冲。然后读取脉冲边缘与读取数据变化对齐。FlexSPI控制器应该延迟读脉冲半个周期用串行根时钟(带有DLL),然后用延迟后的读脉冲采样读数据。有关采样的详细信息,请参考DLL配置。下图显示了SDR模式和DDR模式下脉冲采样的输入时序:
27.5.14.4 DLL 采样 配置
四个采样时钟源的输入时序是不同的。这是通过根据采样时钟源模式不同地设置寄存器DLLxCR来处理的。DLL是一个硬件延迟线链,它可以被设置为一个固定数量的延迟单元或自动调整锁定在参考时钟的某个相位延迟。
在以下情况下,DLLxCR设置为0x00000100 (DLL延迟链中1个固定延迟单元)
采样数据与虚拟读脉冲环回内部(MCR0[RXCLKSRC] = 0x0)
用虚拟读脉冲从DQS引脚环回采样数据(MCR0[RXCLKSRC]= 0x1)
当Flash提供读脉冲(MCR0[RXCLKSRC]=0x3)和Flash提供读脉冲用SCLK采样数据时,应设置DLL为:锁定参考时钟(串行根时钟)的半个周期
SLVDLYTARGET=0xF
DLLEN=0x1
OVRDEN=0x0
DLLxCR中的其他字段应该保持复位值(0)
注意
如果串行根时钟低于100M。DLL无法锁定串行根时钟的半周,因为延迟单元数在延迟链中是有限的。那么DLL应该配置如下:
OVRDEN = 0x1
OVRDVAL=N;
DLL中每个延迟单元约为75 ps-225 ps(Delay_cell delay), DLL延迟链的时延为(N * Delay_cell delay), N应根据最大值进行设置。
当前项目支持的DDR频率,N = 17,请注意这是一个推荐值。如果失败,可能需要在实际应用中调整。
DLLxCR中的其他字段应该保持为重置值(全部为零)。
使用单端时钟和差分时钟的DLL设置不同,官方驱动中会根据 flexspi_device_config_t 结构体中的
flexspiRootClk 和 isSck2Enabled元素进行设置。
小结
以上,手册中的基本内容介绍完毕,下一篇介绍程序配置。
iMX RT FlexSPI 时序及驱动程序参数设置解析 (一)相关推荐
- 商品扫码器驱动如何设置 商品扫码器驱动设置步骤
商品扫码器驱动如何设置?商品扫码器驱动设置步骤,商品扫码器一般分为三种接口,分别为USB接口.串口和键盘口.只需要选择适合使用的接口,也就是说电脑或其他设备上有什么接口,就选择什么接口就对了,就大多数 ...
- 雷蛇驱动显示连接不到服务器,雷蛇驱动个性设置_雷蛇驱动打不开怎么办
在我们使用各种设备与电脑连接的过程中,经常是需要借助于驱动软件,让硬件设备可以发挥工作的.雷蛇驱动是专门针对用户打造的一款特别好用的驱动文件,方便每一个用户在安装了这种驱动程序之后,轻轻松松的实现最简 ...
- 网卡驱动如何设置组播MAC地址
最近关注了一些IP组播的知识,IP的组播需要以太网的支持.在这边文章内我们就主要讨论以太网如果支持IP组播. 首先看当前的interface是否支持multi-cast,如下面的命令红色部分标注,则说 ...
- 【NanoPi T2】 7.uboot gmac网卡驱动(3) - 驱动源码解析
1.mac控制器,phy芯片,rgmii协议 2.寄存器介绍 3.驱动源码解析 4.nanopi t2 移植rtl8211e网卡驱动(首发) 驱动注册入口 驱动的注册分两个部分,一个部分是静态编译的时 ...
- 《OV4689摄像头模组驱动源码解析》
<OV4689摄像头模组驱动源码解析> OV4689是一款广泛应用于工业.安防等领域的高清图像传感器.在这篇文章中,我们将介绍如何在单片机上使用OV4689模组,并提供相应的驱动源码. O ...
- linux驱动---ioctl函数解析
转自(39条消息) linux驱动---ioctl函数解析_那可真是太开心了的博客-CSDN博客_linux驱动ioctl 参考:ioctl,unlocked_ioctl 处理方法-阿里云开发者社区 ...
- 时序数据库-2-[IoTDB]的原理解析
清华自研时间序列数据库Apache IoTDB原理解析 时序数据库 Apache-IoTDB 源码解析之前言(一) 时序数据库 Apache-IoTDB 源码解析之系统架构(二) 时序数据库 Apac ...
- 展锐平台的camera sensor驱动代码设计解析(2)
展锐平台的camera sensor驱动代码设计解析(1) 展锐平台的camera sensor驱动代码设计解析(2) 展锐平台的camera sensor驱动代码设计解析(3) Camera驱动的基 ...
- 2008年12月13日上海USB驱动开发深度解析讲座PPT
讲座PPT:宋宝华2008年12月13日上海USB驱动开发深度解析讲座PPT [url]http://www.linuxdriver.cn/200812/20081213172619_836.rar[ ...
最新文章
- 鱼相忘于江湖,人相忘于道术
- php7简短而安全的数组遍历方法
- python乘法模板_python – 使用矩阵乘法的numpy模板匹配
- 关于Python的学习和认知---刘浩
- 392. 判断子序列 golang 关于布尔类型返回值判断的思考
- 1.9 编程基础之二分查找 13:整数去重 python
- 03数据库的基本查询
- ES6入门之对象的扩展
- 2016学计算机软件,2016年夏季学期计算机(软件)学院学年论文字数、页数和格式要求.doc...
- 【动态规划】多重背包问题:P1077摆花
- python3安装setuptools步骤_python在Windows下安装setuptools(easy_install工具)步骤详解
- matlab定位噪声位置,Matlab怎么样调节KALMAN滤波中的过程噪声和观测噪声
- python中write的用法_python中write方法是如何使用?
- 昆仑通态复制的程序可以用吗_MCGS昆仑通态触摸屏常见问题(5)
- C语言入门之鸡兔同笼(简易版)
- RADIUS协议解析
- 从零开始微信小游戏(cocos creator)
- java四舍五入保留两位小数方法整理
- [Unity2D入门教程]简单制作仿植物大战僵尸游戏之③完善Defender植物和Attacker的相关细节(脚本,碰撞体)
- linux服务器下如何显示中文的图片,Linux服务器中文显示问题
热门文章
- python的难点在哪里_python厉害在哪里?看看python大牛怎么说
- jquery获取所有子元素宽度之和
- Oracle的字符集由AMERICAN_AMERICA.ZHS16GBK修改为SIMPLIFIED CHINESE_CHINA.ZHS16GBK
- 嵌入式系统主要应用于哪些行业中?(可就业方向)
- 未能检测服务器连接失败,被控链接失败处理检查方法
- APP常见的归因方式
- Hbuild-X使用生成签名证书失败,怎么解决 +云打包
- 女王大学 计算机专业,伦敦玛丽女王大学计算机科学专业
- 启动word 2016时弹出“很抱歉,此功能看似已中断,并需要修复......”解决方案
- 月光族开始反消费主义:58万年轻人攒钱攒到“丧心病狂”