您的位置:首页 > 其它

第11章 CC2530串口通讯-接收字符串

2017-12-31 00:09 337 查看

1 理论分析

当 1 写入 UxCSR.RE 位时,在 UART 上数据接收就开始了。然后 UART 会在输入引脚 RXDx 中寻找有效起始位,并且设置 UxCSR.ACTIVE 位为 1。当检测出有效起始位时,收到的字节就传入到接收寄存器,UxCSR.RX_BYTE 位设置为 1。该操作完成时,产生接收中断。同时 UxCSR.ACTIVE 变为低电平。

通过寄存器 UxBUF 提供收到的数据字节。当 UxBUF 读出时,UxCSR.RX_BYTE位由硬件清 0。

注意:

当应用程序读 UxDBUF,很重要的一点是不清除 UxCSR.RX_BYTE。清除UxCSR.RX_BYTE 暗示 UART,使得它以为 UART RX 移位寄存器为空,即使它可能保存有未决数据 (一般是由于背对背传输)。所以 UART 声明 (TTL 为低电平) RT/RTS线,这会允许数据流进入 UART,导致潜在的溢出。因此 UxCSR.RX_BYTE 标志紧密结合了自动 RT/RTS 功能,因此只能被 SoC UART 本身控制。否则应用程序一般可以经历以下事件:RT/RTS 线保持声明(TTL 为低电平)的状态,即使一个背对背传输清楚地表明应该间歇性地停止数据流。

2 实验详解

2.1 实验目的

1)、了解 CC2530 串口的功能;

2)、掌握 CC2530 通过串口接收电脑发送过来的数据。

2.2实验设备

硬件:PC 机一台,ZB2530(底板、核心板、仿真器、USB 线)一套;

软件:2000/XP/win7 系统,IAR 8.20 集成开发环境。

2.3实验相关电路图



图 1 FT232



图2 USB

2.4实验分析

由于要接收数据,所以在上节实验 Uart 配置的基础上,加上允许 Uart 接收数据就可以了。为了不占用 CPU 资源,我们采用 Uart 中断方式,所以打开接收中断和总中断。

其中一些寄存器在上一讲已经列出,不清楚的请查看上一讲;这一讲使用中断方式实现串口发送数据,在下面会具体分析。

“允许 Uart 接收数据”是配置 U0CSR。而管理中断开关的寄存器配置是 IEN0。

表 1中断使能



表2USART0控制和状态



具体相关寄存器的配置如下:

CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ 晶振
while(CLKCONSTA & 0x40); // 等待晶振稳定
CLKCONCMD &= ~0x47; // 设置系统主时钟频率为 32MHZ

PERCFG = 0x00; //位置 1 P0 口
P0SEL = 0x0c; //P0_2,P0_3 用作串口,第二功能
P2DIR &= ~0XC0; //P0 优先作为 UART0 ,优先级

U0CSR |= 0x80; //UART 方式
U0GCR |= 11; //U0GCR 与 U0BAUD 配合
U0BAUD |= 216; // 波特率设为 115200
UTX0IF = 0; //UART0 TX 中断标志清 0
U0CSR |= 0X40; //允许接收
URX0IE=1; //接收中断
EA=1; //开总中断


2.5参考代码(主要代码)

main.c

/**Includes*********************************************************************/
#include <ioCC2530.h>
#include "Uart.h"

/**宏定义***********************************************************************/
//定义数据类型
#define uint unsigned int
#define uchar unsigned char

#define LED1  P1_0    //P1_0连接LED1
#define LED2  P1_1    //P1_1连接LED2
#define LED3  P0_4    //P1_4连接LED3

/**函数声明*********************************************************************/
void Send_ReceicedData(void);
void Initial_IO(void);
void Delayms(uint xms);

/**全局变量*********************************************************************/
//定义待发送的数据
char Txdata0[]={"龙创科技欢迎您\n"}; //存放"龙创科技欢迎您"
char Txdata1[]={"This is a Uart test.\n"};
char Txdata2[]={"The data CC2530 has received is: \n"};
char Txdata3[]={"\r\n"};
char Rxdata = '\0';

