📄 main.c
字号:
/**************************************************************************************************/
#include "msp430x22x4.h"
#include "hardware.h"
#include "cc2500.h"
#include "timer.h"
#include "uart.h"
#include "spi.h"
/**************************************************************************************************/
/* 变量定义 */
/**************************************************************************************************/
extern unsigned char paTable[];
extern unsigned char paTableLen;
unsigned char txBuffer[4],rxBuffer[4];
unsigned char uartbuf[3]="#";
/******阅读器数据数据格式定义******/
extern unsigned char Connected =0; //是否已经建立连接
extern unsigned char ReActive = 0; //是否重新激活标签
const unsigned char Active = 0xA5; //激活命令
const unsigned char Query = 0xAA; //询问命令
const unsigned char Kill = 0x5A; //灭活命令
const unsigned char AckQuery = 0x55; //询问回复
const unsigned char AckKill = 0xEF; //没活回复
const unsigned char ActiveChannel = 64; //激活信道
const unsigned char KillChannel = 64; //灭活信道
const unsigned char LenActive = 1; //长度:激活命令
const unsigned char LenQuery = 1; //长度:询问命令
const unsigned char LenKill = 3; //长度:灭活命令+标签号码
const unsigned char LenAckQuery =3; //长度:询问回复+标签号码
const unsigned char LenAckKill =3; //长度:没活回复+标签号码
void delay(unsigned int);
/**************************************************************************************************
**函数名称:void main (void)
**入口参数:无
**出口参数:无
**功能描述:主循环函数
**************************************************************************************************/
void main (void)
{
unsigned char i;
unsigned char len=4;
unsigned char n=0;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset
BCSCTL1 = CALBC1_8MHZ; // 设置 DCO 为8MHz
DCOCTL = CALDCO_8MHZ;
IFG1 &= ~OFIFG; // 清除晶振失效标志
P1DIR |= 0x71; // GDO2,,CS,SI,CLK,SO,GDO0,LED
TI_CC_SPISetup(); // 初始化 SPI 接口
TI_CC_PowerupResetCCxxxx(); // 复位 CC2500
writeRFSettings(); // 写配置寄存器
TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, paTable, paTableLen);
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE);
InitWDTTimer();
InitUart();
_EINT();
LED_OFF;
while(!Connected);//等待建立连接
while(1)
{
while(!ReActive)//循环查询所有信道,收到重新激活命令将退出该循环
{
SwitchChannel(n);//切换信道
txBuffer[0] = LenQuery;
txBuffer[1] = Query;
RFSendPacket(txBuffer,(LenQuery+1));//查询该信道是否有标签
if (RFReceivePacket(&rxBuffer[0],&len))
{
if(rxBuffer[0] == AckQuery)//收到标签信息?
{
LED_ON;
txBuffer[0] = LenKill;
txBuffer[1] = Kill;
txBuffer[2] = rxBuffer[1];
txBuffer[3] = rxBuffer[2];
RFSendPacket(txBuffer,(LenKill+1));//灭活该标签
if (RFReceivePacket(&rxBuffer[0],&len))
{
if(rxBuffer[0] == AckKill)//收到标签信息?
{
if((rxBuffer[1] == txBuffer[2]) && (rxBuffer[2] == txBuffer[3]));
{
uartbuf[1] = rxBuffer[1];
uartbuf[2] = rxBuffer[2];
SendUart(uartbuf,3);
LED_OFF;
}
}
}
}
}
n++;
if(n>=64)//64个信道扫描完毕?
{ n=0;
}
}//end of while(!ReActive)
SwitchChannel(ActiveChannel);//切换到激活信道
txBuffer[0] = LenActive;
txBuffer[1] = Active;
for(i=0;i<3;i++)
RFSendPacket(txBuffer,(LenActive+1));//此时工作在激活信道激活所有标签
ReActive = 0; //关闭重新激活标志,该标志将在串口中断收到相应的命令后置位
}//end of while(1)
}
void delay(unsigned int i)
{
unsigned int j,k;
for(j=0;j<i;j++)
for(k=0;k<65000;k++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -