NXP RT1021应用笔记

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 - 复杂启动功能)。

img

​ 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时间的要求,如下图:

img

​ 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的程序中,将采样方式改为第三种就正常了。

### Micropython on NXP RT1021 Chip Compatibility and Usage NXP's RT1021 is part of the i.MX RT series which features Arm Cortex-M7 cores designed for high-performance applications. The compatibility of MicroPython with this specific microcontroller depends largely on community support and available ports. MicroPython has been successfully ported to various platforms including those based on ARM architectures similar to that used by the RT1021[^3]. However, direct information about a pre-existing official port specifically targeting the RT1021 was not found within provided references or common resources up until now. This suggests either limited documentation availability or lack thereof at present time. For developers interested in running MicroPython on an RT1021 device, one approach would involve creating a custom build tailored explicitly towards this hardware configuration. Such efforts typically require deep understanding both of MicroPython internals as well as detailed knowledge regarding target MCU specifics like memory layout, peripheral interfaces etc.[^4] Alternatively, exploring existing projects such as CircuitPython—a fork maintained by Adafruit Industries—which already supports several MCUs from different vendors might prove beneficial since these often share architectural similarities allowing easier adaptation processes compared starting entirely anew [^5]. ```python import board from digitalio import DigitalInOut, Direction led = DigitalInOut(board.LED) led.direction = Direction.OUTPUT while True: led.value = not led.value ``` The above code snippet demonstrates how simple I/O operations can be performed using Python-like syntax when working within environments supporting it; however actual implementation details will vary depending upon chosen framework (e.g., MicroPython vs CircuitPython).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值