首页 理论教育 零点起步:USART数据接收

零点起步:USART数据接收

时间:2023-10-17 理论教育 版权反馈
【摘要】:置位UCSRB寄存器的接收允许位即可启动USART接收器。接收器使能后RxD的普通引脚功能被USART功能所取代,成为接收器的串行输入口。数据溢出标志DOR表明由于接收缓冲器满造成了数据丢失。

零点起步:USART数据接收

置位UCSRB寄存器的接收允许位(RXEN)即可启动USART接收器。接收器使能后RxD的普通引脚功能被USART功能所取代,成为接收器的串行输入口。进行数据接收之前首先要设置好波特率、操作模式及帧格式。如果使用同步操作,XCK引脚上的时钟被用为传输时钟。

1.以5~8个数据位的方式接收数据帧

一旦接收器检测到一个有效的起始位,便开始接收数据。起始位后的每一位数据都将以所设定的波特率或XCK时钟进行接收,直到收到一帧数据的第一个停止位。接收到的数据被送入接收移位寄存器。第二个停止位会被接收器忽略。接收到第一个停止位后,接收移位寄存器就包含了一个完整的数据帧。这时移位寄存器中的内容将被转移到接收缓冲器中。通过读取UDR就可以获得接收缓冲器的内容的。

以下程序给出一个对RXC标志采用轮询方式接收数据的例子。当数据帧少于8位时,从UDR读取的相应的高几位为0。当然,执行本段代码之前首先要初始化USART。

C代码例程:

在读缓冲器并返回之前,函数通过检查RXC标志来等待数据送入接收缓冲器。

2.以9个数据位的方式接收帧

如果设定了9位数据的数据帧(UCSZ=7),在从UDR读取低8位之前必须首先读取寄存器UCSRB的RXB8以获得第9位数据。这个规则同样适用于状态标志位FE、DOR及UPE。状态通过读取UCSRA获得,数据通过UDR获得。读取UDR存储单元会改变接收缓冲器FIFO的状态,进而改变同样存储在FIFO中的TXB8、FE、DOR及UPE位。

接下来的代码示例展示了一个简单的USART接收函数,说明如何处理9位数据及状态位。

C代码例程:

上述例子在进行任何计算之前将所有的I/O寄存器的内容读到寄存器文件中。这种方法优化了对接收缓冲器的利用。它尽可能早地释放了缓冲器以接收新的数据。

3.接收结束标志及中断USART

接收器有一个标志用来指明接收器的状态。接收结束标志RXC用来说明接收缓冲器中是否有未读出的数据。当接收缓冲器中有未读出的数据时,此位为1,当接收缓冲器空时为0(即不包含未读出的数据)。如果接收器被禁止(RXEN=0),接收缓冲器会被刷新,从而使RXC清零。置位UCSRB的接收结束中断使能位RXCIE后,只要RXC标志置位(且全局中断使能)就会产生USART接收结束中断。使用中断方式进行数据接收时,数据接收结束中断服务程序必须从UDR读取数据以清RXC标志,否则只要中断处理程序一结束,一个新的中断就会产生。(www.xing528.com)

4.接收器错误标志USART

接收器有三个错误标志:帧错误FE、数据溢出DOR和奇偶校验错UPE。它们都位于寄存器UCSRA。错误标志与数据帧一起保存在接收缓冲器中。由于读取UDR会改变缓冲器,UCSRA的内容必须在读接收缓冲器UDR之前读入。错误标志的另一个同一性是它们都不能通过软件写操作来修改。但是为了保证与将来产品的兼容性,执行写操作时必须对这些错误标志所在的位置写“0”。所有的错误标志都不能产生中断。

帧错误标志FE表明了存储在接收缓冲器中的下一个可读帧的第一个停止位的状态。停止位正确(为1)则FE标志为0,否则FE标志为1。这个标志可用来检测同步丢失、传输中断,也可用于协议处理。UCSRC中USBS位的设置不影响FE标志位,因为除了第一位,接收器忽略所有其他的停止位。为了与以后的器件相兼容,写UCSRA时这一位必须置0。

数据溢出标志DOR表明由于接收缓冲器满造成了数据丢失。当接收缓冲器满(包含了两个数据),接收移位寄存器又有数据,若此时检测到一个新的起始位,数据溢出就产生了。DOR标志位置位即表明在最近一次读取UDR和下一次读取UDR之间丢失了一个或更多的数据帧。为了与以后的器件相兼容,写UCSRA时这一位必须置0。当数据帧成功地从移位寄存器转入接收缓冲器后,DOR标志被清零。

奇偶校验错标志UPE表明,接收缓冲器中的下一帧数据在接收时有奇偶错误。如果不使能奇偶校验,那么UPE位应清零。为了与以后的器件相兼容,写UCSRA时这一位必须置0。

5.奇偶校验器

奇偶校验模式位UPM1置位将启动奇偶校验器。校验的模式(偶校验还是奇校验)由UPM0确定。奇偶校验使能后,校验器将计算输入数据的奇偶并把结果与数据帧的奇偶位进行比较。校验结果将与数据和停止位一起存储在接收缓冲器中。这样就可以通过读取奇偶校验错误标志位UPE来检查接收的帧中是否有奇偶错误。如果下一个从接收缓冲器中读出的数据有奇偶错误,并且奇偶校验使能(UPM1=1),则UPE置位。直到接收缓冲器UDR被读取,这一位一直有效。

6.禁止接收器

与发送器对比,禁止接收器即刻起作用。正在接收的数据将丢失。禁止接收器RXEN清零后,接收器将不再占用RxD引脚;接收缓冲器FIFO也会被刷新。缓冲器中的数据将丢失。

7.刷新接收缓冲器

禁止接收器时缓冲器FIFO被刷新,缓冲器被清空。导致未读出的数据丢失。如果由于出错而必须在正常操作下刷新缓冲器,则需要一直读取UDR直到RXC标志清零。下面的代码展示了如何刷新接收缓冲器。

C代码例程:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