/**
* @brief     主函数
* @param     None
* @retval    None
*/
void main(void)
{
SetSysClock();               //设置系统时钟为32MHz

InitUART();                  //调用初始化函数

Initial_IO();        //调用初始化函数

UartSend_String(Txdata0,sizeof("龙创科技欢迎您\n"));
Delayms(500);
UartSend_String(Txdata1,sizeof("This is a Uart test.\n"));

while(1)
{
Send_ReceicedData();
}

}

/**
* @brief     USART接收中断
* @param     None
* @retval    None
*/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
Rxdata = U0DBUF;   //接收数据并存于Rxdata

URX0IF = 0;    // 清中断标志
}

/**
* @brief     将接收到的数据发回给电脑
* @param     None
* @retval    None
*/
void Send_ReceicedData(void)
{
if ( Rxdata != '\0' )
{
UartSend_String(Txdata2,sizeof("The data CC2530 has received is: ")); //提示接收到数据
Send_char(Rxdata);
UartSend_String(Txdata3,sizeof("\n"));

if (Rxdata=='1')
{
LED1=0;
Delayms(500);
LED1=1;
}

if (Rxdata=='2')
{
LED2=0;
Delayms(500);
LED2=1;
}

if (Rxdata=='3')
{
LED3=0;
Delayms(500);
LED3=1;
}

Rxdata='\0';

}

}
/**
* @brief     IO初始化函数
* @param     None
* @retval    None
*/
void Initial_IO(void)
{
P1DIR |= 0xff;     //P1为输出
P0DIR |= 0xff;
}

/**
* @brief     普通延时函数
* @param     xms 延时长度
* @retval    None
*/
void Delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}


Uart.c

#include "Uart.h"
#define uint unsigned int
#define uchar unsigned char

/**************************************************
//CC2530串口初始化配置
***************************************************/
void InitUART(void)
{
PERCFG = 0x00;          //位置1 P0口
P0SEL = 0x0c;           //P0_2,P0_3 用作串口,第二功能
P2DIR &= ~0XC0;         //P0 优先作为UART0 ,优先级
U0CSR |= 0x80;          //UART 方式
U0GCR |= 11;            //U0GCR与U0BAUD配合
U0BAUD |= 216;          //波特率设为115200
UTX0IF = 0;             //UART0 TX 中断标志清0
U0CSR |= 0X40;          //允许接收
URX0IE=1;               //接收中断
EA=1;                   //开总中断,
}
/**************************************************
函 数 名  : Send_char
功能描述  :电脑向串口发送字节
输入参数  : c---所要发送的数据
***************************************************/
void Send_char(uchar c)
{
U0DBUF = c;
while(UTX0IF == 0);   //发送完成标志位
UTX0IF = 0;
}
/**************************************************
函 数 名  : UartSend_String
功能描述  :电脑向串口发送字符串
输入参数  : *Data---字符串首地址
len---字符串长度
***************************************************/
void UartSend_String(char *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
//U0DBUF = *Data++;
//while(UTX0IF == 0);
//UTX0IF = 0;
Send_char(*Data++);
}
}
/**************************************************
函 数 名  : SetSysClock
功能描述  : 设置系统时钟为32MHz
***************************************************/
void SetSysClock(void)
{
CLKCONCMD &= ~0x40;           //选择系统时钟源为外部32MHz crystal oscillator
while(CLKCONSTA & 0x40);      //等待晶振稳定为32MHz
CLKCONCMD &= ~0x47;           //设置系统主时钟频率为32MHZ
}


注意: char Txdata2[]={“The data CC2530 has received is: \n”};必须加”\n”否则不能输出收到的数据。这是因为Txdata2为一个字符串如果没有结束标志,是不会输出的,需要加结束标志。想更深入了解可以参看相关C语言知识。

2.6实验现象

编译下载程序到开发板上,打开串口调试助手,配置相关参数(注意是按字符格式发送哦)。



图3串口配置

用户在串口调试助手上以字符格式发送 1、2 或者 3 时,可分别看到 LED1、LED2 或者 LED3 闪烁一下,而且串口调试助手还好将接收到的数据打印出来。



图4串口信息

本章参考代码

点击进入
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: