【电子资讯-电子街】寄存器以9个数据位的方式接收帧
如果设定了9位数据的数据帧(UCSZ=7),在从UDR读取低8位之前必须首先读取寄存器UCSRB的RXB8以获得第9位数据。这个规则同样适用于状态标志位FE、I)()R及Ut)E。状态通过读取UCSRA获得,数据通过UDR获得。读取UDR存储单元会改变接收缓冲器FIF0的状态,进而改变同样存储在FIF0中的TXB8、FE、DOR及UPE位。接下来的代码实例展示了一个简单的USART接收函数,说明如何处理9位数据及状态位。
汇编代码例程(1):
USART_Receive:
;等待接收数据
sbis UCSRA.RXC
rjmp USART_Receive
;从缓冲器中获得状态、第9位及数据
in rl8,UCSRA
in rl7.I『C.SRB
in rl6,UDR
;如果出错,返回一1
andi rl8,(1<
breq USART_ReceiveNoError
idi rl7,HIGH(一1)
idi rl6,LaW(一1)
USART_ReceiveNoError:
;过滤第9位数据,然后返回
isr rl7
andi rl7,0x01
ret
C代码例程(1):
unsigned int USART_Receive(void)
{
unsigned char status,resh,resl;
/*等待接收数据*/
while(!(UCSRAa(1<
2
/*从缓冲器中获得状态、第9位及数据*/
status=UCSRA;
resh=UCSRB;
resl=UDR;
/*如果出错,返回-l*/
if(status&(1<
return---1;
/*过滤第9位数据,然后返回*/
resh=(resh>>1)&0x01”
return((resh<
}
上述例子在进行任何计算之前将所有的I/O寄存器的内容读到寄存器文件中。这种方法
优化了对接收缓冲器的利用,它尽可能早地释放了缓冲器以接收新的数据。
更多推荐信息