V1.0 / FAQ / 中文

泰芯芯片FLASH各种常见问题FAQ

泰芯芯片FLASH各种常见问题FAQ

logo

责任与版权修订记录

责任限制

本文档内容仅供参考。珠海泰芯半导体有限公司(以下简称“泰芯”)未对本文档信息的准确性或完整性作出任何明示或暗示的陈述或保证,且不对使用本文件信息所产生的后果承担任何责任。

泰芯保留在不另行通知对本文件进行修改、改进或其他变更的权利。

泰芯没有为客户产品的应用、设计验证提供协助的义务。客户应自行对其应用的设计、验证和测试负责,并确保其应用符合所有法律、法规及安全相关的要求。

如因客户未遵守本协议导致任何损害、费用、损失及/或责任,泰芯不承担任何责任;同时,客户应全额赔偿因客户未遵守本协议而给泰芯造成的任何损害、费用、损失及/或责任。

版权声明

未经泰芯书面同意,任何一方不得为商业目的修改、改编、变更、翻译或基于本文件创建衍生作品。

未经泰芯书面同意,任何一方不得向第三方披露或分发本文件中提及的任何部分或全部源代码、SDK、二进制文件和目标代码。

任何一方不得修改、反向工程、反汇编、反编译或以其他方式试图发掘任何非源代码部分的SDK,包括但不限于预编译的二进制文件和目标代码。

此外,任何可能侵犯泰芯或其他知识产权所有者权利的行为也均被严格禁止。

对于实施上述侵权行为的主体,泰芯有权依据中华人民共和国法律或其他可能适用的法律、国际条约采取必要的法律措施,包括但不限于对侵权人提起诉讼或仲裁,或申请法律强制措施。

珠海泰芯半导体有限公司

2024年09月24日

日期

版本

描 述

修订人

2026-03-30

V1.0

初始版本,SDK-VERSION: 41569

TX

1. Flash启动问题

支持可外挂Flash Boot启动的芯片,常常会出现一样的固件,换外置Flash后无法正常Boot启动。此类问题通常是由于Flash四线使能引起的。下文中1.1节的方法是更推荐的,1.2节介绍了常见的四线使能配置。

  • 前置内容:

一般而言,泰芯芯片通过Flash Boot启动,固件在编译完成后会自动被添加一段固件头信息。芯片启动时会根据固件头信息初始化Flash(以发送指令码的方式),这些指令码可以在makecode.ini中进行配置。

1.1. 生产阶段方法

通过修改makecode.ini可以完成flash4线使能,但如果需要一份固件兼容不同型号flash的话,单纯修改makecode.ini的方式就不适用了,我们推荐使用通用烧录器,在flash贴片前先烧录对应固件,并且设置开启QE BIT。

对应固件需要在makecode.ini中关闭SpecSquenceEn。

WireMode4En=1 ; 4wire mode enable[0,1]

SpecSquenceEn=0 ;

SpecSquenceNumbers=0

; spec cmd squence (format: cmd + dummy + data_lens + data) numbers

1.2. 调试阶段方法

  • Makecode.ini切片1:

WireMode4En=1 ; 4wire mode enable[0,1]

SpecSquenceEn=1 ;

SpecSquenceNumbers=6

; spec cmd squence (format: cmd + dummy + data_lens + data) numbers

SpecSquence0=50000000 ; spec cmd "write enable "

SpecSquence1=0100020002 ; spec cmd "qual mode enable for winbond "

SpecSquence2=05800101 ; spec cmd "wait busy "

SpecSquence3=50000000 ; spec cmd "write enable "

SpecSquence4=31000102 ; spec cmd "qual mode enable for winbond "

SpecSquence5=05800101 ; spec cmd "wait busy "

  • Makecode.ini切片2:

WireMode4En=1 ; 4wire mode enable[0,1]

SpecSquenceEn=1 ;

SpecSquenceNumbers=6

; spec cmd squence (format: cmd + dummy + data_lens + data) numbers

SpecSquence0=06000000 ; spec cmd "write enable "

SpecSquence1=0100020002 ; spec cmd "qual mode enable for winbond "

SpecSquence2=05800101 ; spec cmd "wait busy "

SpecSquence3=06000000 ; spec cmd "write enable "

SpecSquence4=31000102 ; spec cmd "qual mode enable for winbond "

SpecSquence5=05800101 ; spec cmd "wait busy "

  • Makecode.ini切片3:

WireMode4En=1 ; 4wire mode enable[0,1]

SpecSquenceEn=1 ;

SpecSquenceNumbers=3

; spec cmd squence (format: cmd + dummy + data_lens + data) numbers

SpecSquence0=06000000 ; spec cmd "write enable "

SpecSquence1=01000140 ; spec cmd "qual mode enable for winbond "

SpecSquence3=05800101 ; spec cmd "wait busy "

以上是三种典型的flash 4线使能配置,目前暂未看到更多例外。通常逐一尝试以上三种配置即可让flash 4线启动。

2. 擦写动态挂起恢复(SDK默认启用)

