0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CC2530 串口配置步骤

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2023-07-06 14:42 次阅读

一、并行通信与串行通信

微控制器与外设之间的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。

并行通信:指数据的各位同时发送或接收,每个数据位使用单独的一条导线。传输速度快、效率高,但需要的数据线较多,成本高。

串行通信:指数据一位接一位地顺 序发送或接收。需要的数据线少,成本低,但传输速度慢,效率低。

二、CC2530的串口通信模块

CC2530有两个串行通信接口USART0和USART1,它们能够分别运行于异步UART模式或者同步SPI模式。

两个USART接口具有相同的功能,通过PERCFG寄存器可以设置两个USART接口对应外部I/O引脚的映射关系:

位置1:RX0 --- P0_2 TX0 --- P0_3 RX1 --- P0_5 TX1 --- P0_4

位置2:RX0 --- P1_4 TX0 --- P1_5 RX1 --- P1_7 TX1 --- P1_6

对每个USART串口通信编程,本质是设置相关的5个寄存器:

<1> UxCSR: USARTx的控制和状态寄存器。

<2> UxUCR: USARTx的UART控制寄存器。

<3> UxGCR: USARTx的通用控制寄存器。

<4> UxDBUF:USARTx的接收/发送数据缓冲寄存器。

<4> UxBAUD:USARTx的波特率控制寄存器。

三、UART口与计算机的COM口连接

先认识两种电平:TTL电平和RS232电平。

TTL电平: 逻辑0----小于0.8V 逻辑1----大于2.4V。

RS232电平: 逻辑0----5 15V 逻辑1---- -5 -15V。

计算机的串行通信接口是RS-232的标准接口,而CC2530单片机的UART接口则是TTL电平,两者的电气规范不一致,所以要完成两者之间的数据通信,就需要借助接口芯片在两者之间进行电平转换,常用的有MAX232芯片。

img

注意:DB9接口中,公头和母头的排列顺序是不同的。

四、原理图数据手册分析

img

img

img

img

配置串口的步骤

img

img

img

img

五、代码示例

(1) 示例1: 编写串口初始化函数,实现串口字符串发送 (CPU频率在32MHZ下,波特率的为115200)

