这个问题困扰我好几天了,一直找不到原因。写了个串口驱动,收发都用DMA,发送时,设置好DMA,等待传输完成,在DMA传输完成终端中置位一个标志通知发送程序发送完毕。接收时,驱动内部有缓存,如果不调用接收函数,USART收到的数据就通过DMA保存在缓存中,如果一直不读取DMA传输大小为缓存大小,所以缓存满了就不再传输。读取时查看缓存中的数据是否大于等于需要接收的数据,如果是就读走需要的数据,调整DMA的目的地址和传输数量,如果不够就查看是否接收超时,如果超时就读走已接收的数据,如果未超时就等待数据收够或者超时,然后读取数据,同样读取数据后必然调整DMA的目的地址和传输数量。 超时和接收计数判断是在一个每10ms调用一次的函数中进行,判断DMA的计数寄存器的值有无变化,无变化则认为没收到数据,有变化认为收到数据。
现在的问题是,当PC通过串口狂发数据给MCU时(接收缓存设置为512字节大小,每次调用读取函数也是指定读取512字节,PC每10ms发送一包512字节,波特率19200),开始接收还正常,但是一会后就无法接收数据了,调试看了下,USART和DMA的设置都是正常的,但是收到数据后DMA就是不传输,似乎USART没有产生DMA请求或者DMA没有响应请求。同样的如果我MCU也同时狂发数据给PC,在接收出现问题时,发送也会出现问题,明显可以看到DMA通道的计数器为非0,但是就一直不变了,所以导致发送程序一直等到不到发送完成。看到有人说是因为USART溢出错误了,要清除ORE标志才能继续传输,但是我在代码中加了 如果ORE只为则while(1),但是程序并没有进入这里,之后又试了开ORE中断,在ISR中通过读SR再读DR的序列清除ORE标志,但是我设置断点后,程序一直到死也没有进中断。
百思不得其解!请高手帮忙看看是什么问题!感激不尽! |