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

    文章

    1644

    浏览量

    148863
收藏 人收藏

    评论

    相关推荐

    没有hyper-v,Hyper-V无支持:解决系统不支持Hyper-V问题

        在当今数字化转型的浪潮中,企业对于管理效率和精度的要求日益提高。批量管理工具作为一种创新的管理手段,正逐渐成为企业提升竞争力的重要法宝。今天就为大家介绍Hyper-V无支持:解决系统不支持
    的头像 发表于 02-10 10:38 88次阅读
    没有hyper-v,Hyper-V无<b class='flag-5'>支持</b>:解决系统<b class='flag-5'>不支持</b>Hyper-V问题

    PCM1680 does not support a board-to-board interface不支持板对板的是怎么解读?

    The PCM1680 does not support a board-to-board interface不支持板对板的是怎么解读
    发表于 12-11 07:31

    请问ADS1299EEGFE-PDK支不支持QSPI?

    不支持QSPI,如果支持,芯片上的线接哪几个引脚。
    发表于 11-21 07:36

    INA149不支持单电源供电吗?

    从INA149的数据手册看,是可以单电源供电的,但是我用INA149的TINA模型仿真了下,发现单15V供电的时候,输出恒为1V,输入共模电压20V,输入差模电压125mV,但是我改成+-15V供电就能输出! 我想知道这是因为模型的原因还是INA149就不支持单电源供电!!!!!!
    发表于 09-14 07:07

    iPhone16不支持微信?苹果最新回应

    来源:青春上海 编辑:感知芯视界 Link 有网传消息称“iPhone16可能不支持微信”,对此记者致电苹果官方热线,接线的苹果中国区技术顾问表示,第三方言论关于iOS系统或者苹果设备能否再使用微信
    的头像 发表于 09-05 09:00 651次阅读

    OPA569是不支持这么高频率吗?

    OPA569并联使用用作电流驱动,输入频率20K的正选电压信号,要求输出20K的正选电流信号。用示波器测试负载电阻两端的电压波形振荡比较厉害,当降低频率是可以改善很多。是不支持这么高频率吗?
    发表于 08-07 06:50

    STM32G4系列到底支不支持位带操作

    印象中不止一次有人询问STM32G4系列到底支不支持位带操作。
    的头像 发表于 07-29 09:45 1673次阅读
    STM32G4系列到底支<b class='flag-5'>不支持</b>位带操作

    在STM32L4R5ZIT6中移植cherryUSB,显示不支持DMA模式为什么?

    在STM32L4R5ZIT6中移植cherryUSB,出现如下报错,显示不支持DMA模式: This dwc2 version does not support dma mode, so
    发表于 07-25 08:32

    为什么在ESP-IDF 4.3(VSCODE)下配置USB端口时说不支持

    文档里面说ESP32-C3可以使用USB来下载固件,并用USB当console口。 但在ESP-IDF 4.3(VSCODE)下配置USB端口时,说不支持。 我是查了文档说支持才设计硬件用USB口
    发表于 06-20 06:19

    请问esp32-c3不支持pcnt吗?

    我在esp32-c3开发板上测试pcnt,编译报错找不到相关的函数,查看sdk源码发现要配置CONFIG_SOC_PCNT_SUPPORTED才会编译pcnt.c,查看examples里面的项目也说了只支持ESP32 和ESP32-S2,请问是不支持ESP32-C3吗?为
    发表于 06-18 07:27

    STVD是不是不支持C99?

    内容如标题所示,麻烦有懂的朋友告诉下我,这个问题花费我很多时间了。 不知道STVD是不是不支持C99??
    发表于 05-16 08:04

    Mbed支不支持NUCLEO-H743ZI吗?

    我只在Mbed网页版上看到了支持NUCLEO-H743ZI2,没看到NUCLEO-H743ZI,不知道Mbed支不支持。 之后又下了一个安装版的Mbed Studio里面如果选择Mbed5的话能通过
    发表于 04-10 07:08

    flash loader v2.8.0不支持STM32L431CBT6吗?

    请问是否flash loader v2.8.0不支持STM32L431CBT6这个颗芯片?我用的是PA9/PA10做烧写串口。
    发表于 04-08 07:16

    ST-LINK/V2无法下载HEX文件到stm32g070cb中,是不支持吗?

    用 ST-LINK/V2无法下载HEX文件到stm32g070cb中,是不支持吗? 连接上了,不过没有识别,下载会报错。 下载前可以连接上,不过没有识别,如下图:
    发表于 03-29 06:20

    STM32G070KB不支持无源HSE吗?

    看了下手册,只有OSC_IN,没有OSC_OUT,是不是不支持外部高速无源晶振? 数据手册也和参考手册没有指出G070K不支持无源HSE,有谁知道吗
    发表于 03-13 08:08