完美解决CC2530 Zstack框架串口不可用的问题(HAL库)

   日期:2021-03-14     浏览:164    评论:0    
核心提示:CC2530是最为常用的ZigBee芯片之一。该芯片支持使用Zstack框架进行ZigBee的配置,用户无需了解ZigBee协议栈的内容,只需调用库函数即可进行ZigBee传输。然而该框架有一个巨大的BUG,就是HAL库函数中的串口收发(read、write函数)无法正常使用,导致CC2530无法收发UART信息。下面是解决方案一、CC2530的串口基本信息CC2530串口引脚:UART0对应的外部引脚关系,位置1:Rx - P0_2 Tx - P0_3 ;位置2:Rx - P1_4 Tx - P1

CC2530是最为常用的ZigBee芯片之一。该芯片支持使用Zstack框架进行ZigBee的配置,用户无需了解ZigBee协议栈的内容,只需调用库函数即可进行ZigBee传输。
然而该框架有一个巨大的BUG,就是HAL库函数中的串口收发(read、write函数)无法正常使用,导致CC2530无法收发UART信息。下面是解决方案

一、CC2530的串口基本信息

CC2530串口引脚:
UART0对应的外部引脚关系,位置1:Rx - P0_2 Tx - P0_3 ;位置2:Rx - P1_4 Tx - P1_5
UART1对应的外部引脚关系,位置1:Rx – P0_5 Tx – P0_4;位置2:Rx - P1_7 Tx - P1_6
UART波特率配置表格:

二、修复代码

本人使用的是UART0的位置一,其他位置可以参考自己修改
自己写一个UART配置文件myuart.c

#include "myuart.h"


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 |= 11;				
    U0BAUD |= 216;				//波特率设为115200
    UTX0IF = 1;                                 //UART0 TX中断标志初始置位1 
    
    U0CSR |= 0x40;				//允许接收
    IEN0 |= 0x84;				//开总中断,接收中断
}


void UartTX_Send_String(uchar *Data,int len)
{ 
  int j;
  for(j=0;j<len;j++)
  { 
    U0DBUF = *Data++;
    while(UTX0IF == 0);
    UTX0IF = 0;
  }
}

其头文件为myuart.h

#include <iocc2530.h>
#ifndef _MYUART_H_
#define _MYUART_H_
#define uint unsigned int
#define uchar unsigned char
void initUART0(void);
void InitialAD(void);
void UartTX_Send_String(uchar *Data,int len);
#endif

将这两个文件加入IAR工程中,在SampleApp.c中include刚刚的头文件。

在SampleApp_Init函数中加入

initUART0();

然后就会发现,UART可以传输数据了!HAL库中的HalUARTWrite也可以用了!

三、串口接收

刚刚只做到了UART发送信息,下面使用中断的方式接收串口信息。
在SampleApp.c中加入变量定义:

uchar temp = 0xff;//UART暂存字符
uchar read[50];//UART暂存数组
int cnt=0;//计数器

中断服务函数定义:


#pragma vector = URX0_VECTOR
 __interrupt void UART0_ISR(void)
 { 
 	URX0IF = 0;				//清中断标志
	temp = U0DBUF;
    read[cnt]=temp;
    cnt++;
    temp = 0xff;//这里假定0xff为无意义字符
 }

这样就可以正常接收UART信息了。收到的字符会暂存在read数组里面,可以用

HalUARTWrite(0, read, cnt);
cnt=0;

来进行测试,查看收到的字符

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服