利用 SPI XiP 闪存扩展微控制器程序存储器的原因和方法
投稿人:DigiKey 北美编辑
2019-05-08
随着微控制器应用日益复杂化,开发人员需要使用更多闪存程序存储器来存储应用固件。尤其对于开始执行相对复杂的边缘计算的物联网 (IoT) 端点,就更是如此。然而,有时候应用可能扩展到需要外部程序存储器的程度,此时开发人员则需要在并行或串行闪存之间进行选择。
添加外部并行闪存芯片会占用 I/O 线,增加复杂性,并占用额外的电路板空间。本文将介绍如何通过添加 Adesto Technologies 支持 SPI 芯片内执行 (XiP) 接口的外部串行闪存芯片,来扩展微控制器的闪存程序存储器。本文还将阐述 XiP 闪存如何映射到 Microchip Technology 微控制器的存储空间中,以使代码执行对固件几乎是透明的。
扩展外部存储器的原因
在应用开发之初,开发人员应尽量选择有计划推出具有更大存储空间的引脚兼容器件的微控制器。如果在开发期间,应用固件扩展到超过目标器件闪存的程度,那么就可以轻松换用具有更大闪存的引脚兼容器件。这样既能扩展应用存储器,又无需为不同的微控制器重新设计印刷电路板。
但是,应用需要的程序存储器可能会超过兼容微控制器系列片上所能提供的存储器极限,这就需要使用片外闪存。这种现象日益普遍,其原因是多方面的,包括:
- 在开发阶段,系统范围可能扩大,以致超出初始设计。这可能是由于应用的临时变更、特征蔓延或未准确预测应用的存储器需求而造成的。解决办法是用闪存程序存储器更大的引脚兼容微控制器进行升级,或增加外部闪存程序存储器。如果开发已经接近结束,后者可能会导致项目延迟。
- 将来在现场进行固件升级所需的闪存程序存储器,可能比系统板上已有的微控制器所能提供的存储器要大。在这种情况下,解决办法很有限:要么在现场换用带更大闪存程序存储器的系统,要么取消升级。
- 系统级产品系列开发可能需要一种新产品,该产品需要的闪存程序存储器比引脚兼容微控制器系列所能提供的存储器要大。解决办法是使用新的微控制器系列重新设计系统,或添加外部闪存程序存储器。
显然,对于开发人员来说,需要预判当前和未来系统对存储器扩展的需求并为此进行规划,这一点相当重要。如果项目有可能需要外部闪存程序存储器,开发人员应为将来扩展印刷电路板预留空间。虽然闪存芯片不需要安装在电路板上,但为保险起见,最好还是预留空间。
扩展闪存程序存储器的传统办法是使用具有地址和数据线的并行闪存接口。然而,在不牺牲速度的情况下,即使最有效的使用并行闪存的方式,也只能使用 16 位地址、16 位数据和四个或更多控制信号。而这需要 36 个或更多微控制器引脚。
这不光使微控制器资源使用效率低下,还会将微控制器选择局限于带有外部总线的器件,因为这能增加微控制器的引脚数。可外部并行总线会占用相当大的印刷电路板空间,高速地址和数据总线也会增加电磁干扰 (EMI) 的可能性。
SPI XiP 代码执行
更有效的解决办法是使用支持 SPI XiP 接口的外部闪存程序存储器件。SPI XiP 接口只需使用六个引脚就可连接主机微控制器。与传统 SPI 接口不同,外部闪存器件上的存储器不是通过 SPI 固件驱动程序直接访问,而是在微控制器的程序存储器进行映射。
设计使用 SPI XiP 接口的串行闪存器件的典型范例是来自 Adesto Technologies 的 AT25SL321-UUE-T(图 1)。这是一款 32 兆位 (Mbit) 闪存,支持单通道、双通道和四通道 SPI 模式。它支持 104 兆赫 (MHz) 的 SPI 时钟,在双通道 SPI 模式下提供 266 MHz 的等效时钟速率,而在四通道 SPI 模式下提供 532 MHz 的等效时钟速率。
图 1:Adesto 的 AT25SL321 是一款 32 Mbit 闪存,支持单通道、双通道和四通道 SPI 模式。它提供 32 Mbit 闪存,采用 8 引脚 SOIC、DFN8 或 TSSOP8 封装。(图片来源:Adesto Technologies)
除 32 Mbit 闪存外,该器件还具有状态寄存器用来配置器件。通过读取状态寄存器,固件可得知器件是否正在进行写入或擦除操作。写入状态寄存器可以对闪存块进行写保护。
Adesto 的 AT25SL321 还有 4 千位 (Kbit) 一次性可编程 (OTP) 存储器,可用于存储唯一序列号等安全信息。它采用 8 引脚 SOIC、DFN8 或 TSSOP8 封装。
与所有支持 SPI XiP 的串行存储器件一样,Adesto 的 AT25SL321 使用 Adesto 器件专用指令集进行配置。指令集由 38 个命令组成,主机微控制器通过这些命令控制串行闪存。主机微控制器上的 SPI XiP 外设将包含一个可编程状态机,这个状态机在微控制器上电时使用目标串行闪存的指令集进行初始化。初始化后,SPI 外设的操作对于存储器映射的 SPI XiP 区域中的固件执行代码便是透明的。
例如,如果主机微控制器固件从存储器映射区域读取数据,则利用 Adesto 指令集配置的 SPI XiP 会向 Adesto 串行存储器发送“读取数据”指令代码,后跟一个 24 位字节地址。随后,Adesto 串行存储器一次一个字节地将存储器内容发送到主机微控制器。对于固件,这显示为从存储器正常读取。
除了 SPI 时钟、数据和片选引脚外,Adesto 的 AT25SL321 还有两个额外引脚,用于增强在系统功能。WP\ 是低电平有效写保护引脚,用于防止写入状态寄存器,从而对代码块予以写保护。微控制器可以使用此引脚防止低优先级任务进行非授权更改。HOLD\ 用于暂停正在进行的数据传输。如果微控制器正在向存储器传输数据时,接收到高优先级中断信号,需要暂停直至中断处理完成,那么此功能就非常有用。
Adesto 的 AT25SL321 32 Mbit 闪存器件支持四种工作模式:
- 标准 SPI 操作:闪存的访问方式类似于标准 SPI 存储器件,即 SPI 时钟 (SCLK)、低电平有效片选 (CS\)、串行输入 (SI) 数据和串行输出 (SO) 数据。支持标准 SPI 总线模式 0 和 3。
- 双通道 SPI 操作:数据速率是标准 SPI 操作的两倍,以 SI 和 SO 作为双向数据引脚,分别记作 IO0 和 IO1。
- 四通道 SPI 操作:数据速率是标准 SPI 操作的四倍。除 IO0 和 IO1 外,WP\ 和 HOLD\ 也用作双向数据引脚,分别记作 IO2 和 IO3。在四通道 SPI 操作中,WP\ 和 HOLD\ 功能不可用。
- QPI 操作:仅用于 SPI XiP 操作。标准、双通道和四通道 SPI 模式都支持仅使用 IO0 引脚向 SPI 存储器发送命令,而 QPI 操作支持使用四个 IO[0:3] 引脚发送命令,从而显著提高了 SPI XiP 性能。
如果 Adesto AT25SL321 的 32 Mbit 还不够,Adesto 还提供 64 Mbit 的 AT25QL641-UUE-T。这两款器件的引脚兼容,因此 AT25QL641 可以直接替代前者。除了存储器更大之外,这两款器件的唯一区别是 AT25QL641 上电后的默认设置为 QPI 操作模式。这可以缩短高性能系统中该器件的设置时间。在存储器读取周期中,两款器件的功耗均只有 5 毫安 (mA)。这两款 Adesto 存储器件均采用 1.7 至 2.0 伏单电源轨供电,可与任何具有 SPI XiP 接口的电压兼容微控制器连接。
对于主机微控制器,Microchip Technology 的 ATSAMD51 系列具有 SPI XiP 接口,其中包括基于 120 MHz Arm® Cortex®-M4F 的 ATSAMD51J20A-UUT 微控制器。该器件具有 1 MB 的闪存和 256 KB 的 RAM。它提供全套外设,包括模数转换器 (ADC)、数模转换器 (DAC)、USB 端口和 I2S。它还具有用于安全功能的公钥加密外设和真随机数发生器 (TRNG)。
图 2:Microchip 的 ATSAMD51J20A 具有全套外设,包括 SPI XiP 串行接口、ADC、DAC,并支持数据加密。(图片来源:Microchip technology)
为连接外部闪存,开发人员可以使用 ATSAMD51J20A 支持 SPI XiP 的 QSPI 外设。这样,代码可以直接从 Adesto 闪存执行。ATSAMD51J20A 将 Adesto 闪存映射到 Arm 的高级高性能总线 (AHB) 程序存储空间。为了保护串行闪存中的数据,ATSAMD51J20A SIP XiP 支持对写入外部 SPI 存储器的数据进行透明加扰,以及对从外部 SPI 存储器读取的数据进行解扰。这有助于防止未经授权复制固件和盗用系统。
图 3:Microchip 的 ATSAMD51J20A 32 位微控制器具有支持 SPI XiP 串口的 QSPI 外设。它只需六个引脚即可轻松连接 Adesto 的 AT25SL321 串行闪存。(图片来源:DigiKey)
将 Microchip ATSAMD51J20A 与 Adesto 串行闪存器件一起使用
Microchip ATSAMD51J20A SPI XiP 外设具有三个寄存器,用于向外部串行 XiP 闪存发送命令。不同供应商的串行闪存 XiP 存储器器件使用不同的指令代码,因此针对所用的特定供应商存储器,开发人员须按如下方式配置这些寄存器:
- 指令代码寄存器包含用于访问串行闪存的指令。对于以四通道 SPI 模式工作的 Adesto 闪存器件,如果固件从存储器映射的 XiP 区域执行代码,则该寄存器包含“快速读取四通道输出”指令 0x6B。如果正在执行写入、擦除或状态寄存器操作,则必须将该寄存器更改为相应的指令代码。
- 指令地址寄存器包含外部串行闪存中可访问的闪存地址。当 Microchip 的 ATSAMD51J20A SPI XiP 配置为串行存储器模式时,SPI XiP 外设会自动将该地址设置为存储器映射的 AHB 存储空间范围 0x0400 0000 至 0x0500 0000 中由固件执行的地址。
- 指令帧寄存器将 SPI XiP 配置为所用外部存储器件的特定指令帧格式。这包括选择 24 或 32 位的地址长度,启用双倍数据速率 (DDR),是否支持连续读取模式,以及操作码长度。
至于 Microchip SPI XiP 接口的其余部分,使用 Microchip SPI 驱动程序即可轻松配置。
只要微控制器上的应用固件在从 SPI XiP 存储器映射区域执行代码,就不需要重新配置微控制器上的 SPI XiP 外设。Adesto 闪存还支持仅使用单个 SI 引脚的读取模式,相关指令代码为 0x03。如果仅使用双通道 SPI 模式,则指令代码为 0x3B。这些代码由应用固件写入指令代码寄存器。
当指令代码寄存器改变后,刷新与存储器映射地址空间相关的所有缓存不失为一种好习惯。读取或写入串行闪存状态寄存器时,应先刷新缓存,然后禁用缓存。写入闪存的存储器映射区域时,也应这样做。恢复存储器读取操作后,应重新启用缓存。
由于涉及高速数据传输,串行闪存应放置在印刷电路板上尽可能靠近微控制器 SPI XiP 端口的地方。如果不可能,那么印制线长度不应超过 120 毫米 (mm)。时钟信号应至少是印刷电路板印制线宽度的三倍,并且远离其他信号以避免干扰。IO[0:3] 双向数据信号间距应保持在 10 mm 以内,以避免偏移。
总结
外部串行闪存器件可以实现快速固件代码执行,而不会像并行闪存芯片那样,增加复杂性和占用过多的电路板空间。通过它可以轻松应对程序代码因随时间推移而发生的扩展,并支持现场更新且无需重新设计系统板。
免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。