在处理4G AT指令收发时,发现nrf52832会再发送数据AT+QISEND时,丢掉数据。
经测试发现,
nrf52832内部有4个字节的硬件fifo,软件中使用easydma进行uart数据的收发操作,nrf52832对于uart和easydma只有接收完成中断,没有类似stm32的接收超时中断,这里驱动文件中将每次dma操作仅仅一个字节。这样dma接收完成后,触发一次中断,
也就是说完成一次dma接收操作之后,需要及时将数据读取,并重新初始化easy dma,准备接收下一个字节。这个读取和重新接收的操作时间不能太久,我这里就是因为接收数据后,进入了at parser里面,导致处理时间过长,easydma准备好的时候,前面已经有数据overrun了。
uarte数据接收函数调用路径,这些函数调用,均在中断上下文中进行(其中耗时步骤为readline,这里将AT发送数据部分skip data处理,就可以正常接收了):
UART0_IRQHandler() --> uarte_irq_handler -->uart_event_handler --> my_uart_event_handle -->karl_uart_event_handle --> readline()
阅读(3931) | 评论(0) | 转发(0) |