我正在阅读 Atmel ATmega16 微控制器的数据表,我在USART部分看到了这个短语:
两个缓冲寄存器作为循环 FIFO 缓冲器运行。因此,对于每个传入的数据,UDR 只能读取一次!更重要的是错误标志(FE 和 DOR)和第 9 个数据位(RXB8)与接收缓冲区中的数据一起缓冲。因此,必须始终在读取 UDR 寄存器之前读取状态位。否则,由于缓冲区状态丢失,错误状态将丢失。
我不知道缓冲错误标志和 RXB8 是什么意思。任何帮助将不胜感激。
这里的主要警告是每个传入字节只能读取一次 UDR,并且在读取它时,提到的错误标志会被清除。因此,如果对错误标志或 RXB8 中的“第 9 位”感兴趣,则必须在读取 UDR之前读取它们。
然而,在十年的 AVR 和串行通信设计中,我从未不得不求助于使用 RXB8。为什么?仅当您使用9 个数据位进行通信时才需要它。有关 C 和汇编程序的示例,请参见数据表的第 155 页。大多数数据通信使用 7 位或(更常见的)8 位,因此大多数时候不需要这个额外的位。如果您需要它,只需按照第 4 页上的示例进行操作。155.
更重要的是错误标志(FE 和 DOR)和第 9 个数据位(RXB8)与接收缓冲区中的数据一起缓冲。因此,必须始终在读取 UDR 寄存器之前读取状态位。否则,由于缓冲区状态丢失,错误状态将丢失。
这只是指出,错误标志和第 9 个数据位(显然)与 UDR FIFO 中的数据耦合,并且在您读取 UDR 时立即丢失。
示例:
如果使用 9 个数据位,则必须在读取 UDR 之前读取第 9 位。否则,FIFO 中的下一个字节(包括其状态位)将覆盖属于前一个字节的第 9 位的信息。这同样适用于错误位。