#include < ioCC2530.h >
 #include < string.h >//定义LED灯的端口
 #define LED1 P1_2
 #define LED2 P1_3//定义KEY按键的端口
 #define KEY1 P1_0       //定义按键为P1_0口控制
 #define KEY2 P1_1       //定义按键为P1_1口控制/*
 函数功能:LED灯IO口初始化
 硬件连接:LED1-- >P1_2 , LED2-- >P1_3
 */
 void LED_Init(void)
 {
     P1DIR |=0x3< < 2;  //配置P1_2、P1_3为输出模式
     LED1 = 1;
     LED2 = 1;
 }
 ​
 /*
 函数功能:按键IO口初始化
 硬件连接:KEY1-- >P1_0  KEY2-- >P1_1  
 */
 void KEY_Init(void)
 {
     P1SEL&=~(0x3< < 0); //配置P1_0,P1_1处于通用GPIO口模式
     P1DIR&=~(0x3< < 0); //配置P1_0,P1_1为输入模式
     P1INP|= 0x3< < 0;   //上拉   
 }
 ​
 ​
 void delay10ms(void)   //误差 0us
 {
     unsigned char a,b,c;
     for(c=193;c >0;c--)
         for(b=118;b >0;b--)
             for(a=2;a >0;a--);
 }
 ​
 ​
 /*
 函数功能:按键扫描
 返 回 值:按下的按键值
 */
 unsigned char Key_Scan(void)
 {
     static unsigned char stat=1;
     if((KEY1==0||KEY2==0)&&stat)
     {
        stat=0;
        delay10ms();
        if(KEY1==0)return 1;
        if(KEY2==0)return 2;
     }
     else
     {
         if(KEY1&&KEY2)stat=1;
     }
     return 0;
 }
 ​
 /*
 函数功能:串口0初始化
 */
 void Init_Uart0(void)
 {
   PERCFG&=~(1< < 0);  //串口0的引脚映射到位置1,即P0_2和P0_3
   P0SEL|=0x3< < 2;   //将P0_2和P0_3端口设置成外设功能
   U0BAUD = 216;     //32MHz的系统时钟产生115200BPS的波特率
   U0GCR&=~(0x1F< < 0);//清空波特率指数
   U0GCR|=11< < 0;      //32MHz的系统时钟产生115200BPS的波特率
   U0UCR |= 0x80;    //禁止流控,8位数据,清除缓冲器
   U0CSR |= 0x3< < 6;  //选择UART模式,使能接收器
 }
 ​
 ​
 /*
 函数功能:UART0发送字符串函数
 */
 void UR0SendString(char *str,unsigned int len)
 {
   int j;
   for(j=0;j< len;j++)
   {
     U0DBUF = *str++;    //将要发送的1字节数据写入U0DBUF
     while(UTX0IF == 0);//等待数据发送完成
     UTX0IF = 0;       //清除发送完成标志,准备下一次发送
   }
 }
 ​
 /****************************************** 
  * 函数描述:32M系统时钟下的毫秒延时函数 
  ******************************************/  
 void Delay_ms(unsigned int ms)  
 {  
   unsigned int i,j;  
   for(i = 0; i < ms; i++)  
   {  
     for(j = 0;j < 1774; j++);  
   }  
 }  
 ​
 ​
 /*主函数*/
 void main(void)
 {
     char buff[]="-----万邦易嵌嵌入式开发-----\\r\\n";
     unsigned char key;
     CLKCONCMD &= ~0x40;            //设置系统时钟源为32MHz晶振  
     for(; CLKCONSTA & 0x40;);      //等待晶振稳定  
     CLKCONCMD &= ~0X47;            //设置系统主时钟频率为32MHz  
   
     LED_Init();//初始化LED灯控制IO口
     KEY_Init();//按键初始化
     Init_Uart0();        //初始化串口0
     while(1)          
     {  
        key=Key_Scan();
        if(key)
        {
           //先发送一个字符串,测试串口0数据传输是否正确
           UR0SendString(buff,strlen(buff));     
           LED2 = !LED2;
        }       
     }
 }
 ​
 ​

(2)示例2: 编写串口初始化函数,实现串口字符串发送 (CPU频率在16MHZ下,波特率为115200)

