CC2530 串口收发字符串
1.实验目的
1) 通过实验掌握 CC2530 芯片串口配置与使用
2) 收到 PC 发送过来的数据,然后收到一整串数据之后,通过串口将改数据发送回去。
注:嵌入式开发中,当程序能跑起来后,串口是第一个要跑起来的设备,所有的工作状态, 交互信息都会从串口输出。我们用的是世界上最好的串口芯片 FT232,贵的 USB 串口线都用该芯 片。
2.实验设备
硬件:PC 机一台 ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:2000/XP/win7 系统,IAR 8.10 集成开发环境、串口助手
3.相关电路图
image.png注:图中 0R 的电阻是空贴的哦 P0_2、P0_3 配置为外设功能时:P0_2 为 RX, P0_3 为 TX. USART0 和 USART1 是串行通 信接口,它们能够分别运行于异步 UART 模式或者同步 SPI 模式。两个 USART 具有同样的功 能,可以设置在单独的 I/O 引脚。此种串口设计是没有流控功能的。
4.相关寄存器
相关寄存器 UxCSR、UxCSR、UxGCR、UxBUF、UxBAUD、CLKCONCMD、CLKCONSTA
image.png image.png image.png
由寄存器UxBAUD.BAUD_M[7:0]和UxGCR.BAUD_E[4:0]定义波特率。
该波特率用于
UART 传送,也用于SPI 传送的串行时钟速率。波特率由下式给出:
32 MHz 系统时钟常用的波特率设置
image.png
CC2530 配置串口的一般步骤:
1、配置 IO,使用外部设备功能。此处配置 P0_2 和 P0_3 用作串口 UART0
2、配置相应串口的控制和状态寄存器。
3、配置串口工作的波特率。
由于此实验增加了串口接收功能,寄存器有所改变(红色部分),具体配置如下:
PERCFG = 0x00; //位置1 P0 口
P0SEL = 0x0c; //P0_2,P0_3用作串口(外部设备功能)0000 1100
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //设置为UART方式 1000 0000
U0GCR |= 8; //BAUD_E
U0BAUD |= 59; //波特率设为9600 根据上面表中获得的数据
UTX0IF = 0; //UART0 TX 中断标志初始置位0
U0CSR |= 0x40; //允许接收 0100 0000
IEN0 |= 0x84; //开总中断允许接收中断
5.源码分析
#include <iocc2530.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define LED1 P1_0
#define LED2 P1_1
#define LED3 P0_4
void initUART0(void);
void InitialAD(void);
void UartTX_Send_String(uchar *Data,int len);
uchar Recdata[30]="hello zigbee!\r\n";
uchar RXTXflag = 1;
uchar temp;
uint datanumber = 0;
uint stringlen;
/****************************************************************
串口发送字符串函数
****************************************************************/
void UartTX_Send_String(uchar *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
/****************************************************************
初始化串口0函数
****************************************************************/
void initUART0(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x0c; //P0用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //串口设置为UART方式
U0GCR |= 8;
U0BAUD |= 59; //波特率设为9600
UTX0IF = 1; //UART0 TX中断标志初始置位1
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
P1DIR = 0x03; //P1控制LED
LED1 = 1;
LED2 = 1; //关LED
LED3 = 1;
initUART0();
stringlen = strlen((char *)Recdata);
UartTX_Send_String(Recdata,stringlen);
while(1)
{
if(RXTXflag == 1) //接收状态
{
if( temp != 0)
{
LED2 = 0; //接收状态指示
if((temp!='#')&&(datanumber<50)) //’#‘被定义为结束字符,最多能接收50个字符
{
Recdata[datanumber++] = temp;
}
else
{
RXTXflag = 3; //进入发送状态
}
if(datanumber == 50)
RXTXflag = 3;
temp = 0;
}
}
if(RXTXflag == 3) //发送状态
{
UartTX_Send_String("send:",5);
LED1 = 0; //发送状态指示
U0CSR &= ~0x40; //不能收数
UartTX_Send_String(Recdata,datanumber);
UartTX_Send_String("\r\n",2);
U0CSR |= 0x40; //允许接收
RXTXflag = 1; //恢复到接收状态
datanumber = 0; //指针归0
LED1 = 1; //关发送指示
LED2 = 1;
memset(Recdata, 0, sizeof(Recdata));
}
}
}
/****************************************************************
串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp.
****************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; //清中断标志
temp = U0DBUF;
}
6、实验现象
COM4 是我的 USB 转串口在电脑上生成的,查看方法“我的电脑”->“设备管理器”,
如图:
image.png
把程序下到开发板上,同时把 USB 线接到 PC 上,PC 上的串口设置下图,在串口工具的发
送区写入要发送的字符并以 # 号结束,如“abcdefg#”,点发送,开发板收到后,会发送到串 口工具上。
开发板收到字符后 D2 会闪烁下,进入发送状态时 D1 灯会闪一下。