新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > AVR学习心得(四)

AVR学习心得(四)

作者: 时间:2016-11-10 来源:网络 收藏
AVR mega128简单的串行通讯原理


单片机同PC通讯是用的都是UART进行通讯,其实各种单片机的串行通讯原理是完全相同的,而不同的仅仅是器控制的寄存器不同。对于mega128来说比51功能强大些,完全不用占用任何别的资源。只要控制好相应的寄存器就好了。

ATmega128具有两个USART:USART0和USART1,这两个USART的具体功能将在下面描述。USART0和USART1使用不同的IO寄存器注意:在ATmega103兼容模式中USART1.UBRR0H和UCRS0C无效.这意味ATmega128仅可以使用USART0以异步方式工作

本文引用地址:https://www.eepw.com.cn/article/201611/317329.htm

USARTn 数据寄存器-UDRn:接受和发送数据寄存器

只有当UCSRA寄存器的UDRE标志置位后才可以对发送缓冲器进行写操作。如果UDRE没有置位,那么写入UDR 的数据会被USART 发送器忽略。当数据写入发送缓冲器后,若移位寄存器为空,发送器将把数据加载到发送移位寄存器。然后数据串行地从TxD 引脚输出。
接收缓冲器包括一个两级FIFO,一旦接收缓冲器被寻址FIFO 就会改变它的状态。因此不要对这一存储单元使用读- 修改- 写指令(SBI 和CBI)。使用位查询指令(SBIC 和SBIS)时也要小心,因为这也有可能改变FIFO 的状态。

USARTn 控制和状态寄存器A -UCSRnA:

&8226;Bit 7 – RXCn: USART 接收结束
接收缓冲器中有未读出的数据时RXCn 置位,否则清零。接收器禁止时,接收缓冲器被刷新,导致RXCn 清零。RXCn 标志可用来产生接收结束中断( 见对RXCIEn 位的描述)。
&8226; Bit 6 – TXCn: USART 发送结束
发送移位缓冲器中的数据被送出,且当发送缓冲器 (UDRn) 为空时TXCn 置位。执行发送结束中断时TXCn 标志自动清零,也可以通过写1 进行清除操作。TXCn 标志可用来产生发送结束中断( 见对TXCIEn 位的描述)。
&8226; Bit 5 – UDREn: USART 数据寄存器空
UDREn 标志指出发送缓冲器(UDRn) 是否准备好接收新数据。UDREn 为1 说明缓冲器为空,已准备好进行数据接收。UDREn 标志可用来产生数据寄存器空中断( 见对UDRIEn位的描述)。复位后UDREn 置位,表明发送器已经就绪。
&8226; Bit 4 – FEn: 帧错误
如果接收缓冲器接收到的下一个字符有帧错误,即接收缓冲器中的下一个字符的第一个停止位为0,那么FEn 置位。这一位一直有效直到接收缓冲器(UDRn) 被读取。当接收到的停止位为1 时, FEn 标志为0。对UCSRnA 进行写入时,这一位要写0。
&8226; Bit 3 – DORn: 数据过速
数据过速时DORn 置位。当接收缓冲器满( 包含了两个数据),接收移位寄存器又有数据,若此时检测到一个新的起始位,数据溢出就产生了。这一位一直有效直到接收缓冲器(UDRn) 被读取。对UCSRnA 进行写入时,这一位要写0。
&8226; Bit 2 – UPEn: 奇偶校验错误

当奇偶校验使能(UPMn1 = 1),且接收缓冲器中所接收到的下一个字符有奇偶校验错误时UPEn 置位。这一位一直有效直到接收缓冲器 (UDRn) 被读取。对UCSRnA 进行写入时,这一位要写0。
&8226; Bit 1 – U2Xn: 倍速发送
这一位仅对异步操作有影响。使用同步操作时将此位清零。此位置1 可将波特率分频因子从16 降到8,从而有效的将异步通信模式的传输速率加倍。
&8226; Bit 0 – MPCMn: 多处理器通信模式
设置此位将启动多处理器通信模式。MPCMn 置位后, USARTn 接收器接收到的那些不包含地址信息的输入帧都将被忽略。发送器不受MPCMn 设置的影响。

USARTn 控制和状态寄存器B -UCSRnB:

