楼上的观点,我在坛子里也有看到。
不解的是,改为查询模式的SPI DMA操作后,也还是有问题。这时中断已关闭。
下面是非中断SPI DMA 接收数据的示意代码(会发生数据错位)。
while (1) {
USBH_Process(&USB_OTG_Core, &USB_Host); // Host Task handler
switch(ST) {
case 0:
if (IRQ==0) {
Trig_SPI_DMARx(); // 触发Rx DMA
ST=1;
break;
}
case 1:
if (SPI_DMARx_End) {// DMA 完成判断
Data_Proc();
ST=0;
}
break;
}
}
下面是查询SPI 接收数据的示意代码(不会发生数据错位)。
while (1) {
USBH_Process(&USB_OTG_Core, &USB_Host); // Host Task handler
if (IRQ==0) {
for(i=0; i<32; i++) {
SPI2->DR=0;
while (!SPI2_Rx_Rdy()); // 等待SPI Rx接收完成
Bu[i]=SPI2->DR;
break;
}
}
}
比较上面两段代码可以发现,使用DMA操作会发生错位问题,但愿不会是硬件的Bug。
|