综述:SPI在跑高速时,由于走线和slave数据回传准备阶段存在delay,会导致controller read时序不达标。 可通过在SPI Controller端增加RXD Sample Delay的方式消除时序误差影响。
问题还原:
现象:GPU SOC以48M读写Nor时无法probe到device;24M正常。
Debug:
1.看device反馈ID值:
用逻辑分析仪查看probe指令发送后MISO的数值:
ID能正常反馈,但软件读到的ID值是错的。且后续CS不拉低,不能读写数据。
说明SPI Controller发送到device反馈没问题,Conroller回读时出现问题。
2.查看AC Timing(只能在device端测信号) (频率24M是因为CLK电平下不到0V,48M频率没被正确识别到)。红框中看出CLK上升沿采样时MISO 未完全进入hold time,时序不通过。
3.定位:SPI Controller 回读时,由于走线和slave数据回传准备阶段存在delay,导致controller read时序不达标。
4.解决方案:
翻看新思DesignWare DW_apb_ssi Databook手册,高速SPI运行时可通过调节RXD寄存器来实现延迟采样:
网上查看Intel文档也有相同方案:
调整RXD寄存器,增加1个时钟周期的delay,问题解决。