#include < ioCC2530.h >
 #include < string.h >//定义LED灯的端口
 #define LED1 P1_2
 #define LED2 P1_3//定义KEY按键的端口
 #define KEY1 P1_0       //定义按键为P1_0口控制
 #define KEY2 P1_1       //定义按键为P1_1口控制/*
 函数功能:LED灯IO口初始化
 硬件连接:LED1-- >P1_2 , LED2-- >P1_3
 */
 void LED_Init(void)
 {
     P1DIR |=0x3< < 2;  //配置P1_2、P1_3为输出模式
     LED1 = 1;
     LED2 = 1;
 }
 ​
 /*
 函数功能:按键IO口初始化
 硬件连接:KEY1-- >P1_0  KEY2-- >P1_1  
 */
 void KEY_Init(void)
 {
     P1SEL&=~(0x3< < 0); //配置P1_0,P1_1处于通用GPIO口模式
     P1DIR&=~(0x3< < 0); //配置P1_0,P1_1为输入模式
     P1INP|= 0x3< < 0;   //上拉   
 }
 ​
 ​
 void delay10ms(void)   //误差 0us
 {
     unsigned char a,b,c;
     for(c=193;c >0;c--)
         for(b=118;b >0;b--)
             for(a=2;a >0;a--);
 }
 ​
 ​
 /*
 函数功能:按键扫描
 返 回 值:按下的按键值
 */
 unsigned char Key_Scan(void)
 {
     static unsigned char stat=1;
     if((KEY1==0||KEY2==0)&&stat)
     {
        stat=0;
        delay10ms();
        if(KEY1==0)return 1;
        if(KEY2==0)return 2;
     }
     else
     {
         if(KEY1&&KEY2)stat=1;
     }
     return 0;
 }
 ​
 /*
 函数功能:串口0初始化
 */
 void Init_Uart0(void)
 {
   PERCFG&=~(1< < 0);  //串口0的引脚映射到位置1,即P0_2和P0_3
   P0SEL|=0x3< < 2;   //将P0_2和P0_3端口设置成外设功能
   U0BAUD = 216;     //16MHz的系统时钟产生115200BPS的波特率
   U0GCR&=~(0x1F< < 0);//清空波特率指数
   U0GCR|=12< < 0;      //16MHz的系统时钟产生115200BPS的波特率
   U0UCR |= 0x80;    //禁止流控,8位数据,清除缓冲器
   U0CSR |= 0x3< < 6;  //选择UART模式,使能接收器
 }
 ​
 ​
 /*
 函数功能:UART0发送字符串函数
 */
 void UR0SendString(char *str,unsigned int len)
 {
   int j;
   for(j=0;j< len;j++)
   {
     U0DBUF = *str++;    //将要发送的1字节数据写入U0DBUF
     while(UTX0IF == 0);//等待数据发送完成
     UTX0IF = 0;       //清除发送完成标志,准备下一次发送
   }
 }
 ​
 /****************************************** 
  * 函数描述:32M系统时钟下的毫秒延时函数 
  ******************************************/  
 void Delay_ms(unsigned int ms)  
 {  
   unsigned int i,j;  
   for(i = 0; i < ms; i++)  
   {  
     for(j = 0;j < 1774; j++);  
   }  
 }  
 ​
 ​
 /*主函数*/
 void main(void)
 {
     char buff[]="-----万邦易嵌嵌入式开发-----\\r\\n";
     unsigned char key;
     LED_Init();//初始化LED灯控制IO口
     KEY_Init();//按键初始化
     Init_Uart0();        //初始化串口0
     while(1)          
     {  
        key=Key_Scan();
        if(key)
        {
           //先发送一个字符串,测试串口0数据传输是否正确
           UR0SendString(buff,strlen(buff));     
           LED2 = !LED2;
        }       
     }
 }
 ​
 ​

(3)示例3:中断接收

