用 H7 SPI 的时候,发现使用轮询接收函数经常会出现接收出错。
查看轮询函数源码发现 H7 的 SPI 跟 F4 等有点不同。
个人理解是:
F4 是发一个字节出去,才会收一个字节进来,所以轮询循环被打断了也没事。
H7的 SPI 是有个寄存器可以设置好要收多少字节,然后硬件自动产生时钟,然后软件开始循环接收,如果这个循环被更高优先级任务打断了,中间就可能有一些字节丢了。然后一直达不到设置的接收数量,最终超时。
我试了把优先级较高且占用时间较长的任务先关掉,spi 轮询就没有问题了。
照这么看,使用 轮询 SPI 就只能关中断。或者使用 中断接收 或 DMA 接收。
但如果是访问存储器,通信量较大,关中断有点不现实。 所以轮询方式有点鸡肋。。
也不知道上面的理解对不对。