ZYNQ中UART的FIFO复位

UART控制器

网上介绍ZYNQ中UART的文章有很多,在这里就不多介绍了,大多数讲了怎么配置,然后做回环测试,但都没有讲过数据长度错了之后怎么去清空的问题。

问题现象

大家都知道,UART 的接收和发送都是由 64字节的FIFO缓存,我们读写也是读写的这两个FIFO,FIFO的深度不能修改。在使用ZYNQ串口中断时,会存在一种情况,当你串口发送的数据byte超过设置的FIFO阈值是,会存在FIFO读不空的情况,导致往后接收到的数据都是错误的。

解决方案

理论上的解决方案是有两个

  1. 每次读FIFO时直接读64个数据,将FIFO读空,再截取有用的数据长度
  2. 复位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));
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值