ST意法半导体
直播中

哈哈哈

10年用户 794经验值
擅长:可编程逻辑
私信 关注
[问答]

STM32G0B1RE MCU系统内存中的I2C引导加载程序失败是何原因

在处理嵌入 STM32G0B0CE (v13.0) 和 STM32G0B1RE (v9.2) MCU 系统内存中的 I2C 引导加载程序时,我们注意到一个奇怪的行为。
引导加载程序的 Write Memory (0x31) 和 No-Stretch Write Memory (0x32) 命令似乎不适用于至少 8 字节对齐的地址。在 4 字节对齐地址上发出的命令由引导加载程序确认(在最后一次 I2C 读取命令时收到 ACK 字节 (0x79)),但数据永远不会写入
记忆。操作的大小似乎并没有改变这种行为。例如,引导加载程序在 0x08000004 上确认写入内存命令,但从未真正将其写入闪存,即使它之前已被擦除。该地址上的读取内存命令 (0x11) 返回 0xFF 字节,这表明闪存尚未被编程。
另一方面,如果我们尝试使用 16 字节的有效负载对 0x08000000 执行写操作,则一切正常(因此,地址 0x08000004 也被写入)。
在非 4 字节或 8 字节对齐的地址(例如 0x08000002)上写入内存命令不起作用:命令的最后一次 I2C 读取失败,因为引导加载程序 NAK I2C 读取。我们无法获得此类命令的 ACK (0x79)、NAK (0x1F) 或 Busy (0x76) 字节。
在 Linux 上,stm32flash 可以使用以下命令行重现此问题:
  • $ stm32flash /dev/i2c-X -w /path/to/fw.bin -v -F 254:254
使用此命令,固件一次写入 0xFC 字节,这意味着一半的写入操作静默失败,因为其中一半不在 8 字节对齐的地址上。
传递给写入内存命令的地址是否有任何限制,或者这是引导加载程序中的错误?

回帖(1)

李乔

2022-12-20 14:22:00
根据结构,G0 Flash 只能用双字编程,如 RM 中所述:
“闪存一次编程 72 位(64 位数据加上 8 位 ECC)。”
更准确地说,它指的是 64 位对齐确实 <= 8 字节对齐。
I2C 引导加载程序协议不会为较小的缓冲区支持或最有可能未对齐的 _ 字节数据实现仿真。实际上,您无论如何都必须在地址 xxxxx0 到 xxxxxx4 处写一些东西,以便也将 xxxxx4 写到 xxxxxx8。编程 0xFFFF 也不会再被擦除状态,由于 ECC 代码,擦除数据和编程“..FFF..”不同
我将与 BL 开发团队合并,但我想这可能会解释您的问题。
内存线大小与产品无关,可能因系列而异,而 I2C BL 协议则不同。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分