0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Flash不支持SFDP,如何下载适用i.MXRT

电子设计 来源:电子设计 作者:电子设计 2020-10-30 10:30 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是导致串行 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 家族里 W25QxxJV 和 W25QxxJW 系列都是新型号,全部支持 SFDP;而 W25QxxFV 和 W25QxxFW 系列属于老型号,大多没有 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 支持:

J-Link 下载算法源工程,可以参考 /boards/msft_rt600_xproject/flash_algo_b0_silicon/Keil_JLink 这个源工程

MCUBootUtility v2.3 更新,参看文章 《MCUBootUtility v2.3 发布,这次不再放过任何一款 Flash》 第 2.3 节

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

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FlaSh
    +关注

    关注

    10

    文章

    1759

    浏览量

    155908
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    i.MXRT1173跨界处理器能支持2GB NOR闪存吗?

    does nxp i.MXRT1173 crossover processor can support 2GB NOR flash.If yes what need to be taken
    发表于 04-23 08:25

    MIMX9302xxxxD不支持多核中间件吗?

    ) 对于多核中间件,它说: 此可选组件不支持 MIMX9302xxxxD。但是,它确实支持以下评估设备:MCIMX93-EVK,因此可供选择。选中后,相应的支持将添加到配置的包中。 If I
    发表于 04-09 06:07

    VisionFive 不支持.mp4视频吗?

    我尝试通过 gst-play-1.0 和 gst-launch-1.0 播放.mp4视频,但它们做得不好。VisionFive 不支持.mp4视频吗? 播放视频有正确的说明吗?我现在不知道该怎么办
    发表于 03-31 06:40

    RISC-V不支持 Nx吗?

    目前看起来nxRISC-V 不支持。因此,我无法在我的 VisionFive2 上构建 grafana。 如果有人想对我的功能请求投赞成票,这里是链接: GitHub Please support
    发表于 02-04 06:27

    恩智浦i.MXRT1180的FlexSPI NOR启动连接方式

    最近属于i.MXRT11xx阵营的第二代旗舰i.MXRT1180正式发布了,今天咱们就来介绍它的FlexSPI NOR启动连接方式,在阅读本文前最好把FlexSPI NOR启动连接方式(RT1060)先看完,对i.MXRT1xx
    的头像 发表于 11-08 10:20 6557次阅读
    恩智浦<b class='flag-5'>i.MXRT</b>1180的FlexSPI NOR启动连接方式

    nuclei studio生成的c语言文件是不支持c的语法吗?

    nuclei studio 生成的c语言文件感觉不支持c的语法,因为刚使用这个软件,还请各位大佬帮忙看看
    发表于 10-20 11:02

    FlashDB 的TSDB不支持写粒度为128,是出于什么考虑有这样的限制?

    FlashDB 的TSDB不支持写粒度为128,是出于什么考虑有这样的限制? 如果我希望把这个数据库移植到这样的一个mcu上,我们应该怎么做,有些建议吗。 感谢各位大佬指点。
    发表于 09-23 08:19

    at_device(8266)不支持web服务器吗?

    我现在想用esp8266 at device 做一个网页服务器 但是文件系统什么都做好了 运行webnet_test 显示下边的错误 查了论坛 说at不支持服务器 但是是20年的帖子了 现在有支持吗 如果不支持是不是换rw00
    发表于 09-23 06:09

    为什么同PIN脚的POE(以太网供电)AT标准的网络变压器不支持四线对供电?

    Hqst盈盛(华强盛)电子导读:今天就POE(以太网供电)AT标准(即IEEE 802.3at,又称PoE+)的网络变压器设计上仅支持两线对供电,不支持四线对供电给我的粉丝朋友们做下详细分析,不当之处,敬请斧正,谢谢!
    的头像 发表于 08-09 15:41 2342次阅读
    为什么同PIN脚的POE(以太网供电)AT标准的网络变压器<b class='flag-5'>不支持</b>四线对供电?

    PSOC4模块不支持同时多连接吗?

    所有 PSOC4模块都不支持同时多连接吗?
    发表于 06-27 08:23

    请问STM32U5不支持ST-LINK v2怎么办?

    STM32U5不支持ST-LINK v2怎么办?
    发表于 06-09 07:59

    MC SDK为什么不支持H743?

    MC SDK FOC为什么不支持H743,看样子只支持H745H755。如何利用MCSDK生成可以在H743中运行的FOC控制代码。
    发表于 06-06 07:44

    多个i.MXRT共享一颗Flash启动的方法与实践(下)

    在 《多个i.MXRT共享一颗Flash启动的方法与实践(上)》 一文里痞子衡给大家从理论上介绍一种多 i.MXRT 共享 Flash 启动的方法,但是理论虽好,如果没有经过实践验证切
    的头像 发表于 06-05 10:04 1293次阅读
    多个<b class='flag-5'>i.MXRT</b>共享一颗<b class='flag-5'>Flash</b>启动的方法与实践(下)

    多个i.MXRT共享一颗Flash启动的方法与实践(上)

    有些客户应用会采用多颗 i.MXRT 芯片设计一主多从的硬件架构(目的不一,或仿多核 MCU 系统、或拓展 GPIO 数量),因为 i.MXRT 片内无非易失性存储器,这时候为整个系统配置合适的启动设备保证每个 i.MXRT
    的头像 发表于 06-05 10:01 1260次阅读
    多个<b class='flag-5'>i.MXRT</b>共享一颗<b class='flag-5'>Flash</b>启动的方法与实践(上)

    MC SDK为什么不支持H743,看样子只支持H745H755?

    MC SDK FOC为什么不支持H743,看样子只支持H745H755。如何利用MCSDK生成可以在H743中运行的FOC控制代码。
    发表于 04-27 08:14