浅谈PSOC 6 SMIF的使用——在线烧录片外Flash

1、基本原理与机制

PSOC 6 SMIF访问片外Flash的操作模式,如《浅谈PSOC 6 SMIF的使用(一)——基本功能》一文中介绍,主要是MMIO模式和XIP模式。但考虑通过PSoC6 SWD的方式来在线烧录连接在SMIF上的片外flash的内容,意味着对于PSOC 6来说片外Flash是可以寻址的,所以这里需要配合XIP模式,把片外的flash空间映射到PSOC 6能访问的地址段,如之前提到的0x1800 0000开始的地址区域。

要完成整个烧录的工作,需要从片外flash的配置(参考文中QSPI Configurator的介绍)、片内工程保存QSPI Data Structure、工程的linker script、烧录工具配合来完成。参考以下完整的Ecosystem Tool设计

1.png

接下来会自上而下的介绍这里的基本原理和操作:

(1)首先,针对不同的memory产品,可以通过QSPI Configurator配置或者自定义对应的读写命令组合,生成对应的命令集合的结构体参数:

1743069750742577.png

自动生成的源码文件:

cycfg_qspi_memslot.c, cycfg_qspi_memslot.h

源码中有对应的结构体映射了实际执行的命令配置的集合,如以下例子中deviceCfg_S25FL512S_SlaveSlot_0就包含了读写对应QSPI Data Structure。

1743069777166738.png

>>>详细说明可点击此处,参考外设驱动库里的对应源码。

1743069807216727.png

(2)有了生成的memslot信息后,就要绑定PSOC 6系统的读写接口到对应的QSPI flash的配置结构体,让flash loader知道如果要读写某个地址片段的信息时,使用哪个访问外部命令来进行操作。这一部分需要由一个保存在SFlash (0x1600 0000) 区域里进行声明,这部分片区在PSoC6里定义为Table of Contents part 2 (TOC2)。

例子如下,声明由QSPI Configurator配置工具自动生成的memslot源码中的smifBlockConfig的结构体地址指针到指定的区间。

5.png

然后在TOC2 固定区域里(offset = 0x000C)把对应的指针保存进去。编译后生成的代码就会自动生成新的TOC2的固定配置,在烧录片内flash区域后,System Call就获取了当前的配置结构体的指针索引。

1743069829185222.png

经过以上配置后,就可以实现通过烧录接口访问片外的结构体。但这部分目前英飞凌已经提供了现成的中间件serial-flash,用户只要引用中间件,就可以直接使用上面的配置,无需额外的重写以上存储结构体。

>>>点击此处,查看详细参考。

1743069962663000.png

实现了XIP区域编译和烧录的例程,推荐参考CY8CPROTO-062S3-4343W这个BSP上使用WiFi的例程。上面使用了CY8C6245LQI-S3D72, 具有512KB Flash和256KB SRAM。在需要驱动WIFI模块时,由于WIFI模块的固件由400KB左右的区间,所以需要保存在片外NorFlash上。

>>>点击此处,查看详细参考

8.png


main.c :

9.png

bsp.mk里也需要对应声明

10.png

这样wifi的固件就会编译时指定到xip的地址段。

11.png

在bsp文件夹中提供的PSoC 6的默认link script (e.g. GCC的.ld文件) 已经包含了对.cy_xip段的定义描述:

2、烧录片外flash的注意事项:

根据上述章节的描述,我们可以理解以下的读写的流程:

1)片外SPI Flash的配置结构体保存到片内flash,并产生了确定的&smifBlockConfig指针。

2)SFlash 相关区域(TOC2)存储了能索引配置结构体信息的指针地址(e.g. &smifIpBlocksArr).

3)这个索引信息已经生效。

4)需要烧录到片外flash的内容编译后能落在0x18000000开始的 xip 的地址段(Link Script 已经默认做了相关定义)

5)烧录器根据需要烧录的Hex File,当需要烧录0x18000000 ~ 0x1FFFFFFF这些地址段的区域时,通过DAP接口索引到对应片外flash的读,写,擦除等命令,对片外flash进行访问和控制。

所以,针对这个流程,当想要通过PSoC6烧录口对片外flash进行直接烧录的话,需要确定以下问题(Trouble Shooting):

1. 对应的片外flash的配置结构体的参数是否正确:

  • 命令是否匹配正确的IO数,SPI/Dual-SPI/Quad-SPI 对应的读写命令一般时不一致的。需要确认当前配置的IO数与命令一致。

  • Memory擦除的命令是否匹配,如4KB sector擦除,还是64KB sector擦除,对应的命令和效果会影响烧录的结果。

  • Write Enable的寄存器位是否正确,Qaud Mode的使能位或者命令是否匹配。

  • 擦除,Program等时间参数是否一致,这里建议使用对应memory datasheet的最大时间来保证擦和写的可靠性。

2. 置结构体已经烧录到片内,TOC2的结构体有正确的索引指针。基于烧录的原理,TOC2里必须包含能索引到命令集合,并且已经生效,否则系统无法确定片外flash的映射地址的操作方式。

3.片外flash的接口状况,有一些用户设计会考虑给片外flash做供电管理控制,比如用MCU的IO口控制flash的供电,以节省功耗。这时,如果需要考虑片外flash的在线烧录,需要明确在烧录进行时片外flash的供电情况时明确上电的。由于这时候MCU并没有进入正常的工作逻辑,所以管理片外flash的IO不一定处在给flash打开电源开关的状体,这时候需要考虑额外的设计来保证片外flash的供电,比如:

  • 定制烧录制具可以烧录时明确给片外flash供电。

  • 设计默认上电,控制IO时可以关闭电源的电路。

  • 如果外部电路无法使用默认上电,可以考虑定制flash loader来增加IO管理的功能给片外flash先上电。

3、总结

本篇主要简述了烧录器(Programmer)通过PSOC 6 SMIF接口对片外SPI Flash进行直接烧录的基本原理和实现方式,以及需要考虑的注意事项。

来源:英飞凌官微

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。