ZIGBEE通讯-6.串口数据收发

ZIGBEE通讯-6.串⼝数据收发
UART 模式提供异步串⾏接⼝。在 UART 模式中,接⼝使⽤ 2 线或者含有引脚 RXD、TXD、可选 RTS 和CTS 的 4 线。UART 模式的操作具有下列特点:
8 位或者 9 位负载数据
奇校验、偶校验或者⽆奇偶校验
配置起始位和停⽌位电平
配置 LSB 或者 MSB ⾸先传送
独⽴收发中断
独⽴收发 DMA 触发
奇偶校验和帧校验错误状态
UART 模式提供全双⼯传送,接收器中的位同步不影响发送功能。传送⼀个 UART 字节包含 1 个起始位、 8个数据位、1 个作为可选项的第 9 位数据或者奇偶校验位,再加上 1 个或 2 个停⽌位。注意,虽
然真实的数据包含 8 位或者 9 位,但是,数据传送只涉及字节。UART操作由USART控制和状态寄存器UxCSR以及UART控制寄存器UxUCR 来控制。这⾥的 x是USART的编号,其数值为 0或 1。
当 UxCSR.MODE 设置为 1 时,就选择了 UART 模式。
1、UART 发送
当 USART 收/发数据缓冲器、寄存器 UxDBUF 写⼊数据时,该字节发送到输出引脚 TXDx。UxDBUF寄存器是双缓冲的。
当字节传送开始时,UxCSR.ACTIVE 位变为⾼电平,⽽当字节传送结束时为低。当传送结束时,UxCSR.TX_BYTE位设置为 1。当UxDBUF寄存器就绪,准备接收新的传输数据时,就产⽣了⼀个中断请求。该中断在传送开始之后⽴刻发⽣,因此,当字节正在发送时,新的字节能够装⼊数据缓冲器。
2、UART接收
当 1 写⼊ UxCSR.RE 位时,在 UART 上数据接收就开始了。然后 UART 会在输⼊引脚 RXDx 中寻有效起始位,并且设置
UxCSR.ACTIVE 位为 1。当检测出有效起始位时,收到的字节就传⼊到接收寄存器,UxCSR.RX_BYTE位设置为 1。该操作完成时,产⽣接收中断。同时 UxCSR.ACTIVE 变为低电平。
通过寄存器 UxDBUF 提供收到的数据字节。当 UxDBUF 读出时,UxCSR.RX_BYTE位由硬件清 0。
3、UART硬件流控制
当 UxUCR.FLOW 位设置为 1,硬件流控制使能。然后,当接收寄存器为空⽽且接收使能时,RTS 输出变低。在 CTS 输⼊变低之前,不会发⽣字节传送。
背侧丘脑4、UART特征格式
如果寄存器 UxUCR 中的 BIT9 和奇偶校验位设置为 1,那么奇偶校验产⽣⽽且检测使能。奇偶校验计算出来,作为第 9 位来传送。在接收期间,奇偶校验位计算出来⽽且与收到的第 9 位进⾏⽐较。如果奇偶校验出错 ,则 UxCSR.ERR 位设置为⾼电平。当读取 UxCSR 时,该位清除。
要传送的停⽌位的数量设置为 1 或者 2,这取决于寄存器位 UxUCR. SPB。接收器总是要核对⼀个停⽌位 。如果在接收期间收到的第⼀个停⽌位不是期望的停⽌位电平,就通过设置寄存器位 UxCSR.FE 为⾼电平,发出帧出错信号。当读取 UxCSR 时,UxCSR.FE 位清除,当UxCSR.SPB 设置为 1 时,接收器将核对两个停⽌位。注意当检测到第⼀个停⽌位正确时,将设置 RX 中断。如果第⼆个停⽌位
不正确,设置帧误码位UxCSR.FE时将有⼀个延迟 。这个延迟与波特率有关(位持续时间)。
5、波特率产⽣
当运⾏在 UART 模式时,内部的波特率发⽣器设置 UART 波特率。当运⾏在 SPI 模式时,内部的波特率发⽣器设置 SPI 主时钟频率。
洪华美由寄存器 UxBAUD.BAUD_M[7:0]和 UxGCR.BAUD_E[4:0]定义波特率。该波特率⽤于 UART 传送,也⽤于 SPI 传送的串⾏时钟速率。波特率由下式给出:
在公式中f 是系统时钟频率,等于 16 MHz RCOSC 或者 32 MHz XOSC。标准波特率所需的寄存器值如图2-6-2 所⽰。该图适⽤于典型的 32 MHz 系统时钟。真实波特率与标准波特率之间的误差,⽤百分数表⽰。
当 BAUD_E 等于 16 且 BAUD_M 等于 0 时,UART 模式的最⼤波特率是 f/16 且 f 是系统时钟频率。
注意波特率必须通过 UxBAUD 和寄存器 UxGCR 在任何其他 UART 和 SPI 操作发⽣之前设置。这意味着使⽤这个信息的定时器不会更新,直到它完成它的起始条件,因此改变波特率是需要时间的。
6、清除USART
通过设置寄存器位 UxUCR.FLUSH 可以取消当前的操作。这⼀事件会⽴即停⽌当前操作并且清除全部数据缓冲器。应注意在 TX/RX 位中间设置清除位,清除将不会发⽣,直到这个位结束(缓冲将被⽴即清除但是知道位持续时间的定时器不会被清除)。因此使⽤清除位应符合USART 中断,或在 USART 可以接收更新的数据或配置之前,使⽤当前波特率的等待时间位。
7、USART中断
每个 USART 都有两个中断:RX 完成中断(URXx)和 TX 完成中断(UTXx)。当传输开始触发 TX 中断,且数据缓冲区被卸载。
USART的中断使能位在寄存器 IEN0 和寄存器 IEN2 中,中断标志位在寄存器 TCON和寄存器 IRCON2 中 。关于这些寄存器的详细信息见 数据⼿册2.5 节。中断使能和标志总结如下。
中断使能:
USART0 RX: IEN0.URX0IE
USART1 RX: IEN0.URX1IE
USART0 TX: IEN2.UTX0IE
USART1 TX: IEN2.UTX1IE
中断标记:
USART0 RX: TCON.URX0IF
USART1 RX: TCON.URX1IF
USART0 TX: IRCON2.UTX0IF
USART1 TX: IRCON2.UTX1IF
8、USART  DMA 触发
有两个 DMA 触发与每个 USART 相关。DMA 触发由事件 RX 或者 TX 完成激活,也就是说,与USART的中断请求事件相同。可以配置DMA 通道使⽤ USART 收/发缓冲器即 UxDBUF作为它的源地址或者⽬标地址。
CC2530芯⽚有两个串⾏接⼝UART0和UART1:
UART0对应RXD(P02)、TXD(P03);
UART1对应RXD(P04)、TXD(P05);
根据开发板硬件原理图确定开发板⽤到的是哪个串⼝,如图所⽰。
从图中可以看出,USART的发送与接收引脚分别是核⼼板的6、7引脚上,J22中引脚编号与核⼼板引脚对应编号为1-12对应13-24,下⾯继续查看引脚对照表,确定所⽤USART所⽤IO⼝。
根据引脚对照表,确定USART的发送引脚为P0.3,接收引脚为P0.2。也就是说,开发板的串⼝⽤到的是USART0。想要使⽤USART0,需要配置相应的寄存器,使⽤到的寄存器如图所⽰。
PERCFG (0xF1) –外设控制寄存器位0配置USART0的备⽤位置
P0SEL (0xF3)–端⼝0功能选择寄存器0:通⽤IO;1:外设功能
U0CSR (0x86) - USART 0 控制和状态寄存器位7配置UART模式位6配置接收器使能
U0UCR (0xC4) - USART 0 UART 控制寄
存器
使⽤经典串⼝配置,默认值
U0GCR (0xC5) - USART 0 通⽤控制寄存
位4:0配置波特率指数值BAUD_E
U0BAUD (0xC2) - USART 0 波特率控制
寄存器
配置波特率⼩数部分的值
IEN0 (0xA8) – 中断使能 0位7配置总中断使能
位2配置USART0接收中断使能
根据实验原理,在32MHz系统时钟下将串⼝波特率配置位115200,打开串⼝接收中断,在中断中接收数据,并将就收到的数据发送出去。在main.c中编写如下代码,实现串⼝收发。
#include <ioCC2530.h>
/****************************
//32M时钟频率实现函数
*****************************/
void System_Clock_32M()
{
CLKCONCMD &= ~0x40; // 1011 1111 让32M晶振⼯作
while(CLKCONSTA & 0x40); // 0100 0000  等待晶振稳定
CLKCONCMD &= ~0x07; // 1111 1000  不分频的供给CPU
}
/****************************
假如我是一个病人//串⼝初始化实现函数
lbe
*****************************/
void UART_Init()
{
PERCFG &= ~0x01; // 1111 1110 把零位清零选择备⽤位置1 即P0_2  P0_3
P0SEL |= 0x0C; // 0000 1100 设置P0_2 P0_3为⽚上外设模式
U0CSR |= 0xC0; // 1100 0000 设置为UART模式使能接收器
U0UCR |= 0; // 串⼝0 典型配置,禁⽤流控、禁⽌奇偶校验位、8位数据位、1位停⽌位  U0GCR = 11; // 设置BAUD_E为11
U0BAUD = 216;// 设置BAUD_M为216 得出波特率为115200
IEN0 |= 0x84; // 1000 0100 开总中断接收中断
}
/****************************探索与创新
//串⼝发送数据实现函数
*****************************/
void UART_Send(char* buf, int length)
{
for(int i=0; i<length; i++)
{
U0DBUF = buf[i];  // 把收数据放⼊发送寄存器
while( UTX0IF==0 ); // 等待发送完成
UTX0IF = 0; // 清发送完成标志
}
}
void main(void)
{
char string[] = "hello world!";
System_Clock_32M(); // 将系统时钟切换为32M
UART_Init(); // 串⼝初始化
UART_Send(string, sizeof(string)); // 发送字符串
while(1);
}
#pragma vector=URX0_VECTOR放射鼠
__interrupt void uart0()
{
URX0IF = 0; // 清中断接收标志
char data = U0DBUF; // 从数据缓冲器拿到数据
U0DBUF = data;  // 把收到的数据通过串⼝再返回发出去
while( UTX0IF==0 ); // 等待发送完成
UTX0IF = 0; // 清发送完成标志
}

本文发布于:2024-09-23 00:35:13,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/32815.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:寄存器   数据   中断   配置   接收   发送
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议