潜在的非标准 SPI 通信

逆向工程 硬件 尖峰
2021-07-05 02:04:56

我正在查看板上的 SPI EEPROM 芯片,不幸的是,它隐藏在环氧树脂块下。但是,由于丝网印刷,我能够确定引脚排列。

使用 Bus Pirate 转储 EEPROM,我认为 EEPROM 是 16K,因为转储的数据似乎每 0x4000 字节重复一次。

我将逻辑分析仪连接到引脚并在设备启动时监控与 EEPROM 的通信。嗅探到的通信看起来非常像 SPI(应该如此),但是与我尚未弄清楚的规范略有不同。

我已经截取了三个似乎是 READ 操作的示例:

截图 1 截图 2 截图 3

第一个字节是 0x03 (READ),接着是三个字节,以及一个两字节的 MISO 响应。根据 SPI 协议,一个 READ 操作码应该紧跟一个两字节的地址。然后,从该地址返回数据。

但是,跟在 READ 操作码后面的是三个字节,而不是两个。查看每个示例,第一个字节似乎总是 0x00。接下来的两个字节可能是地址。

我的问题归结为:

  • 这是 SPI 芯片的正常行为吗?
  • 这种看似不规范的交流应该如何解读?
  • 是否有更有效的方法将捕获的流量解码为人类可读的 SPI 命令?
1个回答

没有 SPI 规范规定诸如读取代码或地址长度之类的事情,AFAIK;这些是特定于芯片的,并且通常由 SPI EEPROM 和闪存芯片的供应商标准化(尽管我不知道供应商之间有任何正式协议)。

大多数 SPI EEPROM 使用两个字节来指定读取地址,因为它们非常小,以至于它们只需要两个字节来寻址芯片上的所有存储器。大多数 SPI 闪存芯片更大并使用三个字节(它们也使用与 SPI EEPROM 相同的读取和写入代码)。

所以你所看到的似乎是有效的;如果我不得不猜测,我会说环氧树脂下面的芯片是SPI闪存芯片而不是EEPROM,但是从芯片读取数据的角度来看,除了地址长度之外几乎没有区别。

这并不能解释为什么您的数据似乎每 0x4000 个字节重复一次。您可以尝试的一件事是大多数 SPI 闪存芯片(尽管据我所知不是 EEPROM)实现的 RDID 命令 (0x9F)。这应该返回一个 3 字节的值,用于标识制造商 ID、设备 ID 和内存密度(也就是芯片的大小)。是典型 SPI 闪存芯片的数据表,它提供了有关典型 RDID 实现的更多详细信息。

如果这是一个 SPI 闪存芯片,我希望 RDID 命令可以工作,并且您肯定知道芯片的大小是多少;如果它不起作用,那么我会冒险猜测这是一个 EEPROM 芯片,其供应商决定(无论出于何种原因)使用 3 字节地址而不是 2 字节地址。