由于程序运行在Flash上,而擦写时读Flash会出现读到0情况,因此在擦写Flash过程中无法运行代码,为了防止跑飞还需要关闭中断。因此在擦写时会出现几十到几百毫秒的关中断时间,一部分程序可能因此出现问题。为了解决这个问题,SDK引入了擦写动态挂起的机制,可以配置tsr时间内自动挂起擦写状态和擦写线程,挂起后系统即可处理其他紧急的事情,trs时间后擦写线程才会恢复到ready状态。

  1. 大部分Flash支持擦写suspend和resume功能,客户可以配置tsr,trs,tsus,trus满足对应flash所需要的时序要求。
  2. 对于不支持suspend和resume的flash,客户可以配置device.c/spi7.wip.tsr=60000解决。
  • Tsr:擦除开始到擦除挂起的最大时间(ms)
  • Trs:擦除挂起到擦除恢复必要的间隔时间(ms)
  • Tsus:擦除挂起指令到下一条指令,cs必要的拉高时间(us)
  • Trus:擦除恢复指令到下一条指令,cs必要的拉高时间(us)

这些参数在FLASH SPEC中AC Characteristics中会描述,可能有一部分是没有的,大部分时候都不需要修改这些参数

SDK默认值:

Tsr=8,trs=4,tsus=20,trus=20

3. DDR功能(TXW81x不需要考虑)

TXW82x芯片支持DDR Flash,SDK默认不启用DDR功能,支持DDR的Flash比较少,如果Flash支持DDR,可以在device.c中,spi7.ddr=1,启动DDR功能。DDR目前最高只支持到80Mhz的频率。

4. XIP功能(TXW81x不需要考虑)

TXW82x芯片支持Flash XIP,SDK默认开启XIP功能,大部分Flash支持XIP功能,XIP能够让每一次读取访问都可以少一个指令码,在4线模式下,开启XIP,在SDR模式能减小16.6%访问时间,在DDR模式下能减小25%的访问时间.

在41569版本后,对XIP才有了比较完善的支持。在device.c中,spi7.xip=1/0,开关XIP功能。

5. 安全区

一些Flash可能会提供额外的一片存储空间用于存储OTP数据,通常称这块区域为安全区。安全区的读写会有点区别,在Flash spec上会描述它们安全区的访问地址,通常在第一页FEATURE会描述是否支持安全区,全局搜索44H(安全区擦除指令),指令码描述那里会说明安全区的地址。

图5-1 某款flash对于44h指令的描述

可以看到总共有3个安全区区域,地址分别是0x001000,0x002000,0x003000,每一个区域由10bit寻址,大小1kB。

客户需要访问到正确的地址才能正常读写安全区。安全区相关读写样例请参阅app/flash/flash_read_demo.c/flash_security_demo();

6. 动态写保护(TXW81x不需要考虑)

这个功能的实现思路是在非必要时,让Flash处于写保护状态,必要时(需要擦写Flash),短暂的关闭Flash写保护功能。由于兼容性问题,默认不再打开这个功能。客户如有需要,可以根据以下内容配置。

6.1. 关闭动态写保护

对于旧SDK(版本号小于41569),如果你遇到了有关Flash写入失败的问题,那大概率就是写保护不兼容导致的。你可以选择关闭动态写保护,以下是关闭方法:

device.c/spi7->spi7.nbp=1; //nbp赋值为1

hal/spi_nor.c/spi_nor_attach()->flash->bp_conv=NULL; //块保护逻辑

6.2. 开启动态写保护

为了提高兼容性,需要根据不同的Flash id来选择不同的写保护策略。通常,这需要你对SPI Flash的寄存器有一定的理解,具体参阅对应Flash的数据手册中状态寄存器/写保护章节。

下图是某Flash的sr/wp area的关系图,每个Flash spec都有类似的图

图6-2-1 一种SR(状态寄存器)和memory area的关系

  • 相关控制代码:

Spi_nor.c/spi_nor_attach():

“ flash->bp_conv(struct spi_nor_flash*flash,uint32_t addrl,uint32_t addru,struct bpreg_cfg*bp) ” 负责将[addrl.addrh]转化为寄存器配置描述struct bpreg_cfg,写保护逻辑自动在关键时刻把struct bpreg_cfg寄存器配置写入到Flash中。

目前实现了 “ xip_nor_flash_unbp_convert_tbl() ”。即flash->bp_conv=xip_nor_flash_unbp_convert_tbl;xip_nor_flash_unbp_convert_tbl通过struct bp_area将[addrl,addrh]转化为struct bpreg_cfg。

struct bp_area结构体用于描述寄存器配置及其对应写保护区域的关系。

struct bp_area由宏DEF_BP_AREA_TB_BPV(tb,bpv,addrl,addrh)描述,tb和bpv都是Flash寄存器中的写保护控制域,tb通常只有1个bit,bpv可能有4个或5个bit。在图6-2-1中bp3也可以称为tb(top/button),它控制着portion项是Upper或是Lower。

每一条DEF_BP_AREA_TB_BPV()都描述了[addrl,addrh]区域对应的写保护寄存器配置。客户只需要根据不同的flash,配置不同的struct bp_area即可,其余由软件自动控制。lib/bus/spi/spi_nor/spi_nor_bus.c中
const struct bp_area bp_area_tbl_2MB{...};是个典型例子。