我将逻辑分析仪连接到引脚,并在设备启动时监视了与EEPROM的通信。嗅探到的通信看起来很像SPI(应该如此),但是与我尚未弄清的规范存在细微差异。
我已截取了三个示例的屏幕截图READ操作:
第一个字节为0x03(READ),后跟三个字节,以及对MISO的两个字节响应。根据SPI协议,READ操作码应紧随其后的是两个字节的地址。然后,从该地址返回数据。
但是,READ操作码后跟三个字节,而不是两个字节。看每个示例,第一个字节似乎总是为0x00。接下来的两个字节可能是地址。这种看似非标准的通信会被解释吗?
是否有更有效的方法将捕获的流量解码为人类可读的SPI命令?
#1 楼
没有SPI规范规定诸如读取代码或地址长度AFAIK之类的内容。这些是特定于芯片的,并且通常已由SPI EEPROM和闪存芯片的供应商标准化(尽管我不知道供应商之间的任何正式协议)。大多数SPI EEPROM使用两个字节来指定读地址,因为它们很小,只需要两个字节即可寻址芯片上的所有存储器;大多数SPI闪存芯片都较大,并使用三个字节(它们也使用与SPI EEPROM相同的读取和写入代码)。
所以,您看到的内容似乎是正确的;如果我不得不猜测,我会说环氧树脂下面的芯片是SPI闪存芯片,而不是EEPROM,但是从读取的角度来看芯片中的数据除了地址长度外没有什么区别。
这不能解释为什么数据似乎每0x4000字节重复一次。您可以尝试的一件事是RDID命令大多数SPI闪存芯片(虽然据我所知不是EEPROM)实现了0x9F),这应该返回一个3字节的值标识制造商ID,设备ID和内存密度(也就是芯片大小)。这是典型的SPI闪存芯片的数据表,其中提供了有关典型RDID实现的更多详细信息。确定芯片的大小是多少;如果它不起作用,那么我会冒险猜测这是一个EEPROM芯片,其供应商出于某种原因决定使用3字节地址而不是2。
评论
啊,我没有意识到SPI如此标准化。它以0xc2 0x05 0x16响应RDID,因此它肯定是闪存。现在查找数据表...
–mncoppola
2014年3月13日在21:12
FWIW SPI闪存标准化在某种程度上是由英特尔强制执行的,英特尔需要一套特定的闪存命令集,以便在其主板上使用。
–伊戈尔·斯科钦斯基♦
14 Mar 14 '14 at 0:39
第一个字节0xC2表示它是由Macronix(非常受欢迎的闪存芯片供应商)制造的。 IIRC的最后一个字节0x16表示它是一个4MB芯片(1 << 0x16)。
–devttys0
2014年3月14日在1:07
是的,你是对的。我搜索了ID值并找到了芯片的数据表,它是Macronix MX23L3254(macronix.com/Lists/DataSheet/Attachments/1233/…)。它是一个4MB的芯片,用于解释3字节寻址。谢谢您的帮助!
–mncoppola
2014年3月14日在1:12