1. FlexSPI driver API

1.1 API产生背景

​ i.MXRT系列都是Flashless(没有内置NVM)的芯片,所以BootROM必不可少。BootROM是个很特殊的东西,本质上它是一个完整的C代码写成的系统级App,这个系统级App专门用于从外部存储器中加载用户级App执行。简单地说,BootROM就是PC机里的BIOS。

​ BootROM代码是存放在专门的ROM区域的(前面讲i.MXRT系列没有内置NVM,其实不够准确,其实是有内部ROM空间的,只不过这个ROM区域用户无法下载程序使用,因此等效于没有NVM),ROM顾名思义Readonly,所以BootROM代码只能随着芯片一起Tapeout,代码无法更改(其实也有ROM patch机制,以后再介绍)。

​ ROM空间其实挺大的,从64KB到512KB不等,因芯片启动功能复杂程度而异。下图是i.MXRT1050系列的BootROM所占空间,ROM起始地址是0x200000(起始地址在i.MXRT上都一样),ROM大小为96KB(这是标准启动功能所要的代码长度。在i.MXRT1010上是64KB - 精简启动功能,在i.MXRT1170上是256KB - 复杂启动功能)。

​ BootROM代码其实并没有占满全部ROM空间,总有些剩余空间(因为工艺原因,ROM空间都是8/16KB倍数),这部分空间浪费了着实可惜。如果我们能把SDK里的一些常用模块驱动(比如WDOG)顺便放进去供用户调用,既充分利用ROM空间,也为用户节省Flash空间,岂不是一举两得。此外,BootROM功能代码中也有一些现成模块驱动(比如各种启动设备存储器驱动接口)可以一并导出,这便是API由来。

​ 这里是恩智浦官方工程师博客中关于此项的开发笔记:

其实i.MXRT1050,1020,1015系列ROM也提供了FlexSPI driver API

利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP

1.2 支持ROM API型号

RT芯片型号 是否支持ROM API 是否全功能API
i.MXRT117x 支持
i.MXRT1064 支持
i.MXRT106x 支持
i.MXRT105x 未开放 -> 官宣开放 N/A -> 仅少get_config()
i.MXRT1021 未开放 -> 官宣开放 N/A -> 少get_config()和erase_all()
i.MXRT1015 未开放 -> 官宣开放 N/A -> 少get_config()和erase_all()
i.MXRT1011 支持 否(没有program()和erase())

1.3 RT1021 FlexSPI驱动使用示例

// 找到API根结构体
#define g_bootloaderTree (*(bootloader_api_entry_t **)0x0020001c)// 定义FlexSPI配置变量
flexspi_nor_config_t config;
uint32_t instance = 0;// 需要初始化完整512bytes FlexSPI配置变量
config.memConfig.tag     = FLEXSPI_CFG_BLK_TAG
config.memConfig.version = FLEXSPI_CFG_BLK_VERSION
// ...// 调用API中init()函数
g_bootloaderTree->flexSpiNorDriver->init(instance, &config);
// 调用API中erase()函数

2. IMX RT FlexSPI的DQS信号

​ DQS信号是数据采样信号,实际上就是“从器件”接收“主控器件”发送的SCK时钟信号后,返回给了“主控器件”,一般低速SPI通信使用SCK作为采样时钟即可,想要通信可靠,需要数据和SCK信号之间满足Setup和Hold时间的要求,如下图:

​ DQS信号就是源SCK信号经过“从器件” 的同步和线路上的延迟,与数据信号是基本同步的,因此“主控器件”使用DQS信号作为数据的采样信号,可以达到比较高的速度和采样正确率。

​ FlexSPI接口提供了三种DQS选项,参看前面一篇记录iMX RT FlexSPI 时序及驱动程序参数设置解析。

  1. 第一种

