大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP

  i.MXRT系列MCU发布已两年多了,基于i.MXRT的客户产品也越来越多,可以说是全面开花了。痞子衡作为i.MXRT产品线的系统应用工程师,早期的时候还可以尽情做参考设计,现在基本大量时间都被客户支持占据了。

  因为i.MXRT系列都没有内置Flash(RT1064, RT1024等SIP型号除外),因此为其搭配一块串行NOR Flash去启动是客户项目的第一个头等大事,而串行NOR Flash厂商非常多,客户选择余地很大,因此我们不得不与客户一起同茫茫Flash型号打交道,痞子衡也常常调侃自己已沦为Flash测试工程师。

  痞子衡在支持客户解决串行NOR Flash下载启动问题过程中主要遇到几个常见因素,这几个因素可能会影响Flash在i.MXRT下无法正常使用,今天痞子衡就重点跟大家聊聊SFDP这个因素。

一、SFDP标准简介

  SFDP又叫JESD216,是JEDEC协会于2011年开始推出的串行Flash接口标准,类似于CFI在并行NOR Flash上的标准。SFDP发展至今已经诞生了如下版本:

时间 标准
2011 JESD216
2013.07 JESD216A
2014.05 JESD216B
2018.08 JESD216C
2018.11 JESD216D
2019.08 JESD216D.01

  我们知道串行Flash厂商非常多,在2011年之前,大家都是各自玩,没有明确的统一标准(虽然几个领头厂商起了示范作用,但各家在具体细节上还是会有差异),这对于Flash用户来说就比较麻烦了,需要把各家Flash手册仔细研读,不能漏掉任何一个细节。

  随着串行Flash市场需求越来越强烈,各个厂商也在铆足劲给自家Flash加特性,这时候JEDEC站出来了,拉了几个主要的Flash厂商一起订个SFDP标准,有了这个标准,Flash用户就方便多了,尤其是软件设计人员,开发Flash驱动从此有标准可依,甚至一套驱动可以用在所有支持SFDP标准的Flash上,实现各厂商Flash之间轻松切换。

二、部分Flash型号不支持SFDP

  因为SFDP标准是2011年才开始推出,新兴Flash厂商(比如兆易创新)的产品基本都是支持SFDP标准的,而部分老牌Flash厂商(比如华邦)则存在老型号和新型号共存的问题。老型号都是2011年前设计生产的,不支持SFDP;2011年之后设计的新型号基本都是支持SFDP的。

  华邦目前是串行Flash第一大厂商,痞子衡遇到好几个i.MXRT客户,选用的华邦NOR Flash,但Flash里不支持SFDP,因此客户支持稍微复杂一些。关于SFDP支持问题,痞子衡特别联系过华邦销售人员,得到了他们的答复,华邦NOR Flash家族里 W25QxxJVW25QxxJW 系列都是新型号,全部支持SFDP;而 W25QxxFVW25QxxFW 系列属于老型号,大多没有SFDP,但是也有如下部分型号支持SFDP:

  虽然我们可以在后续开发的过程中也能正常使用非SFDP标准的Flash以及能通过读SFDP命令查询出芯片是否支持SFDP,但最好在Flash选型前就能明确知道其SFDP情况,这个需要跟Flash厂商销售沟通好。总之,痞子衡推荐大家选用各厂商支持SFDP标准的新型号。

三、不支持SFDP的Flash如何适用i.MXRT下载

  如果你认真看过痞子衡写的i.MXRT启动系列文章,你应该知道i.MXRT之所以能够支持市面上几乎所有的串行NOR Flash启动是靠的512 byte的FDCB结构体,这个结构体原型即flexspi_nor_config_t,它可以描述启动所需的所有Flash参数信息。

  i.MXRT在启动时首先会用1bit SDR时序模式去获取用户放在Flash开始或偏移0x400处(因i.MXRT型号而异)的FDCB,然后根据FDCB里的信息去进一步配置启动,因此Flash里有无SFDP其实不影响启动,只要在FDCB里描述清楚即可。

  但是Flash里有无SFDP非常影响在i.MXRT相关配套工具下的擦写操作(俗称下载),因为所有工具(JLink、各IDE、ROM配套Flashloader、痞子衡的MCUBootUtility)默认都是基于SFDP来设计Flash下载算法的。

  仅以ROM配套Flashloader为例,其上位机工具是blhost.exe,它有如下经典的命令序列。这个序列就是利用用户提供简化的串行Flash配置值0xc0000007(描述一般的四线QSPI)来初始化FlexSPI以及Flash,为后续擦写操作做准备。

