新闻中心

EEPW首页>嵌入式系统>设计应用> AVR单片机(学习ing)-ATMEGA16的USART与PC机串行通信

AVR单片机(学习ing)-ATMEGA16的USART与PC机串行通信

作者: 时间:2016-11-27 来源:网络 收藏

7、数据发送—USART发送器

置位UCSRB 寄存器的发送允许位TXEN 将使能USART 的数据发送。使能后TxD 引脚
的通用I/O 功能即被USART 功能所取代,成为发送器的串行输出引脚。发送数据之前要
设置好波特率、工作模式与帧结构。如果使用同步发送模式,施加于XCK 引脚上的时钟
信号即为数据发送的时钟。

1)发送5 到8 位数据位的帧

将需要发送的数据加载到发送缓存器将启动数据发送。加载过程即为CPU 对UDR 寄存
器的写操作。当移位寄存器可以发送新一帧数据时,缓冲的数据将转移到移位寄存器。当
移位寄存器处于空闲状态( 没有正在进行的数据传输),或前一帧数据的最后一个停止位
传送结束,它将加载新的数据。一旦移位寄存器加载了新的数据,就会按照设定的波特率
完成数据的发送

以下程序给出一个对UDRE 标志采用轮询方式发送数据的例子。当发送的数据少于8 位
时,写入UDR 相应位置的高几位将被忽略。当然,执行本段代码之前首先要初始化
USART。在汇编代码中要发送的数据存放于R16。

void USART_Transmit( unsigned char data )
{

while ( !( UCSRA & (1< ;

UDR = data;
}

2)发送9位数据的帧

如果发送9 位数据的数据帧(UCSZ = 7),应先将数据的第9 位写入寄存器UCSRB 的
TXB8,然后再将低8位数据写入发送数据寄存器UDR。以下程序给出发送9位数据的数据
帧例子。在汇编代码中要发送的数据存放在R17:R16 寄存器中。

void USART_Transmit( unsigned int data )
{

while ( !( UCSRA & (1< ;

UCSRB &= ~(1< if ( data & 0x0100 )
UCSRB |= (1<
UDR = data;
}

第9 位数据在多机通信中用于表示地址帧,在同步通信中可以用于协议处理。

3)传送标志位与中断

USART 发送器有两个标志位:USART 数据寄存器空标志UDRE 及传输结束标志TXC,两
个标志位都可以产生中断。
数据寄存器空UDRE 标志位表示发送缓冲器是否可以接受一个新的数据。该位在发送缓
冲器空时被置"1” ;当发送缓冲器包含需要发送的数据时清零。为与将来的器件兼容,写
UCSRA 寄存器时该位要写"0”。
当UCSRB 寄存器中的数据寄存器空中断使能位UDRIE 为"1” 时,只要UDRE 被置位(
且全局中断使能),就将产生USART 数据寄存器空中断请求。对寄存器UDR 执行写操作
将清零UDRE。当采用中断方式的传输数据时,在数据寄存器空中断服务程序中必须写一
个新的数据到UDR 以清零UDRE ;或者是禁止数据寄存器空中断。否则一旦该中断程序
结束,一个新的中断将再次产生。
当整个数据帧移出发送移位寄存器,同时发送缓冲器中又没有新的数据时,发送结束标志
TXC 置位。TXC 在传送结束中断执行时自动清零,也可在该位写"1” 来清零。TXC 标志位
对于采用如RS-485 标准的半双工通信接口十分有用。在这些应用里,一旦传送完毕,应
用程序必须释放通信总线并进入接收状态。

当UCSRB 上的发送结束中断使能位TXCIE 与全局中断使能位均被置为"1” 时,随着TXC
标志位的置位, USART 发送结束中断将被执行。一旦进入中断服务程序, TXC 标志位
即被自动清零,中断处理程序不必执行TXC 清零操作。

4)奇偶校验产生电路

奇偶校验产生电路为串行数据帧生成相应的校验位。校验位使能(UPM1 = 1) 时,发送控
制逻辑电路会在数据的最后一位与第一个停止位之间插入奇偶校验位。

5)禁止发送器

TXEN 清零后,只有等到所有的数据发送完成后发送器才能够真正禁止,即发送移位寄存
器与发送缓冲寄存器中没有要传送的数据。发送器禁止后,TxD引脚恢复其通用I/O功能。

8、数据接收—USART接收器

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

1)以5 到8 个数据位的方式接收数据帧

一旦接收器检测到一个有效的起始位,便开始接收数据。起始位后的每一位数据都将以所
设定的波特率或XCK 时钟进行接收,直到收到一帧数据的第一个停止位。接收到的数据
被送入接收移位寄存器。第二个停止位会被接收器忽略。 接收到第一个停止位后,接收移
位寄存器就包含了一个完整的数据帧。这时移位寄存器中的内容将被转移到接收缓冲器
中。通过读取UDR 就可以获得接收缓冲器的内容的。
以下程序给出一个对RXC 标志采用轮询方式接收数据的例子。当数据帧少于8 位时,从
UDR 读取的相应的高几位为0。当然,执行本段代码之前首先要初始化USART。

unsigned char USART_Receive( void )
{

while ( !(UCSRA & (1< ;

return UDR;
}

在读缓冲器并返回之前,函数通过检查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位数据及状态位。

unsigned int USART_Receive( void )
{
unsigned char status, resh, resl;

while ( !(UCSRA & (1< ;


status = UCSRA;
resh = UCSRB;
resl = UDR;

if ( status & (1< return -1;

resh = (resh >> 1) & 0x01;
return ((resh << 8) | resl);
}

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

3)接收结束标志及中断

USART 接收器有一个标志用来指明接收器的状态。

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

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 标志清零。下面的
代码展示了如何刷新接收缓冲器。

void USART_Flush( void )
{
unsigned char dummy;
while ( UCSRA & (1< }


上一页 1 2 3 4 下一页

评论


技术专区

关闭