最近在用CC2530学习ZigBee协议栈,先在裸机上写了一个通过M3650B-HA高频读写模块读取卡ID并且通过串口发送到2530,2530再通过串口中断收数的数据,M3650B-HA高频读写模块是主动i模式,通过查询手册可知返回的数据长度是12个字节,第5-10字节是卡的ID号,最后一个字节是校验和(异或取非校验),图如下:
接着,就开始写程序吧!
/*************************************
**程序功能:串口收数
**
**串口数据输入:P0_2
*************************************/
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
uchar num[50];
uint i = 0, flag = 0;
/*********函数申明*********/
void Delayms(uint xms);
void uart0_init();
void setSysClk();
/********* 主函数 ********/
void main()
{
setSysClk(); //系统时钟初始化
uart0_init(); //串口初始化
while(1)
{
if(flag==1)
{
//i = 0;
//此处用户可以添加自定义代码
}
}
}
void setSysClk()
{
CLKCONCMD&=0XBF; //设置系统时钟为32MHz
Delayms(1);
CLKCONCMD&=0XC0;
Delayms(1);
}
void uart0_init()
{
PERCFG =0x00; // UART0选择位置0 TX@P0.3 RX@P0.2
P0SEL|=0x0C; // P0.3 P0.2选择外设功能
U0CSR|=0xC0; // UART模式接收器使能
U0UCR|=0X00; //无奇偶校验,1位停止位
U0GCR|=8; //查表获得 U0GCR和 U0BAUD
U0BAUD =59; // 波特率9600
UTX0IF =0;
URX0IE =1; //使能接收中断 IEN0@BIT2
IEN0 |=0x04;
EA = 1; //开总中断
}
/********毫秒延时函数**********/
//串口每发送完八位(一个字节)就进入此中断,要收完一次数据,需要进入八次中断,应注意此细节
void Delayms(uint xms) //i=xms 即延时i毫秒
{
uint i,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}
/*******中断处理函数**********/
#pragma vector=URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF =0; //清除接收中断标志
num[i++] = U0DBUF;//接受数据
if(i==1)
{
flag = 1;
}
}