#include < ioCC2530.h >
 #include < string.h >//定义LED灯的端口
 #define LED1 P1_2
 #define LED2 P1_3//定义KEY按键的端口
 #define KEY1 P1_0       //定义按键为P1_0口控制
 #define KEY2 P1_1       //定义按键为P1_1口控制unsigned char dataRecv;
 unsigned char Flag = 0;
 ​
 /*
 函数功能:LED灯IO口初始化
 硬件连接:LED1-- >P1_2 , LED2-- >P1_3
 */
 void LED_Init(void)
 {
     P1DIR |=0x3< < 2;  //配置P1_2、P1_3为输出模式
     LED1 = 1;
     LED2 = 1;
 }
 ​
 /*
 函数功能:按键IO口初始化
 硬件连接:KEY1-- >P1_0  KEY2-- >P1_1  
 */
 void KEY_Init(void)
 {
     P1SEL&=~(0x3< < 0); //配置P1_0,P1_1处于通用GPIO口模式
     P1DIR&=~(0x3< < 0); //配置P1_0,P1_1为输入模式
     P1INP|= 0x3< < 0;   //上拉   
 }
 ​
 ​
 void delay10ms(void)   //误差 0us
 {
     unsigned char a,b,c;
     for(c=193;c >0;c--)
         for(b=118;b >0;b--)
             for(a=2;a >0;a--);
 }
 ​
 ​
 /*
 函数功能:按键扫描
 返 回 值:按下的按键值
 */
 unsigned char Key_Scan(void)
 {
     static unsigned char stat=1;
     if((KEY1==0||KEY2==0)&&stat)
     {
        stat=0;
        delay10ms();
        if(KEY1==0)return 1;
        if(KEY2==0)return 2;
     }
     else
     {
         if(KEY1&&KEY2)stat=1;
     }
     return 0;
 }
 ​
 /*
 函数功能:串口0初始化
 */
 void Init_Uart0(void)
 {
   PERCFG&=~(1< < 0);  //串口0的引脚映射到位置1,即P0_2和P0_3
   P0SEL|=0x3< < 2;   //将P0_2和P0_3端口设置成外设功能
   U0BAUD = 216;     //16MHz的系统时钟产生115200BPS的波特率
   U0GCR&=~(0x1F< < 0);//清空波特率指数
   U0GCR|=12< < 0;      //16MHz的系统时钟产生115200BPS的波特率
   U0UCR |= 0x80;    //禁止流控,8位数据,清除缓冲器
   U0CSR |= 0x3< < 6;  //选择UART模式,使能接收器
   UTX0IF = 0;       //清除TX发送中断标志
   URX0IF = 0;       //清除RX接收中断标志
   URX0IE = 1;       //使能URAT0的接收中断
   EA = 1;           //使能总中断
 }
 ​
 ​
 ​
 /*
 函数功能:UART0发送字符串函数
 */
 void UR0SendString(char *str,unsigned int len)
 {
   int j;
   for(j=0;j< len;j++)
   {
     U0DBUF = *str++;    //将要发送的1字节数据写入U0DBUF
     while(UTX0IF == 0);//等待数据发送完成
     UTX0IF = 0;       //清除发送完成标志,准备下一次发送
   }
 }
 ​
 /*================UR0接收中断服务函数================*/
 #pragma vector = URX0_VECTOR
 __interrupt void UART0_RecvInterrupt()
 {
   URX0IF = 0;           //清除RX接收中断标志
   dataRecv =  U0DBUF;   //将数据从接收缓冲区读出
   Flag = 1;             //设置接收指令标志
 }
 ​
 ​
 /*================执行上位机的指令=================*/
 void ExecuteTheOrder()
 {
   Flag = 0 ;            //清除接收指令标志
   switch(dataRecv)
   {
     case 'A':
       UR0SendString("选择1!\\r\\n",9);
       break;
     case 'B':
       UR0SendString("选择2!\\r\\n",9);
       break;
     case 'C':
       UR0SendString("选择3!\\r\\n",9);
       break;
     case 'D':
       UR0SendString("选择4!\\r\\n",9);
       break;
   }
 }
 ​
 ​
 /*主函数*/
 void main(void)
 {
     char buff[]="-----嵌入式开发-----\\r\\n";
     unsigned char key;
     LED_Init();//初始化LED灯控制IO口
     KEY_Init();//按键初始化
     Init_Uart0();        //初始化串口0
     while(1)          
     {
        key=Key_Scan();
        if(key)
        {
           //先发送一个字符串,测试串口0数据传输是否正确
           UR0SendString(buff,strlen(buff));     
           LED2 = !LED2;
        }
       
       if(Flag == 1)      //查询是否收到上位机指令
       {
         ExecuteTheOrder();
       }
     }
 }
 ​
 ​
 ​

六、波特率计算

计算波特率

CC2530的波特率由BAUD_E和BAUD_M共同决定:

img

F为微控制器的系统时钟频率:16MHz或32MHz。

TI公司提供的数据手册中,给出了32MHz系统时钟下各常用波特率的参数值,由计算公式亦不难得出16MHz系统时钟下对应的参数值。

img

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6812

    浏览量

    147662
  • 串口通信
    +关注

    关注

    32

    文章

    1578

    浏览量

    54870
  • CC2530
    +关注

    关注

    19

    文章

    220

    浏览量

    57226
  • 串口配置
    +关注

    关注

    0

    文章

    5

    浏览量

    1546
