CC2530 串口通讯实验
实验内容
- 在电脑端通过串口控制LED模块上LED3的亮灭。
实验目的
- 了解串口工作原理;
- 了解无线传感网络数据传输的过程。
实验环境
实验所需硬件
序号 | 名称 | 数量 | 备注 |
---|---|---|---|
1 | 电脑 | 1台 | 系统Windows7及以上 |
2 | CC2530底座模块 | 1个 | · |
3 | LED模块 | 1个 | · |
4 | CC Debugger 仿真器和连接线 | 1套 | · |
5 | USB线 | 1根 | · |
6 | USB转TTL模块 | 1个 | · |
7 | 杜邦线(母) | 3根 | · |
8 | 串口通信实验代码 | 1份 | · |
实验所需软件
- IAR 驱动安装步骤
- CC Debugger 驱动安装步骤
- Git软件下载(可选)
CC2530底座 & LED模块 & CC Debugger 仿真器和连接线
USB线
USB转TTL模块
实验要求
- 理解串口的工作原理;
- 掌握本次实验串口相关的寄存器的功能和配置方法;
- 实现CC2530和计算机的串口通信。
实验原理
串口介绍
UART0对应的外部设备IO引脚关系为:P0_2——RX,P0_3——TX。
UART1对应的外部设备IO引脚关系为:P0_5——RX,P0_4——TX。
在CC2530中,USART0和USART1是串行通信接口,它们能够分别运行于异步USART模式或者同步SPI模式。两个USART的功能是一样的,可以通过设置在单独的IO引脚上。
USART 模式的操作具有下列特点(在本次实验中,我们用到的是 UART0):
- 8位或者9位负载数据;
- 奇校验、偶校验或者无奇偶校验;
- 配置起始位和停止位电平;
- 配置LSB或者MSB首先传送;
- 独立收发中断;
- 独立收发DMA触发。
CC2530配置串口的一般步骤:
- 配置IO,使用外部设备功能。此处配置P0_2和P0_3用作串口UART0;
- 配置相应串口的控制和状态寄存器。此处配置UART0的工作寄存器;
-
配置串口工作的波特率。此处配置为波特率为115200;串口的波特率设置可以从 CC2530的
datasheet
中查得波特率由下式求得,具体波特率设置见表; -
本次实验串口相关的寄存器或者标志位有:
U0CSR
、U0GCR
、U0BAUD
、U0DBUF
、UTX0IF
。各寄存器功能如下表所示:
寄存器具体配置如下:
PERCFG = 0x00;//串口0的引脚映射到位置1,即P0_2和P0_3
P0SEL = 0x0C;//将P0_2和P0_3端口设置成外设功能
U0BAUD = 216;//16MHz的系统时钟产生115200BPS的波特率
U0GCR = 11;
U0UCR |= 0x80;//禁止流控,8位数据,清除缓冲器
U0CSR |= 0xC0;//选择UART模式,使能接收器
UTX0IF = 0;//清除TX发送中断标志
URX0IF = 0;//清除RX接收中断标志
URX0IE = 1;//使能URAT0的接收中断
EA = 1;//使能总中断
实验步骤
① 用杜邦线连接底座与USB转TTL模块,USB转TTL模块的TXD、RXD、GND分别连接到底座的RXD0/P0.2、TXD0/P0.3、GND。如下图:
② CC2530底座模块安装LED模块,用CC Debugger连接底座与计算机:
③ 轻按CCDebugger复位按键,指示灯变绿,表示连接正常。如下图:
④ 访问github,进入github界面后点击Code,Clone HTTPS安全链接,如下图所示:
⑤ 打开电脑终端,进入工作目录workspace (workspace 为工程文件夹所在目录):
$ cd workspace
⑥ 运行clone
命令:
git clone https://github.com/aiotcom/eps.git
下载目录至指定文件夹下。
如果提示“command not found”表示电脑没有安装Git,请至Git官网下载。
如果电脑没有安装 Git 软件,也可以进入Github,点击 Code
-> DownLoad ZIP
下载所有工程代码。如下图所示:
如果电脑没有公网,可以进:D盘\实验教程与代码选择相应的代码。
⑦ 打开 IAR Embedded Workbench
工程软件,点击工具栏: File
-> Open
-> Workspace
,选择工程文件:CC2530基础实验\6.串口通信\Usart.eww
并打开。
⑧ 点击Make
按钮,重新编译文件,显示没有错误。
⑨ 点击Download and Debug
按钮,将程序下载到模块中。
⑩ 点击X
退出仿真模式。
⑪ 移除CC Debugger
仿真器,采用USB线供电,并将USB转TTL模块连接到电脑。
⑫ 打开电脑端的串口调试助手,在串口号一栏中选择相应的COM口,设置参数如下,点击“打开”按钮开启串口工具,如下图所示:
⑬ USB线重新上电,串口调试助手显示如下图。
⑭ 取消以16进制发送。输入指令:LED3 on
,LED3亮起;输入:LED3 off
,LED3 熄灭,如下图:
代码讲解
① 程序目录结构,如下图。主要的工程文件是delay.c、Usart.c、LED.c、main.c。
② main.c:主函数main(),完成硬件的初始化,及整个代码逻辑控制,判断接收到相应的指令后,控制LED3的亮灭状态。
void main(void)
{
Hal_Init_32M();//初始化32M时钟
Init_Uart0();//初始化串口0,115200BPS的波特率
LED3_Init();//lED模块LED灯控制IO初始化
UR0SendString("LED3 on 点亮LED3\r\nLED3 off 熄灭LED3");
while(1)
{
if(UART0_RxCnt)
{
delay_ms(50);
if(strstr((void*)&USART0_RX_BUF[0],(char const*)"LED3 on")){
LED3_ON();
}
if(strstr((void*)&USART0_RX_BUF[0],(char const*)"LED3 off")){
LED3_OFF();
}
memset(USART0_RX_BUF,0,USART0_RX_SIZE);
UART0_RxCnt = 0;
}
}
}
③ UR0_RecvInt()为串口接收中断,每接收完成一个字节进入中断一次。
#pragma vector = URX0_VECTOR
__interrupt void UR0_RecvInt()
{
URX0IF = 0;//清除RX接收中断标志
USART0_RX_BUF[UART0_RxCnt++]=U0DBUF ;
if(UART0_RxCnt>(USART0_RX_SIZE-1)){
UART0_RxCnt = 0;
}
}
④ LED.c为LED驱动代码,本次实验调用LED3_Init()函数对LED3进行初始。LED3灯控制的IO进行初始化设置IO口输出模式。
void LED_Init(void)
{
P0DIR |= 0x0C;//P0.2、P0.3定义为输出
P1DIR |= 0xC0;//P1.6、P1.7定义为输出
LED_OFF();//初始化关闭LED灯
}
⑤ Usart.c为串口驱动,其中Init_Uart0()函数,对串口进行初始化,设置波特率,使用中断。
void Init_Uart0()
{
PERCFG = 0x00;//串口0的引脚映射到位置1,即P0_2和P0_3
P0SEL = 0x0C;//将P0_2和P0_3端口设置成外设功能
U0BAUD = 216;//32MHz的系统时钟产生115200BPS的波特率
U0GCR = 11;
U0UCR |= 0x80;//禁止流控,8位数据,清除缓冲器
U0CSR |= 0xC0;//选择UART模式,使能接收器
UTX0IF = 0;//清除TX发送中断标志
URX0IF = 0;//清除RX接收中断标志
URX0IE = 1;//使能URAT0的接收中断
EA = 1;//使能总中断
memset(USART0_RX_BUF,0,USART0_RX_SIZE);
}
常见问题
-
弹出警告窗口,不能下载程序。
- 请确认CCDebugger驱动否安装。
- 轻按CCDebugger仿真器的按键,指示灯不是绿色连接有问题。
- CCDebugger仿真器是否正常接入到底座,参考实验步骤第一步。
-
下载代码后程序没观察到实验现象。
- 请重新上电,或者按下底座上的复位按键。
- 模块没有安装稳妥。
实验思考
-
使用命令“turn on led3”、“turn on led3”控制LED3的状态。
-
在原代码基础,当接收、并执行命令后,向计算机返回当前灯的状态“灯己打开”、“灯己熄灭”。