UART控制器
网上介绍ZYNQ中UART的文章有很多,在这里就不多介绍了,大多数讲了怎么配置,然后做回环测试,但都没有讲过数据长度错了之后怎么去清空的问题。
问题现象
大家都知道,UART 的接收和发送都是由 64字节的FIFO缓存,我们读写也是读写的这两个FIFO,FIFO的深度不能修改。在使用ZYNQ串口中断时,会存在一种情况,当你串口发送的数据byte超过设置的FIFO阈值是,会存在FIFO读不空的情况,导致往后接收到的数据都是错误的。
解决方案
理论上的解决方案是有两个
- 每次读FIFO时直接读64个数据,将FIFO读空,再截取有用的数据长度
- 复位FIFO,将FIFO清空
针对第一点,先不说每次读64byte会占用更多的时间问题,在实际的调试过程中发现,第一点有小bug,当单步调试的时候读64byte时能读出来的,但不使用单步调试时,每次只会读FIFO阈值门限byte数据,目前还没想到解决问题的办法。
而FIFO的复位有两种,一是在"xuartps_hw.c"中的XUartPs_ResetHw函数,XUartPs_ResetHw函数会将整个UART配置复位;二是使用软件复位,软件复位能很好的解决这个问题,函数如下。
/*
* Software reset of receive and transmit
* This clears the FIFO.
*/
XUartPs_WriteReg(BaseAddress, XUARTPS_CR_OFFSET,
((u32)XUARTPS_CR_TXRST | (u32)XUARTPS_CR_RXRST));