收藏 人收藏

    评论

    相关推荐

    CC2530 GPIO口输入配置配置步骤

    介绍CC2530 GPIO口输入配置配置
    的头像 发表于 07-06 14:40 1510次阅读
    <b class='flag-5'>CC2530</b> GPIO口输入<b class='flag-5'>配置</b><b class='flag-5'>配置</b><b class='flag-5'>步骤</b>

    CC2530 外部中断配置步骤

    介绍CC2530 外部中断配置步骤
    的头像 发表于 07-06 14:41 1713次阅读
    <b class='flag-5'>CC2530</b> 外部中断<b class='flag-5'>配置</b><b class='flag-5'>步骤</b>

    Cc2530

    CC2530
    三分温柔
    发布于 :2022年05月31日 21:12:52

    CC2530的时钟配置概述

    二、CC2530的时钟配置概述CC2530同样也有两个时钟,一个是高频时钟信号给CPU使用,另一个低频时钟信号给看门狗,睡眠定时器等使用;相对应的高速时钟CC2530片内有一个16MH
    发表于 01-19 07:01

    CC2530应用电路

    CC2530应用电路 Component Description Va
    发表于 06-29 08:09 5296次阅读
    <b class='flag-5'>CC2530</b>应用电路

    基于CC2530的SDHC卡读写设计

    提出了将SDHC卡作为CC2530的外部存储设备实现数据存储的方法。SDHC卡具有体积小、存储容量大的特点,通过CC2530组建的无线传感网络适用于工业监测,而将SDHC卡与CC2530相结合
    发表于 05-02 14:28 3432次阅读
    基于<b class='flag-5'>CC2530</b>的SDHC卡读写设计

    cc2530底板

    CC2530的核心板原理图和详细底板的PCB,包括重要外设的PCB
    发表于 06-20 17:48 0次下载

    cc2530程序设计实例之CC2530 RF部分使用—实现点对点收发

    本文主要介绍了cc2530程序设计实例之CC2530 RF部分使用—实现点对点收发,通过串口调试助手发送字节数据。例如通过串口向设备A发送HelloCC
    发表于 12-09 12:22 2.1w次阅读
    <b class='flag-5'>cc2530</b>程序设计实例之<b class='flag-5'>CC2530</b> RF部分使用—实现点对点收发

    关于12.AD采集cc2530温度串口显示

    通过实验掌握CC2530芯片串口配置与使用;采集内部温度传感器信息通过串口发送到上位机;观察TX指示灯。
    发表于 08-06 08:00 10次下载
    关于12.AD采集<b class='flag-5'>cc2530</b>温度<b class='flag-5'>串口</b>显示

    CC2530芯片的基本特性和CC2530无线模块的设计

    本文介绍了CC2530芯片的基本特性,论述了以CC2530芯片为核心的无线通信模块的硬件设计和调试软件设计,在介绍设计规范和模块结构的基础上,采用TI公司的CC2530芯片作为主控制芯片设计出具
    发表于 02-11 08:00 96次下载
    <b class='flag-5'>CC2530</b>芯片的基本特性和<b class='flag-5'>CC2530</b>无线模块的设计

    使用CC2530芯片点亮LED的资料和程序免费下载

    CC2530芯片使用51增强型的内核,跟51单片机还是有一些区别的,例如:51单片机不需要对IO口进行配置,而cc2530芯片却需要对IO口进行配置,才能对它进行赋值。
    发表于 07-30 17:35 4次下载
    使用<b class='flag-5'>CC2530</b>芯片点亮LED的资料和程序免费下载

    CC2530控制LED闪烁

    CC2530控制LED闪烁CC2530 控制LED闪烁电路图知识点CC2530有两个高频时钟输入输出配置程序及注释CC2530 控制LED闪
    发表于 11-29 18:51 15次下载
    <b class='flag-5'>CC2530</b>控制LED闪烁

    CC2530定时器3

    LED1的亮灭周期为2s。文章目录CC2530用定时器3完成对LED1周期为2s控制前言一、定时器3和定时器1哪些不同?二、使用步骤1.配置LED12.配置定时器33.完成中断函数三、
    发表于 11-29 18:51 9次下载
    <b class='flag-5'>CC2530</b>定时器3

    CC2530中文数据手册下载

    CC2530中文数据手册下载
    发表于 01-14 10:57 19次下载

    CC2530无线通信模块使用串口通信参考方法

    CC2530无线通信模块使用串口通信参考方法
    发表于 04-24 17:20 13次下载