-
读取SR(0x28), 得到0x6 -
写0到SSIENR(0x0), Disable -
写1到SSIENR(0x0), Enable -
读DR0(0x60),从FiFo读取数据
基于以上的信息,我们可以猜测当SPI没有数据的时候,但是CPU又尝试读取的时候,SPI这边会通过HRESP送一个ERROR给CPU,而不是在HRDATA上面传输有效数据。
进一步查阅相关文档,对一个ARM CPU来说,CPU本身并不直接处理 AHB 总线上的 HRESP 错误。当 CPU在 AHB 总线上发起读写操作时,如果 slave 端返回 HRESP 错误,CPU 会产生一个Data Abort异常。
https://stackoverflow.com/questions/58044852/difference-between-armv8-data-abort-exception-subtypes-not-in-translation-table
- [1] Flash address range (e.g. 0x00000000)
- ESR.ISS = 0x10 (ISS.DFSC = 0x10)
- Synchronous External abort, not on translation table walk
- [2] An expected unmapped address (e.g. 0x50000000)
- ESR.ISS = 0x06 (ISS.DFSC = 0x06)
- Synchronous External abort, on translation table walk, level 2
我们关注第一项错误“Synchronous External abort, not on translation table walk”。它是对Flash地址的访问。下面的回答还是到位的,点明SEA(Synchronous External Abort)是因为外设产生,然后报告到总线,那么ARM CPU得到了一个“error”的回复,然后产生这个SEA,并不是MMU映射的问题:
原文始发于微信公众号(寻隐在线):对ARM Synchronous External Abort的理解