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份 ·

实验所需软件

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 中查得波特率由下式求得,具体波特率设置见表;

    实验硬件 波特率设置表

  • 本次实验串口相关的寄存器或者标志位有:U0CSRU0GCRU0BAUDU0DBUFUTX0IF。各寄存器功能如下表所示:

    寄存器设置说明

寄存器具体配置如下:

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模块连接到电脑。

采用USB线供电

⑫ 打开电脑端的串口调试助手,在串口号一栏中选择相应的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);
}

常见问题

  1. 弹出警告窗口,不能下载程序。

    • 请确认CCDebugger驱动否安装。
    • 轻按CCDebugger仿真器的按键,指示灯不是绿色连接有问题。
    • CCDebugger仿真器是否正常接入到底座,参考实验步骤第一步。
  2. 下载代码后程序没观察到实验现象。

    • 请重新上电,或者按下底座上的复位按键。
    • 模块没有安装稳妥。

实验思考

  1. 使用命令“turn on led3”、“turn on led3”控制LED3的状态。

  2. 在原代码基础,当接收、并执行命令后,向计算机返回当前灯的状态“灯己打开”、“灯己熄灭”。