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;
来进行测试,查看收到的字符