​ 内部虚拟读探测和内部环回流(MCR0 [RXCLKSRC = = 0) (kFLEXSPI_ReadSampleClkLoopbackInternally)

  • 支持零设备输出保持时间的遗留设备;

  • 节省一个引脚(DQS pad);

  • 支持低频时钟开机使用。

  • 这种模式不使用DQS信号,而是内部虚拟采样信号,就是软件延迟的方式,由于无法判断外部器件的延迟,为了减少通信误码率,这种方式只能在较低速度下工作,不支持高速信号。

  1. 第二种
  • 内部虚拟读探测和环路从DQS引脚(MCR0[RXCLKSRC]==1)(kFLEXSPI_ReadSampleClkLoopbackFromDqsPad)

  • 比上一种模式频率更高(133M);

  • 支持不提供读选通脉冲的器件。

  • 其实也是虚拟的DQS信号,只不过用到了硬件DQS引脚,可以在DQS引脚上加电容增加数据和时钟的时延。这种方式在高速时也不是很可靠,实际使用中通信频率也不高。

  1. 第三种
  • Flash提供读取选通脉冲信号(MCRO[RXCLKSRC]==3) (kFLEXSPI_ReadSampleClkExternalInputFromDqsPad)

  • 支持最高频率(166M);

  • 支持装置提供读取选通脉冲。

  • 这种方式就是完全的DQS引脚由从期间控制,提供真实的采样脉冲信号。由于可以保证数据和采样信号同步,这种方式的工作频率也最高。

  • 在调试FlexSPI和FPGA通信程序的过程种发现,RT芯片采到的第一个数据总是不对,但是用ILA(片内逻辑分析)抓到的波形却都是正常的,使用的是120M 8线 SDR的通信方式,抓到的波形如下:

  • 在FPGA上对SCK信号和数据信号做延迟又比较麻烦,因此考虑有没有其他办法。后来想到此时使用的是第二种采样方式,手册的最高速度是66M,显然是超过规定值了。RT的程序中,将采样方式改为第三种就正常了。

NXP RT1021应用笔记相关推荐

  1. NXP RT1064学习笔记(一)— 开发环境

    最近在做RT1064的开发,网上能找到的资料不多,基本上都是NXP官方的资料,于是决定自己写笔记做个记录. i.MX RT1064 简介 i.MX RT1064 处理器属于全新的处理器系列,采用恩智浦 ...

  2. NXP RT1021初探

    GPIO配置 ①为一个pad(引脚),每个pad由五路信号控制 input_on 输入开关信号,用于控制是否开启强制输入功能(SW_MUX_CTL_PAD 寄存器的SION 位设置).如果开启强制输入 ...

  3. NXP RT1064学习笔记(六)— RTC

    一.介绍 Real time clock(RTC),实时时钟,它是一个可由软件配置的实时时钟模块,可以直接输出年.月.日.时.分.秒. 在RT1064中,RTC用的是Secure Non-Volati ...

  4. 6轴和9轴的IMU姿态估计

    传感器分析 加速度计航推使用场景 短时间且有先验模型可以做跟踪 This is made possible by zeroing velocity errors each time the foot ...

  5. ATECC508A芯片开发笔记(十一):NXP 平台移植ATECCx08 CryptoAuthLib库(I2C)

    目录 ATECC508A芯片开发笔记(十一):NXP 平台移植x08库(I2C) 一.CryptoAuthLib 二.Nxp RT10xx平台上移植CryptoAuthLib 2.1.在官网下载最新的 ...

  6. 3、S32K14X学习笔记(三):MDK5/Keil5下安装恩智浦-NXP S32K11X和S32K14X系列pack包

    MDK5/Keil5下安装恩智浦-NXP S32K11X和S32K14X系列pack包 1.下载地址: ①.可以关注微信公众号:Kevin的学习站,后台发送:S32K11XPACK包或者S32K14X ...

  7. i.MX RT开发笔记-02 | i.MX RT1062开发环境搭建(MDK芯片包、NXP SDK详解)

    文章目录 一.Keil MDK 开发工具 1. 下载安装Keil-MDK 2. MDK芯片包 二.MCUXpresso SDK 1. 下载SDK 2. SDK内容 2.1. boards 2.2. C ...

  8. 不忘初心helloworld,IMX6入门学习笔记

    本文按照时间学习的先后顺序,入门体验了知名半导体厂商NXP的著名处理器--IMX6. 无论你是否有基础,都能按照流程学会软件使用和交叉编译方法,老规矩:看不懂算我的. 了解开发板 官方资料链接: ht ...

  9. 【Linux笔记】LED驱动程序

    前言 上一篇我们分享了字符设备驱动框架:[Linux笔记]驱动基础篇,当时分享的是hello驱动程序. 学STM32我们从点灯开始,学Linux驱动我们自然也要点个灯来玩玩,尽量在从这些基础例程中榨取 ...

最新文章

  1. 关于捕获键盘信息的processDialogkey方法
  2. extjs 4 tab panel得strip在IE下右偏解决办法
  3. 四周有阴影_四周窄边全功能TypeC 飞利浦256P1FR评测
  4. java监听所有端口_(变强、变秃)Java从零开始之zookeeper安装
  5. 牛客多校第六场-H-Pair
  6. Linux 服务器安装discuz 7.2论坛
  7. springmvc atomikos mysql数据源_springboot+atomikos+多数据源管理事务(mysql 8.0)
  8. python扫盲系列(5)--列表、元组、字典、集合
  9. java压缩成.tar_java压缩tar.gz | 学步园
  10. 调用lambda_如何使用Lambda调用上下文动态设置超时
  11. mfc color 亮度_双十一4K投影仪怎么选?小心别掉“亮度坑” - 电视
  12. Windows移动开发(二)——闭关修炼
  13. C#遍历DataSet数据的几种方法总结
  14. DIV_ROUND_CLOSEST函数
  15. 【基础篇】————28、横向渗透
  16. C语言 分数加减运算
  17. 八类网线和七类网线的区别_7类网线和8类网线到底有何不同?
  18. EasyUI onSelect方法
  19. English语法_形容词-排序
  20. 微信小程序开发之——摇一摇Demo

热门文章

  1. 文思海辉与雅观科技达成战略合作,加速智慧场景应用落地
  2. vue开发项目必备知识
  3. 华为p40手机自带计算机,如何让华为p40与电脑进行连接
  4. 高光谱遥感数值建模技术及在植被、水体、土壤信息提取领域应用
  5. Linux搭建部署Ldap服务器,亲测可用
  6. 关于Surface键盘突然失灵的解决方案
  7. java-jar启动jar包
  8. python二维数组的行和列_python 定义N行2列二维数组与赋值
  9. 新消费到底「新」在哪里?
  10. 数据分析师常用的 Linux 命令总结