查看: 1599|回复: 0

[原创] 分享RT1021相关API的知识点

[复制链接]
  • TA的每日心情
    开心
    2023-2-28 15:37
  • 签到天数: 42 天

    [LV.5]常住居民I

    42

    主题

    500

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1369

    热心会员

    最后登录
    2024-2-23
    发表于 2021-5-19 18:21:49 | 显示全部楼层 |阅读模式
    今天分享一点关于RT1021的知识点,关于应用笔记的一些分享,内容如下
    1. FlexSPI driver API
    1.1 API产生背景
    ​i.MXRT系列都是Flashless(没有内置NVM)的芯片,所以BootROM必不可少。BootROM是个很特殊的东西,本质上它是一个完整的C代码写成的系统级App,这个系统级App专门用于从外部存储器中加载用户级App执行。简单地说,BootROM就是PC机里的BIOS。
    1.png
    ​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型号
    2.png
    1.3 RT1021 FlexSPI驱动使用示例
    1. // 找到API根结构体
    2. #define g_bootloaderTree (*(bootloader_api_entry_t **)0x0020001c)

    3. // 定义FlexSPI配置变量
    4. flexspi_nor_config_t config;
    5. uint32_t instance = 0;

    6. // 需要初始化完整512bytes FlexSPI配置变量
    7. config.memConfig.tag     = FLEXSPI_CFG_BLK_TAG
    8. config.memConfig.version = FLEXSPI_CFG_BLK_VERSION
    9. // ...

    10. // 调用API中init()函数
    11. g_bootloaderTree->flexSpiNorDriver->init(instance, &config);
    12. // 调用API中erase()函数
    复制代码
    2. IMX RT FlexSPI的DQS信号
    ​ DQS信号是数据采样信号,实际上就是“从器件”接收“主控器件”发送的SCK时钟信号后,返回给了“主控器件”,一般低速SPI通信使用SCK作为采样时钟即可,想要通信可靠,需要数据和SCK信号之间满足Setup和Hold时间的要求,如下图:
    3.png
    ​DQS信号就是源SCK信号经过“从器件” 的同步和线路上的延迟,与数据信号是基本同步的,因此“主控器件”使用DQS信号作为数据的采样信号,可以达到比较高的速度和采样正确率。


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


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


    支持零设备输出保持时间的遗留设备;
    节省一个引脚(DQS pad);
    支持低频时钟开机使用。
    这种模式不使用DQS信号,而是内部虚拟采样信号,就是软件延迟的方式,由于无法判断外部器件的延迟,为了减少通信误码率,这种方式只能在较低速度下工作,不支持高速信号。


    第二种
    内部虚拟读探测和环路从DQS引脚(MCR0[RXCLKSRC]==1)(kFLEXSPI_ReadSampleClkLoopbackFromDqsPad)
    比上一种模式频率更高(133M);
    支持不提供读选通脉冲的器件。
    其实也是虚拟的DQS信号,只不过用到了硬件DQS引脚,可以在DQS引脚上加电容增加数据和时钟的时延。这种方式在高速时也不是很可靠,实际使用中通信频率也不高。


    第三种
    Flash提供读取选通脉冲信号(MCRO[RXCLKSRC]==3) (kFLEXSPI_ReadSampleClkExternalInputFromDqsPad)
    支持最高频率(166M);
    支持装置提供读取选通脉冲。
    这种方式就是完全的DQS引脚由从期间控制,提供真实的采样脉冲信号。由于可以保证数据和采样信号同步,这种方式的工作频率也最高。


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


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


    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-6 23:27 , Processed in 0.118951 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表