&8226; Bit 7 – RXCIEn: 接收结束中断使能
置位后使能RXCn 中断。当RXCIEn 为1,全局中断标志位SREG 置位,UCSRnA 寄存器的RXCn 亦为1 时可以产生USARTn 接收结束中断。
&8226; Bit 6 – TXCIE: 发送结束中断使能
置位后使能TXCn 中断。当TXCIEn 为1,全局中断标志位SREG 置位, UCSRnA 寄存器的TXCn 亦为1 时可以产生USARTn 发送结束中断。
&8226; Bit 5 – UDRIEn: USART 数据寄存器空中断使能
置位后使能UDREn 中断。当UDRIEn 为1,全局中断标志位SREG 置位, UCSRnA 寄存器的UDREn 亦为1 时可以产生USARTn 数据寄存器空中断。
&8226; Bit 4 – RXENn: 接收使能
置位后将启动USARTn 接收器。RxDn 引脚的通用端口功能被USARTn 功能所取代。禁止接收器将刷新接收缓冲器,并使 FEn、DORn 及UPEn 标志无效。
&8226; Bit 3 – TXENn: 发送使能
置位后将启动将启动USARTn 发送器。TxDn 引脚的通用端口功能被USARTn 功能所取代。TXENn 清零后,只有等到所有的数据发送完成后发送器才能够真正禁止,即发送移位寄存器与发送缓冲寄存器中没有要传送的数据。发送器禁止后,TxDn 引脚恢复其通用I/O 功能。
&8226; Bit 2 – UCSZn2: 字符长度
UCSZn2与UCSRnC寄存器的UCSZn1:0结合在一起可以设置数据帧所包含的数据位数(字符长度)。
&8226; Bit 1 – RXB8n: 接收数据位8
对9 位串行帧进行操作时,RXB8n 是第9 个数据位。读取UDRn 包含的低位数据之前首先要读取RXB8n。
&8226; Bit 0 – TXB8n: 发送数据位8
对9位串行帧进行操作时,TXB8n是第9个数据位。写UDRn之前首先要对它进行写操作。

USARTn 控制和状态寄存器C -UCSRnC:

&8226; Bit 7 – 保留位
该位保留。为与未来器件兼容,对UCSRnC 写入时该位必须写0 。
&8226; Bit 6 – UMSELn: USART 模式选择
通过这一位来选择同步或异步工作模式。

&8226; Bit 5:4 – UPMn1:0: 奇偶校验模式
这两位设置奇偶校验的模式并使能奇偶校验。如果使能了奇偶校验,那么在发送数据,发送器都会自动产生并发送奇偶校验位。对每一个接收到的数据,接收器都会产生一奇偶值,并与UPMn0所设置的值进行比较。如果不匹配,那么就将UCSRnA中的UPEn置位。

&8226; Bit 3 – USBSn: 停止位选择
通过这一位可以设置停止位的位数。接收器忽略这一位的设置。

&8226; Bit 2:1 – UCSZn1:0: 字符长度
UCSZn1:0与UCSRnB寄存器的 UCSZn2结合在一起可以设置数据帧包含的数据位数(字符长度)。

Bit 0 – UCPOLn: 时钟极性
这一位仅用于同步工作模式。使用异步模式时,将这一位清零。UCPOLn 设置了输出数据的改变和输入数据采样,以及同步时钟XCKn 之间的关系。

USART 波特率寄存器-UBRRnL 和UBRRnH:

&8226; Bit 15:12 – 保留
这些位是为以后的使用而保留的。为了与以后的器件兼容,写UBRRnH 时将这些位清零。
&8226; Bit 11:0 – UBRRn11:0: USARTn 波特率寄存器
这个12 位的寄存器包含了USARTn 的波特率信息。其中UBRRnH 包含了USARTn 波特率高4 位,UBRRnL 包含了低8 位。波特率的改变将造成正在进行的数据传输受到破坏。写UBRRnL 将立即更新波特率分频器

附:实验程序

/*****************************************************
函 数 名:void uart_init(void)
功 能:初始化串口
说 明:根据要求设置好波特率和数据位
入口参数:无
返 回 值:无
*****************************************************/
void uart_init(void)
{
UBRR0H=0; /* 设置波特率9600,时钟8MHz,查表UBRR=51 */
UBRR0L=51; /* UBR=51 */
UCSR0B=(1<

UCSR0C=0x06; /* 设置数据格式,8位数据位,1位停止位 */
}

/*****************************************************
函 数 名:void Uart_Transmit(unsigned char c)
功 能:向串口发送一字符(查询方式)
说 明:只有当寄存器UCSRA的UDRE标志置位后,才可以对发送缓冲进行写操作
入口参数:无
返 回 值:无
*****************************************************/
void Uart_Transmit(unsigned char c)
{
while( !( UCSR0A & (1<
UDR0=c; /* 发送数据 */
}

/*****************************************************
函 数 名:void Uart_Transmits(unsigned char *arr)
功 能:向串口写入字符串(查询方式)
说 明:
入口参数:无
返 回 值:无
*****************************************************/
void Uart_Transmits(unsigned char *arr)
{
do
{
Uart_Transmit(*arr);
arr++;
}while(*arr!=/0);

}



关键词: AVR学习心

评论


技术专区

关闭