#include "config.h"#include "include.h"int main (void){V AR_Init(); //变量初始化IO_Init(); //引脚初始化TI_CC_SPISetup(); //SPI初始化TI_CC_PowerupResetCCxxxx(); // Reset CCxxxxwriteRFSettings(); // 写入无线模块配置寄存器TI_CC_SPIWriteBurstReg(TI_CCxxx0_PA TABLE, paTable, paTableLen);//写入能量控制寄存器UART0_Init(UART_BPS, set); // 串口初始化TC0_Init(); // 定时器0初始化VIC_Init(); // 中断初始化TI_CC_SPIStrobe(TI_CCxxx0_SFSTXON); //开启和校准频率合成器TI_CC_SPIStrobe(TI_CCxxx0_SRX); // 初始化模块为接收模式.// 数据包接收结束后,GDO0下降沿触发中断#ifdef WATCHDOGW ATCHDOG_Init(); //看门狗初始化#endifUART0_SendBufEx("-begin-",7);while (1){#ifdef WIRLTESTif(TimerSend_ID==1){TimerSend_ID=0;/* IO1CLR=IO1CLR|LED1;DelayNS(20);IO1SET=IO1SET|LED1;DelayNS(20);IO1CLR=IO1CLR|LED1;DelayNS(20);IO1SET=IO1SET|LED1;RcvBuf[0]=0x05; */ //从机地址RcvBuf[0]=0x05;for(i=1;i<16;i++){RFSendPacket((char*)RcvBuf,17);if(DeskDriver[i].allow10s==1){DeskDriver[i].allow10s=0; //开始限定时间,在限定时间内不接受按键DeskDriver[i].keyScaned=1; //接受按键,并置按下标志DeskDriver[i].timeCnt=0; //计数归零DeskDriver[i].enable=1; //开启允许无线发送DeskDriver[i].sendCount=0; //初始值0表示发送次数为0,发送一次加1DeskDriver[i].sendOK=0; //初始值0表示没发送成功}}}#endif //task1 接收完成,发送数据if(RCVCOMP_ID==1){IO1CLR=IO1CLR|LED1;DelayNS(20);IO1SET=IO1SET|LED1;DelayNS(20);IO1CLR=IO1CLR|LED1;DelayNS(20);IO1SET=IO1SET|LED1;RCVCOMP_ID=0;UART0_SendBuf();UART0_SendBufEx(RcvBuf,RCV_LEN1+2);RcvBuf[0]=0x05; //从机地址RFSendPacket((char*)RcvBuf,17);}//task2 按键扫描if(SCAN_ID==1){SCAN_ID=0;KeyScan();}//task3 发送柜台号if(SendDesk_ID==1){SendDesk_Pro();SendDesk_ID=0;}#ifdef WATCHDOG //看门狗喂狗IRQDisable(); //关中断WDFEED = 0xAA; //第一次喂狗启动WDTWDFEED = 0x55; //喂狗序列IRQEnable(); //开中断#endif}return 0;}void DelayNS (uint32 dly){uint32 i;for ( ; dly>0; dly--)for (i=0; i<50000; i++);}//短延时子程序void delay(uint8 t){ uint8 i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}void VAR_Init(void){uint8 i;set.datab = 8; //串口数据位set.stopb = 1; //串口停止位set.parity = 0; //串口校验位rcv_new = 0; //串口接收完数据标志RSMCHR=0; //接收数据暂存变量RSMCHR=0; //判断接收数据用标志RSSMS_ID=0; //直接接收数据标志RCVCOMP_ID=0; //接收完成标志SCAN_ID=1; //按键扫描定时标志INPUT1=0; //按键扫描去抖动计数INPUT1_ID=1; //按键按下放开标志Desk_NUM=0x50; //柜台号,初始值为无效柜台号SendDesk_ID=0; //发送柜台号标志timerCount=0; //定时器计数变量for(i=0;i<MaxDeskNum;i++){DeskDriver[i].allow10s=1; //初始值1为10秒已经过去,可以接受按键柜台号DeskDriver[i].keyScaned=0; //初始值0表示还没有按键柜台号被接受DeskDriver[i].sendCount=0; //初始值0表示发送次数为0,发送一次加1DeskDriver[i].sendOK=0; //初始值0表示没发送成功DeskDriver[i].timeCnt=0; //初始值0,定时计数为0,每秒加1DeskDriver[i].enable=1; //初始值1表示允许发送}}void IO_Init(void){PINSEL0 = 0x00000005; //设置I/O连接到UART0 PINSEL0 =PINSEL0 |0x00050000 ; //配置UART1引脚功能PINSEL0 =PINSEL0 |0x00005500 ; //配置SPI总线引脚0.4sck 0.5miso 0.6mosi0.7SSELPINSEL1 = 0x00000001; //配置p0.16 TI_CC_GDO0_PIN 为外部中断引脚IO0DIR = 0x00000000;IO1DIR = 0x00000000;IO1DIR = IO1DIR|IO1DIR|LED1|LED2|LED3|LED4; //连LED的引脚配置为输出引脚IO0DIR=IO0DIR|KEY_R1| KEY_R2| KEY_R3| KEY_R4; //行线引脚配置为出输出引脚IO0DIR=IO0DIR|MOSI0|SCLK0|TI_CC_CSn_PIN; //配置SPI的cs片选为输出MOSI0|SCLK0|EXTMODE=0x01; //EINT0使用边沿激活EXTPOLAR=0x00; //下降沿或低电平有效}void TC0_Init(void){T0TC = 0; // 定时器设置为0T0PR = 0; // 时钟不分频T0MCR = 0x03; //设置T0MR0匹配后复位T0TC,并产生中断标志T0MR0 = Fpclk / 50; //20毫秒100则10ms定时,修改定时间隔只需修改除数T0TCR = 0x01; // 启动定时器}void __irq IRQ_Timer0 (void){timerCount++;if(timerCount>20) //0.4秒计数{timerCount=0;#ifdef WIRLTESTTimerSend_ID=1;#endifif(IO1PIN&LED2) IO1CLR=IO1CLR|LED2;else IO1SET=IO1SET|LED2;time1sCount++;if(time1sCount>=3) //1.6秒执行一次{time1sCount=0;UpdataDesk(); //更新柜台号结构体的信息}sendDeskNum(); //发送柜台号给pc端}SCAN_ID=1; //开启按键扫描T0IR = 0x01; //清除中断标志,并复位中断VICVectAddr = 0x00; //通知VIC中断处理结束}void UpdataDesk(void){uint8 i;for(i=0;i<MaxDeskNum;i++){if(DeskDriver[i].allow10s==0) //按键按下还没有过10s限定时间{DeskDriver[i].timeCnt++;if((DeskDriver[i].timeCnt==2)|(DeskDriver[i].timeCnt==4)|(DeskDriver[i].timeCnt==5)) {DeskDriver[i].enable=1; //每隔3秒允许发送}if(DeskDriver[i].timeCnt>=7) //超过限定时间,开启允许接收按键,并更新整个结构体{DeskDriver[i].allow10s=1;DeskDriver[i].keyScaned=0; //初始值0表示还没有按键柜台号被接受DeskDriver[i].sendCount=0; //初始值0表示发送次数为0,发送一次加1DeskDriver[i].sendOK=0; //初始值0表示没发送成功DeskDriver[i].timeCnt=0; //初始值0,定时计数为0,每秒加1DeskDriver[i].enable=1; //初始值1表示允许发送}}} //end for}void sendDeskNum(void){uint8 i;for(i=0;i<MaxDeskNum;i++) //论询所有柜台结构,看是否有满足发送条件的{if((DeskDriver[i].keyScaned==1)&(DeskDriver[i].sendOK==0)&(DeskDriver[i].enable==1)) {DeskLoadBuf(i); //将柜台号转载到发送缓冲区RFSendPacket(SendBuf, PAKT_LEN+1); //无线发射DeskDriver[i].sendCount++; //发送次数加1DeskDriver[i].enable=0; //关闭允许发送return;}}}void DeskLoadBuf(uint8 deskNum){SendBuf[0]=OPPO_ADDR; //对方无线地址SendBuf[1]='a'; //打头关键字SendBuf[2]='b';SendBuf[3]=(char)deskNum; //柜台号码SendBuf[4]=0x0d; //结尾关键字SendBuf[5]=0x0a;}#ifdef WATCHDOGvoid WATCHDOG_Init(void){while(( WDMOD & 0x04 ) == 0x04) //判断看门狗超时标志{WDMOD = 0x00; //则软件清零看门狗超时标志位}WDTC = 0x5f0000; //设置看门狗定时器参数WDMOD = 0x03; //设置看门狗模式:中断且复位IRQDisable(); //关中断WDFEED = 0xAA; //第一次喂狗启动WDTWDFEED = 0x55; //喂狗序列IRQEnable(); //开中断}#endifint8 UART0_Init (uint32 baud, UARTMODE set){uint32 bak;/* 参数过滤*/if ((baud ==0 ) || (baud > 115200)) return (0);if ((set.datab <5) || (set.datab > 8)) return (0);if ((set.stopb == 0) || (set.stopb > 2)) return (0);if (set.parity > 4) return (0);/* 设置串口波特率*/U0LCR = 0x80; // DLAB = 1 使能除数所存访问bak = (Fpclk >> 4) / baud; //外设时钟左移四位相当于除以16 相当于(Fpclk/16)/16U0DLM = bak >> 8; //除数高位取16位分频值的高8位相当于bak/256U0DLL = bak & 0xFF; //除数低位取16位分频值的低8位相当于bak%256/* 设置串口模式*/bak = set.datab - 5; // 设置字长if (set.stopb == 2) bak |= 0x04; // 判断是否为2位停止位if (set.parity != 0){set.parity = set.parity - 1;bak |= 0x08;}bak |= set.parity << 4; // 设置奇偶校验U0LCR =(bak&0x7F); //DLAB 除数访问位置0 ,用于访问接收发送寄存器U0FCR = 0x01; // 使能FIFO,并设置触发点为8字节U0IER = 0x01; // 允许RBR中断,即接收中断return (1);}void __irq IRQ_UART0 (void){if ((U0IIR & 0x0F) == 0x04) //通过读取U0IIR来清除中断{RSMCHR = U0RBR; //读取接收的数据if(RSSMS_ID==0) judge_RCV();else direct_RCV(); //直接保存到接收数组}VICVectAddr = 0x00; // 中断处理结束}void judge_RCV(void){if (HDM1_ID==0) //第一次判断{if(RSMCHR==cnPUREDA TCHR1) //判断为点阵数据关键字1 0xaa {HDM1_ID=1;RcvBuf[0]=RSMCHR; //保存关键字1}}else //第二次判断{if(RSMCHR==cnPUREDATCHR2) //判断为点阵数据关键字2 0x55{RcvBuf[1]=RSMCHR; //保存关键字1RSSMS_ID=1; //置直接保存数据标志RSMLEN=RCV_LEN1; //置接收数据长度RcvPointer=2; //置接收数据指针为2HDM1_ID=0;}else{HDM1_ID=0;}}}void direct_RCV(void){RcvBuf[RcvPointer]=RSMCHR; //向接收数据缓冲区保存数据RcvPointer++; //接收缓冲区地址加1RSMLEN--; //接收长度减1if (RSMLEN==0) //当接收长度变为0时,置相应标志{RCVCOMP_ID=1; //置接收完成标志RSSMS_ID=0; //清除直接接收数据标志RcvPointer=2; //接收数据缓冲区地址归位}}void UART0_SendBuf (void){uint8 i;for (i=0; i<(RCV_LEN1+2); i++)U0THR =RcvBuf[i];while ((U0LSR & 0x20) == 0); // 等待数据发送完毕}void UART0_SendBufEx (char * buffer ,uint8 len){uint8 i;for (i=0; i<(len); i++)U0THR =buffer[i];while ((U0LSR & 0x20) == 0); // 等待数据发送完毕}void VIC_Init(void){IRQEnable(); // 使能IRQ中断VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断VICVectCntl0 = 0x20 | 14; // 分配EINT0中断到向量中断1VICVectAddr0 = (uint32)IRQ_Eint0; // 设置中断服务程序地址VICVectCntl2 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高优先级VICVectAddr2 = (uint32)IRQ_UART0; // 设置UART0向量地址VICVectCntl1 = 0x20 | 0x04; // 设置定时器0中断通道分配向量中断1VICVectAddr1 = (uint32)IRQ_Timer0; // 设置中断服务程序地址VICIntEnable =(1<<14)|(1 << 0x06)|(1<<0x04);// 使能SPI中断&UART0中断和定时器0中断}uint8 KeyScan(void){uint8 nRes = 0;IO0CLR = IO0CLR|KEY_R1|KEY_R2|KEY_R3|KEY_R4; //行线输出全部输出高电平delay(5); //读取各个管脚的状态,判断是列线引脚是否有低电平出现if(((IO0PIN&KEY_C1)==0)||((IO0PIN&KEY_C2)==0)||((IO0PIN&KEY_C3)==0)||((IO0PIN&K EY_C4)==0)){INPUT1++; //每20ms扫描一次,出现低电平的次数计数if (INPUT1>=8) //超过一定次数,说明按键按下已经稳定,读取按键{if (INPUT1_ID==1) //为0,表示按键按下未放开,当按键一直按下时,只进行一次处理{INPUT1_ID=0;nRes =KeyProcess();return nRes;}}}else{INPUT1=0; //列线无低电平出现,计数清零INPUT1_ID=1;}return 0; //没有输入,为干扰*/}uint8 KeyProcess(void){uint8 nResult = 0;//第一行输出低电平IO0CLR = IO0CLR|KEY_R1;IO0SET = IO0SET|KEY_R2|KEY_R3|KEY_R4;delay(2);if((IO0PIN&KEY_C1)==0) nResult = 4;if((IO0PIN&KEY_C2)==0) nResult = 3;if((IO0PIN&KEY_C3)==0) nResult = 2;if((IO0PIN&KEY_C4)==0) nResult = 1;if(nResult !=0 )goto result;//第三行输出低电平IO0CLR = IO0CLR|KEY_R3;IO0SET = IO0SET|KEY_R1|KEY_R2|KEY_R4;delay(2);if((IO0PIN&KEY_C1)==0) nResult = 12;if((IO0PIN&KEY_C2)==0) nResult = 11;if((IO0PIN&KEY_C3)==0) nResult = 10;if((IO0PIN&KEY_C4)==0) nResult = 9;if(nResult !=0 )goto result;//第二行输出低电平IO0CLR = IO0CLR|KEY_R2;IO0SET = IO0SET|KEY_R1|KEY_R3|KEY_R4;delay(2);if((IO0PIN&KEY_C1)==0) nResult = 8;if((IO0PIN&KEY_C2)==0) nResult = 7;if((IO0PIN&KEY_C3)==0) nResult = 6;if((IO0PIN&KEY_C4)==0) nResult = 5;if(nResult !=0 )goto result;//第二行输出低电平IO0CLR = IO0CLR|KEY_R4;IO0SET = IO0SET|KEY_R1|KEY_R2|KEY_R3;delay(2);if((IO0PIN&KEY_C1)==0) nResult = 16;if((IO0PIN&KEY_C2)==0) nResult = 15;if((IO0PIN&KEY_C3)==0) nResult = 14;if((IO0PIN&KEY_C4)==0) nResult = 13;//读取各个管脚的状态result:Desk_NUM=nResult; //保存柜台号SendDesk_ID=1; //置发送柜台号标志UART0_SendBufEx("##",2);if(DeskDriver[Desk_NUM].allow10s==1){DeskDriver[Desk_NUM].allow10s=0; //开始限定时间,在限定时间内不接受按键DeskDriver[Desk_NUM].keyScaned=1; //接受按键,并置按下标志DeskDriver[Desk_NUM].timeCnt=0; //计数归零DeskDriver[Desk_NUM].enable=1; //开启允许无线发送DeskDriver[Desk_NUM].sendCount=0; //初始值0表示发送次数为0,发送一次加1DeskDriver[Desk_NUM].sendOK=0; //初始值0表示没发送成功}return nResult;}void SendDesk_Pro(void){if (Desk_NUM==0x55) return; //无效柜台号,返回DeskBuf[0]='a';DeskBuf[1]='b';DeskBuf[2]=Desk_NUM;DeskBuf[3]=0x0d;DeskBuf[4]=0x0a;UART0_SendBufEx(DeskBuf,5);Desk_NUM=0x55; //发送完毕,将柜台号置为无效柜台号}void TI_CC_SPISetup(void){IO0SET=IO0SET|TI_CC_CSn_PIN ; // 设置片选信号无效片选低电平有效PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ; //设置管脚状态SPCCR = 0x52; // 设置SPI时钟分频SPCR = (0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样(1 << 4) | // CPOL = 1, SCK 为低有效(1 << 5) | // MSTR = 1, SPI 处于主模式(0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先(0 << 7); // SPIE = 0, SPI 中断被禁止}Delay ,((cycles-15) % 6) + 15void TI_CC_Wait(unsigned int cycles0){uint16 cycles=cycles0*56;while(cycles>15)cycles = cycles - 6;}void TI_CC_PowerupResetCCxxxx(void){IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效TI_CC_Wait(30);IO0CLR=IO0CLR|TI_CC_CSn_PIN; // 设置片选信号有效TI_CC_Wait(30);IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效TI_CC_Wait(45); // 至少40usIO0CLR=IO0CLR|TI_CC_CSn_PIN; // 设置片选信号有效while (IO0PIN&SOMI0); // 等待CCxxxx 准备好SPDR = TI_CCxxx0_SRES; // 发送命令复位while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕while (IO0PIN&SOMI0); // 等待CCxxxx 准备好IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效}void writeRFSettings(void){Write register settingsTI_CC_SPIWriteReg(TI_CCxxx0_IOCFG2, 0x0B); // GDO2 输出脚配置(连续时钟) .TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG0, 0x06); // GDO0 输出脚配置(当同步词汇发送/收到时声明,在数据端末尾时反声明).TI_CC_SPIWriteReg(TI_CCxxx0_SYNC1, 0xD3); // 同步词汇高字节.TI_CC_SPIWriteReg(TI_CCxxx0_SYNC0, 0x91); // 同步词汇低字节.TI_CC_SPIWriteReg(TI_CCxxx0_PKTLEN, 0x11); // 数据包长度(17).TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL1, 0x05); // 数据包自动控制(开启附加字节;地址检查,无广播).TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL0, 0x04); // 数据包自动控制(开启CRC;固定长度数据包).TI_CC_SPIWriteReg(TI_CCxxx0_ADDR,HOME_ADDR); // 设备地址.TI_CC_SPIWriteReg(TI_CCxxx0_CHANNR, 0x10); // 信道数(16).TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL1, 0x06); // 频率合成器控制(软件给出).TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL0, 0x00); // 频率合成器控制(软件给出).TI_CC_SPIWriteReg(TI_CCxxx0_FREQ2, 0x10); // 频率控制词汇, 高字节(软件给出).TI_CC_SPIWriteReg(TI_CCxxx0_FREQ1, 0xA7); // 频率控制词汇, 中字节(软件给出).TI_CC_SPIWriteReg(TI_CCxxx0_FREQ0, 0x62); // 频率控制词汇, 低字节(软件给出).TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG4, 0x2a); // 调制器配置(信道滤波带宽:101.56K).TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG3, 0x83); // 调制器配置(数据率38.4k).TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG2, 0x11); // 调制器配置(GFSK格式;15/16同步词汇侦测).TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG1, 0x22); // 调制器配置(FEC,前导数目).TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG0, 0xF8); // 调制器配置(信道空间199.951172 k).TI_CC_SPIWriteReg(TI_CCxxx0_DEVIATN, 0x34); // 调制器背离配置(软件给出19k)TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1 , 0x3F); // 主通信控制状态机配置(完成后保持在RX).TI_CC_SPIWriteReg(TI_CCxxx0_MCSM0 , 0x18); // 主通信控制状态机配置(软件给出)(下同).TI_CC_SPIWriteReg(TI_CCxxx0_FOCCFG, 0x16); // 频率便宜补偿配置.TI_CC_SPIWriteReg(TI_CCxxx0_BSCFG, 0x6C); // 位同步配置.TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL2, 0x43); // AGC控制.TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL1, 0x40); // AGC控制.TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL0, 0x91); // AGC控制.TI_CC_SPIWriteReg(TI_CCxxx0_FREND1, 0x56); // 前末端RX配置.TI_CC_SPIWriteReg(TI_CCxxx0_FREND0, 0x10); // 前末端TX配置.TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL3, 0xA9); // 频率合成器校准.TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL2, 0x2A); // 频率合成器校准.TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL1, 0x00); // 频率合成器校准.TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL0, 0x11); // 频率合成器校准.TI_CC_SPIWriteReg(TI_CCxxx0_FSTEST, 0x59); // 产品测试.TI_CC_SPIWriteReg(TI_CCxxx0_TEST2, 0x81); // 不同的测试设置.TI_CC_SPIWriteReg(TI_CCxxx0_TEST1, 0x35); // 不同的测试设置.TI_CC_SPIWriteReg(TI_CCxxx0_TEST0, 0x0B); // 不同的测试设置.}void TI_CC_SPIWriteReg(char addr, char value){IO0CLR=IO0CLR|TI_CC_CSn_PIN; // 设置片选信号有效while (IO0PIN&SOMI0); // 等待CCxxxx 准备好SPDR = addr;while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕SPDR = value;while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效}void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count){char i;#ifdef WIRLUARTUART0_SendBufEx("-WrBurstReg_begin-",21);#endifIO0CLR=IO0CLR|TI_CC_CSn_PIN; // 设置片选信号有效while (IO0PIN&SOMI0); // 等待CCxxxx 准备好SPDR = addr | TI_CCxxx0_WRITE_BURST; // 发送首地址while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕for (i = 0; i < count; i++){SPDR = buffer[i]; // 依次发送数据while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕}IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效#ifdef WIRLUARTUART0_SendBufEx("-WrBurstReg_end-",19);#endif}void __irq IRQ_Eint0(void){if(RFReceStadPacket(rcv_buf,PAKT_LEN+1,AddState)) //接收数据包和附加字节(RSSI,CRC,LQI){LoadRcvBuf();SendDate(rcv_buf,AddState);if(IO1PIN&LED2)IO1CLR=IO1CLR|LED1;elseIO1SET=IO1SET|LED1;#ifdef WIRLUARTrcv_buf[3]=rcv_buf[3]+0x30;UART0_SendBufEx((char*)(&(rcv_buf[3])),1);#endifTI_CC_SPIStrobe(TI_CCxxx0_SFRX); //冲洗RX BUFFER}else{TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); //置空闲模式TI_CC_SPIStrobe(TI_CCxxx0_SCAL); //手动校正频率合成器TI_CC_SPIStrobe(TI_CCxxx0_SFRX); //冲洗RX BUFFERTI_CC_SPIStrobe(TI_CCxxx0_SFTX); //冲洗RX BUFFERTI_CC_SPIStrobe(TI_CCxxx0_SRX); //转为接收模式#ifdef WIRLUARTUART0_SendBufEx("$$$",3);#endif}#ifdef WIRLUARTUART0_SendBufEx("***",3);#endifEXTINT = 0x01; // 清除EINT0中断标志VICVectAddr = 0x00;}char RFReceStadPacket(char *rxBuffer,char length,char *status){if ((TI_CC_SPIReadStatus(TI_CCxxx0_RXBYTES) & TI_CCxxx0_NUM_RXBYTES)) {#ifdef WIRLUARTUART0_SendBufEx("@@@",3);#endifTI_CC_SPIReadBurstReg(TI_CCxxx0_RXFIFO, rxBuffer, length); //弹出数据TI_CC_SPIReadBurstReg(TI_CCxxx0_RXFIFO, status, 2);//读附加字节暂未使用return (char)(status[TI_CCxxx0_LQI_RX]&TI_CCxxx0_CRC_OK);}else{return 0; // 报错}}char TI_CC_SPIReadStatus(char addr){char x;uint32 i;i=0;IO0CLR=IO0CLR|TI_CC_CSn_PIN; // 设置片选信号有效while (IO0PIN&SOMI0) // 等待CCxxxx 准备好{if(i>5000){#ifdef WIRLUARTUART0_SendBufEx("~~~~",4);#endifreturn 0; //超时返回}i++;}SPDR = (addr | TI_CCxxx0_READ_BURST);// 发送读取数据的地址while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕SPDR = 0; // 写入哑函数以读取数据while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕x = SPDR; // 读出数据IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效#ifdef WIRLUARTch[0]=x; //此处不能有串口发送函数,时间会影响UART0_SendBufEx("&&&",3); //TI_CC_SPIReadBurstRegUART0_SendBufEx(ch,1);#endifreturn x; //返回寄存器的值}void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count){unsigned int i;IO0CLR=IO0CLR|TI_CC_CSn_PIN; // 设置片选信号有效while (IO0PIN&SOMI0); // 等待CCxxxx 准备好SPDR = (addr | TI_CCxxx0_READ_BURST); // 发送首地址while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕for (i = 0; i < count; i++){SPDR = 0 ;while (0 ==(SPSR & 0x80));buffer[i] = SPDR; // 读出数据}IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效}void TI_CC_SPIStrobe(char strobe){uint32 i;#ifdef WIRLUARTUART0_SendBufEx("-SPIStrobe_begin-",17);#endifIO0CLR=IO0CLR|TI_CC_CSn_PIN; // 设置片选信号有效while (IO0PIN&SOMI0) // 等待CCxxxx 准备好{if(i>5000){#ifdef WIRLUARTUART0_SendBufEx("~~~~",4);#endifreturn ; //超时返回}i++;}SPDR = strobe; // 发送命令滤波while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕IO0SET=IO0SET|TI_CC_CSn_PIN; // 设置片选信号无效#ifdef WIRLUARTUART0_SendBufEx("-SPIStrobe_end-",15);#endif}void RFSendPacket(char *txBuffer, char size){#ifdef WIRLUARTUART0_SendBufEx("-SendPacket_begin-",20);#endifTI_CC_SPIWriteBurstReg(TI_CCxxx0_TXFIFO, txBuffer, size); // 写入发送数据TI_CC_SPIStrobe(TI_CCxxx0_STX); // 进入发送模式发送数据while ((IO0PIN&TI_CC_GDO0_PIN)==0); // 等待GDO0变高#ifdef WIRLUARTUART0_SendBufEx("-GDO0_high-",11);#endifwhile (IO0PIN&TI_CC_GDO0_PIN); // 等待GDO0变低,结束发送#ifdef WIRLUARTUART0_SendBufEx("-SendPacket_end-",18);#endif}。