blhost -u -- fill-memory 0x20202000 4 0xc0000007
blhost -u -- configure-memory 0x9 0x20202000

  configure-memory命令底层到底是什么样的逻辑呢?让我们找到任何一个SDK包,在\SDK_2.x.x_MIMXRTxxxx-EVK\middleware\mcu-boot\src\memory\src\flexspi_nor_memory.c里可以找到如下函数flexspi_nor_mem_config(),它就是其底层逻辑,在这个函数里我们可以看到,Flashloader会判断传来的config值到底是简化的serial_nor_config_option_t,还是完整的flexspi_nor_config_t。

  如果config是简化的serial_nor_config_option_t,Flashloader会调用flexspi_nor_get_config()函数去自动填充生成完整的flexspi_nor_config_t,你可以继续去看flexspi_nor_get_config()函数的实现,对于普通四线QSPI,其就是根据Flash里读回的SFDP表内容来做的填充,因此这种方式下SFDP不可缺。

status_t flexspi_nor_mem_config(uint32_t *config)
{
status_t status = kStatus_InvalidArgument;
bool isNorConfigOption = false; serial_nor_config_option_t *option = (serial_nor_config_option_t *)config;
flexspi_nor_config_t *norConfig = (flexspi_nor_config_t *)config; if (option->option0.B.tag == kSerialNorCfgOption_Tag)
{
status = flexspi_nor_get_config(s_flexspiNorContext.instance, &s_flexspiNorConfigBlock, option);
// ...
isNorConfigOption = true;
}
else if (norConfig->memConfig.tag == FLEXSPI_CFG_BLK_TAG)
{
memcpy(&s_flexspiNorConfigBlock, norConfig, sizeof(flexspi_nor_config_t));
isNorConfigOption = true;
}
// ... if (isNorConfigOption)
{
status = flexspi_nor_flash_init(s_flexspiNorContext.instance, &s_flexspiNorConfigBlock);
// ...
} return status;
}

  上面这种0xc0000007搞定一切四线QSPI的方式仅适用于含SFDP的Flash,对于不含SFDP的Flash怎么办呢。其实上面已经给了解决方法,那就是直接提供完整的FDCB,因此i.MXRT相关配套工具下载算法都需要相应改一下,痞子衡在两个项目上都做了非SFDP Flash支持:

  1. J-Link下载算法源工程,可以参考 /boards/msft_rt600_xproject/flash_algo_b0_silicon/Keil_JLink 这个源工程
  2. MCUBootUtility v2.3更新,参看文章 《MCUBootUtility v2.3发布,这次不再放过任何一款Flash》 第2.3节

  至此,导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

最新文章

  1. 启动tomcat 报 Could not delete D:/online/.metadata/.plugins/org.eclipse.wst.server.core/tm
  2. 再牛逼的梦想,也抵不住SB似的坚持
  3. iOS-图片拉伸技巧
  4. linux rdate
  5. 优于CoreData的Realm数据库基础教程
  6. LFS7.4编译笔记(2)
  7. visual studio 2013 快捷键大全、VS2013常用快捷键
  8. 2015北京网络赛 A题 The Cats' Feeding Spots 暴力
  9. SIEBEL安装问题
  10. Python自动化运维之3、函数、lambda、递归
  11. 2013移动APP界面设计趋势与设计理念
  12. LAMBDA表达式常用 (全)
  13. 利刃 MVVMLight 9:Messenger
  14. ListView中点击Item没有任何响应
  15. [SCOI2010]幸运数字
  16. Jupyter Notebook 快速入门
  17. [转] 理解NLP中的卷积&&Pooling
  18. java接口签名(Signature)实现方案
  19. reshape、shuffle、save_weights
  20. 【Jmeter自学】Jmeter作用域(五)

热门文章

  1. Php7+Mysql8实现简单的网页聊天室功能
  2. .NetCore 入门
  3. JAVA 连接 ZooKeeper之初体验
  4. cocos2d-x_下载游戏引擎并创建第一个项目
  5. 牛!Python 也能实现图像姿态识别溺水行为了!
  6. spring boot中使用mybatis的注意点!!!
  7. C#LeetCode刷题之#342-4的幂(Power of Four)
  8. 从一次外卖到对oauth2.0的思考
  9. golang bool值
  10. 程序流程结构——if语句