寄存器以9个数据位的方式接收帧
发表:2023-08-29 12:05:41 阅读:28

电子资讯-电子街】寄存器以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寄存器的内容读到寄存器文件中。这种方法

优化了对接收缓冲器的利用,它尽可能早地释放了缓冲器以接收新的数据。

 

更多推荐信息

片内时钟产生——波特率发生器

数据帧格式数据帧的结构

与SPl接口相关的寄存器

SPl数据传输模式