1. 从一次失败的固件烧写说起:当你的ZynqMP板子“不认识”Flash时
那天下午,我正忙着给一块Zynq UltraScale+ MPSoC的开发板固化程序。这本来应该是个常规操作,就像给手机更新系统一样简单。我按照流程,在U-Boot命令行里敲下了那句熟悉的 sf probe 0 0 0,满心期待地等着“SF: Detected xxx with total size xxx MiB”的成功信息。结果,终端冷冰冰地给我甩回来几行红字:
unrecognized JEDEC id bytes: 00, 00, 00
Failed to initialize SPI flash at 0:0 (error -2)
ERROR: [Xicom 50-186] Error while detecting SPI flash device - unrecognized JEDEC id bytes: 00, 00, 00
相信很多玩ZynqMP的朋友都见过这个“老朋友”——[Xicom 50-186]错误。那一瞬间的感觉,就像你拿着自家门的钥匙,却怎么也插不进锁孔,系统告诉你“无法识别的钥匙”。程序烧不进去,板子就成了“砖”,后续所有开发都卡住了。这个错误的核心,就是SPI Flash的初始化失败了,而失败的根源,是U-Boot(或者FSBL)无法读取到Flash芯片正确的“身份证号”——JEDEC ID。
简单来说,SPI Flash芯片上电后,主控制器(这里是ZynqMP的PS端)需要通过SPI总线向它发送一个读取JEDEC ID的命令。Flash芯片会回应三个字节的数据,比如 0xEF, 0x40, 0x18(对应Winbond的W25Q32JV)。这三个字节分别代表了制造商ID、存储器类型和容量。控制器靠这个ID来识别Flash的具体型号,从而加载正确的驱动(比如操作时序、扇区大小、擦写命令等)。如果读回来的ID是全0(00, 00, 00)或者其他非法值,控制器就“懵”了,它不知道对面坐的是谁,自然也就无法进行后续的任何对话(读、写、擦除)。所以,解决这个问题的关键,就是搞清楚为什么控制器读不到正确的ID。
2. 抽丝剥茧:为什么JEDEC ID会读取失败?
看到00,00,00这个结果,我们的第一反应往往是:“Flash芯片是不是坏了?” 这确实是一种可能,但在全新的或者之前能正常工作的板子上,硬件损坏的概率相对较低。更多的时候,问题出在“沟通”的环节上。ZynqMP的PS端(处理系统)和SPI Flash之间的SPI通信链路,任何一个环节出问题,都可能导致读取ID失败。根据我这些年踩坑的经验,原因主要可以归结为以下几类。
2.1 硬件连接与电源问题
这是最基础但也最容易被忽略的层面。SPI通信需要四根线(标准SPI模式):SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS#(片选)。任何一根线虚焊、短路、或者接到错误的引脚上,通信都无法建立。
- 引脚映射错误:这是新手最容易栽跟头的地方。ZynqMP的MIO(多功能IO)引脚功能非常灵活,QSPI Flash的引脚需要映射到特定的MIO上。你必须在Vivado的硬件配置中,正确地将
QSPI0_SS0_B(片选)、QSPI0_IO0/1(数据线)、QSPI0_SCLK(时钟)分配到具体的MIO引脚,并且这个分配必须和板子原理图上的实际连接百分之百匹配。一个常见的错误是,原理图使用了QSPI0_IO1和QSPI0_IO0</


4088

被折叠的 条评论
为什么被折叠?



