CC1100.C
上传用户:zqfengji
上传日期:2007-09-28
资源大小:13k
文件大小:16k
源码类别:

RFID编程

开发平台:

C/C++

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "CC1100.c"
  4. #define INT8U unsigned char
  5. #define INT16U unsigned int
  6. #define  time0h  (65535-1000)/256
  7. #define  time0l  (65535-1000)%256 //定时1MS
  8. #define  WRITE_BURST      0x40 //连续写入
  9. #define  READ_SINGLE      0x80 //读
  10. #define  READ_BURST       0xC0 //连续读
  11. #define  BYTES_IN_RXFIFO     0x7F   //接收缓冲区的有效字节数
  12. #define  CRC_OK              0x80  //CRC校验通过位标志
  13. #define  INT8U unsigned char 
  14. #define  INT16U unsigned int
  15. #define FOSC 11059200
  16. #define BAUD 9600
  17. #define TIMER1 0XFD //256-(110592/(12*32*96))
  18. #define TIMER0H (65535-3*FOSC/12/1000)/256
  19. #define TIMER0L (65535-3*FOSC/12/1000)%256 //定时3MSVR
  20. //----------------------------------------------------------------------------------------------------------
  21. //内部寄存器定义
  22. //----------------------------------------------------------------------------------------------------------
  23. sfr P4 = 0xc0;
  24. sfr  ADC_CONTR  =  0xC5;
  25. sfr  AUXR  =  0x8E;
  26. sfr  ADC_DATA  =  0xC6;
  27. sfr  P1_ADC_EN  =  0x97;
  28. sbit DAT1 = P3^5;
  29. sbit DAT2 = P3^4;
  30. sbit DAT3 = P3^3;
  31. sbit DAT4 = P3^2;
  32. sbit DAT5 = P4^3;
  33. sbit DAT6 = P1^7;
  34. sbit DAT7 = P1^6;
  35. sbit DAT8 = P1^5;
  36. sbit DAT9 = P1^4;
  37. sbit DAT10 = P4^2;  
  38. //定义CC1100模块接口
  39. #define GDO1 DAT1
  40. #define GDO2 DAT2
  41. #define CSN DAT4
  42. #define MOSI DAT5
  43. #define MISO DAT6
  44. #define SCK DAT7
  45. sbit LED1 = P4^1;
  46. sbit LED2 = P4^0;
  47. /****************************************************************************************
  48. //全局变量定义
  49. /****************************************************************************************/
  50. INT16U TimeOutCount[2]={0,0}; //超时计数器
  51. INT8U PaTabel[8] = {0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0};
  52. //*****************************************************************************************
  53. //函数名:delay(unsigned int s)
  54. //输入:时间
  55. //输出:无
  56. //功能描述:普通廷时
  57. //*****************************************************************************************
  58. delay(unsigned int s)
  59. {
  60. unsigned int i;
  61. for(i=0; i<s; i++);
  62. for(i=0; i<s; i++);
  63. }
  64. void halWait(INT16U timeout) {
  65.     do {
  66.         _nop_();
  67. _nop_();
  68. _nop_();
  69. _nop_();
  70. _nop_();
  71. _nop_();
  72. _nop_();
  73. _nop_();
  74. _nop_();
  75. _nop_();
  76. _nop_();
  77. _nop_();
  78. _nop_();
  79. _nop_();
  80. _nop_(); 
  81.     } while (--timeout);
  82. }
  83. /*****************************************************************************************
  84. //函数名:UartInit()
  85. //输入:无
  86. //输出:无
  87. //功能描述:串口初始化程序
  88. /*****************************************************************************************/
  89. void UartInit(void)
  90. {
  91. SCON = 0x50; //串口方式1,允许接收
  92. TMOD = 0x21; //定时器1工作方式2,定时器0工作方式1
  93. TH1 = TIMER1;
  94. TL1 = TIMER1;
  95. TR1 = 1; //启动定时器1
  96. }
  97. /*****************************************************************************************
  98. //函数名:void TimerInit(void)
  99. //输入:无
  100. //输出:无
  101. //功能描述:定时器0初始化程序
  102. /*****************************************************************************************/
  103. void TimerInit(void)
  104. {
  105. TH0 = TIMER0H;
  106. TL0 = TIMER0L;
  107. ET0 = 1; //定时器0中断允许
  108. TF0 = 0;
  109. TR0 = 1; //启动定时器0
  110. EA = 1; //开全局中断
  111. }
  112. void SpiInit(void)
  113. {
  114. CSN=0;
  115. SCK=0;
  116. CSN=1;
  117. }
  118. /*****************************************************************************************
  119. //函数名:CpuInit()
  120. //输入:无
  121. //输出:无
  122. //功能描述:SPI初始化程序
  123. /*****************************************************************************************/
  124. CpuInit(void)
  125. {
  126. UartInit();
  127. // TimerInit();
  128. SpiInit();
  129. delay(5000);
  130. }
  131. /*
  132. //*****************************************************************************************
  133. //函数名:ResetTimer(INT8U n)
  134. //输入:要复位的计时器
  135. //输出:无
  136. //功能描述:复位计时器
  137. //*****************************************************************************************
  138. void ResetTimer(INT8U n)
  139. {
  140. ET0 = 0;                                    // Disable Timer0 interrupt
  141. timer[n & 0x01] = 0;                        // Clear timer[n]
  142. ET0 = 1;                                    // Enable Timer0 interrupt
  143. }
  144. //*****************************************************************************************
  145. //函数名:INT16U ReadTimer(INT8U n)
  146. //输入:要读的计时器
  147. //输出:读出值
  148. //功能描述:读计时器
  149. //*****************************************************************************************
  150. INT16U ReadTimer(INT8U n)
  151. {
  152. INT16U tmp;
  153. ET0 = 0;                                    // Disable Timer0 interrupt
  154. tmp = timer[n];                             // Clear timer[n]
  155. ET0 = 1;                                    // Enable Timer0 interrupt
  156. return tmp;
  157. }
  158. */
  159. /*****************************************************************************************
  160. //函数名:SendCh(ch)
  161. //输入:无
  162. //输出:无
  163. //功能描述:串口发送一个字符
  164. /*****************************************************************************************/
  165. void SendCh(INT8U ch)
  166. {
  167. SBUF = ch;
  168. while(!TI);
  169. TI = 0;
  170. }
  171. /*****************************************************************************************
  172. //函数名:void SendStr(INT8U *arr)
  173. //输入:发送的字符串
  174. //输出:无
  175. //功能描述:发送一个字符串
  176. /*****************************************************************************************/
  177. void SendStr(INT8U *arr)
  178. {
  179. INT8U i;
  180. i = 0;
  181. while(arr[i] != '')
  182. {
  183. SendCh(arr[i]);
  184. i++;
  185. }
  186. }
  187. //*****************************************************************************************
  188. //函数名:SpisendByte(INT8U dat)
  189. //输入:发送的数据
  190. //输出:无
  191. //功能描述:SPI发送一个字节
  192. //*****************************************************************************************
  193. INT8U SpiTxRxByte(INT8U dat)
  194. {
  195. INT8U i,temp;
  196. temp = 0;
  197. SCK = 0;
  198. for(i=0; i<8; i++)
  199. {
  200. if(dat & 0x80)
  201. {
  202. MOSI = 1;
  203. }
  204. else MOSI = 0;
  205. dat <<= 1;
  206. SCK = 1; 
  207. _nop_();
  208. _nop_();
  209. temp <<= 1;
  210. if(MISO)temp++; 
  211. SCK = 0;
  212. _nop_();
  213. _nop_();
  214. }
  215. return temp;
  216. }
  217. //*****************************************************************************************
  218. //函数名:void RESET_CC1100(void)
  219. //输入:无
  220. //输出:无
  221. //功能描述:复位CC1100
  222. //*****************************************************************************************
  223. void RESET_CC1100(void) 
  224. {
  225. CSN = 0; 
  226. while (GDO1); 
  227. SpiTxRxByte(CCxxx0_SRES);  //写入复位命令
  228. while (GDO1); 
  229. CSN = 1; 
  230. }
  231. //*****************************************************************************************
  232. //函数名:void POWER_UP_RESET_CC1100(void) 
  233. //输入:无
  234. //输出:无
  235. //功能描述:上电复位CC1100
  236. //*****************************************************************************************
  237. void POWER_UP_RESET_CC1100(void) 
  238. {
  239. CSN = 1; 
  240. halWait(1); 
  241. CSN = 0; 
  242. halWait(1); 
  243. CSN = 1; 
  244. halWait(41); 
  245. RESET_CC1100();    //复位CC1100
  246. }
  247. //*****************************************************************************************
  248. //函数名:void halSpiWriteReg(INT8U addr, INT8U value)
  249. //输入:地址和配置字
  250. //输出:无
  251. //功能描述:SPI写寄存器
  252. //*****************************************************************************************
  253. void halSpiWriteReg(INT8U addr, INT8U value) 
  254. {
  255.     CSN = 0;
  256.     while (GDO1);
  257.     SpiTxRxByte(addr); //写地址
  258.     SpiTxRxByte(value); //写入配置
  259.     CSN = 1;
  260. }
  261. //*****************************************************************************************
  262. //函数名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  263. //输入:地址,写入缓冲区,写入个数
  264. //输出:无
  265. //功能描述:SPI连续写配置寄存器
  266. //*****************************************************************************************
  267. void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count) 
  268. {
  269.     INT8U i, temp;
  270. temp = addr | WRITE_BURST;
  271.     CSN = 0;
  272.     while (GDO1);
  273.     SpiTxRxByte(temp);
  274.     for (i = 0; i < count; i++)
  275.   {
  276.         SpiTxRxByte(buffer[i]);
  277.     }
  278.     CSN = 1;
  279. }
  280. //*****************************************************************************************
  281. //函数名:void halSpiStrobe(INT8U strobe)
  282. //输入:命令
  283. //输出:无
  284. //功能描述:SPI写命令
  285. //*****************************************************************************************
  286. void halSpiStrobe(INT8U strobe) 
  287. {
  288.     CSN = 0;
  289.     while (GDO1);
  290.     SpiTxRxByte(strobe); //写入命令
  291.     CSN = 1;
  292. }
  293. //*****************************************************************************************
  294. //函数名:INT8U halSpiReadReg(INT8U addr)
  295. //输入:地址
  296. //输出:该寄存器的配置字
  297. //功能描述:SPI读寄存器
  298. //*****************************************************************************************
  299. INT8U halSpiReadReg(INT8U addr) 
  300. {
  301. INT8U temp, value;
  302.     temp = addr|READ_SINGLE;//读寄存器命令
  303. CSN = 0;
  304. while (GDO1);
  305. SpiTxRxByte(temp);
  306. value = SpiTxRxByte(0);
  307. CSN = 1;
  308. return value;
  309. }
  310. //*****************************************************************************************
  311. //函数名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  312. //输入:地址,读出数据后暂存的缓冲区,读出配置个数
  313. //输出:无
  314. //功能描述:SPI连续写配置寄存器
  315. //*****************************************************************************************
  316. void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count) 
  317. {
  318.     INT8U i,temp;
  319. temp = addr | READ_BURST; //写入要读的配置寄存器地址和读命令
  320.     CSN = 0;
  321.     while (GDO1);
  322. SpiTxRxByte(temp);   
  323.     for (i = 0; i < count; i++) 
  324. {
  325.         buffer[i] = SpiTxRxByte(0);
  326.     }
  327.     CSN = 1;
  328. }
  329. //*****************************************************************************************
  330. //函数名:INT8U halSpiReadReg(INT8U addr)
  331. //输入:地址
  332. //输出:该状态寄存器当前值
  333. //功能描述:SPI读状态寄存器
  334. //*****************************************************************************************
  335. INT8U halSpiReadStatus(INT8U addr) 
  336. {
  337.     INT8U value,temp;
  338. temp = addr | READ_BURST; //写入要读的状态寄存器的地址同时写入读命令
  339.     CSN = 0;
  340.     while (GDO1);
  341.     SpiTxRxByte(temp);
  342. value = SpiTxRxByte(0);
  343. CSN = 1;
  344. return value;
  345. }
  346. //*****************************************************************************************
  347. //函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)
  348. //输入:无
  349. //输出:无
  350. //功能描述:配置CC1100的寄存器
  351. //*****************************************************************************************
  352. void halRfWriteRfSettings(void) 
  353. {
  354. halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL2);//自已加的
  355.     // Write register settings
  356.     halSpiWriteReg(CCxxx0_FSCTRL1,  rfSettings.FSCTRL1);
  357.     halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL0);
  358.     halSpiWriteReg(CCxxx0_FREQ2,    rfSettings.FREQ2);
  359.     halSpiWriteReg(CCxxx0_FREQ1,    rfSettings.FREQ1);
  360.     halSpiWriteReg(CCxxx0_FREQ0,    rfSettings.FREQ0);
  361.     halSpiWriteReg(CCxxx0_MDMCFG4,  rfSettings.MDMCFG4);
  362.     halSpiWriteReg(CCxxx0_MDMCFG3,  rfSettings.MDMCFG3);
  363.     halSpiWriteReg(CCxxx0_MDMCFG2,  rfSettings.MDMCFG2);
  364.     halSpiWriteReg(CCxxx0_MDMCFG1,  rfSettings.MDMCFG1);
  365.     halSpiWriteReg(CCxxx0_MDMCFG0,  rfSettings.MDMCFG0);
  366.     halSpiWriteReg(CCxxx0_CHANNR,   rfSettings.CHANNR);
  367.     halSpiWriteReg(CCxxx0_DEVIATN,  rfSettings.DEVIATN);
  368.     halSpiWriteReg(CCxxx0_FREND1,   rfSettings.FREND1);
  369.     halSpiWriteReg(CCxxx0_FREND0,   rfSettings.FREND0);
  370.     halSpiWriteReg(CCxxx0_MCSM0 ,   rfSettings.MCSM0 );
  371.     halSpiWriteReg(CCxxx0_FOCCFG,   rfSettings.FOCCFG);
  372.     halSpiWriteReg(CCxxx0_BSCFG,    rfSettings.BSCFG);
  373.     halSpiWriteReg(CCxxx0_AGCCTRL2, rfSettings.AGCCTRL2);
  374. halSpiWriteReg(CCxxx0_AGCCTRL1, rfSettings.AGCCTRL1);
  375.     halSpiWriteReg(CCxxx0_AGCCTRL0, rfSettings.AGCCTRL0);
  376.     halSpiWriteReg(CCxxx0_FSCAL3,   rfSettings.FSCAL3);
  377. halSpiWriteReg(CCxxx0_FSCAL2,   rfSettings.FSCAL2);
  378. halSpiWriteReg(CCxxx0_FSCAL1,   rfSettings.FSCAL1);
  379.     halSpiWriteReg(CCxxx0_FSCAL0,   rfSettings.FSCAL0);
  380.     halSpiWriteReg(CCxxx0_FSTEST,   rfSettings.FSTEST);
  381.     halSpiWriteReg(CCxxx0_TEST2,    rfSettings.TEST2);
  382.     halSpiWriteReg(CCxxx0_TEST1,    rfSettings.TEST1);
  383.     halSpiWriteReg(CCxxx0_TEST0,    rfSettings.TEST0);
  384.     halSpiWriteReg(CCxxx0_IOCFG2,   rfSettings.IOCFG2);
  385.     halSpiWriteReg(CCxxx0_IOCFG0,   rfSettings.IOCFG0);    
  386.     halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1);
  387.     halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0);
  388.     halSpiWriteReg(CCxxx0_ADDR,     rfSettings.ADDR);
  389.     halSpiWriteReg(CCxxx0_PKTLEN,   rfSettings.PKTLEN);
  390. }
  391. //*****************************************************************************************
  392. //函数名:void halRfSendPacket(INT8U *txBuffer, INT8U size)
  393. //输入:发送的缓冲区,发送数据个数
  394. //输出:无
  395. //功能描述:CC1100发送一组数据
  396. //*****************************************************************************************
  397. void halRfSendPacket(INT8U *txBuffer, INT8U size) 
  398. {
  399. halSpiWriteReg(CCxxx0_TXFIFO, size);
  400.     halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //写入要发送的数据
  401.     halSpiStrobe(CCxxx0_STX); //进入发送模式发送数据
  402.     // Wait for GDO0 to be set -> sync transmitted
  403.     while (!GDO1);
  404.     // Wait for GDO0 to be cleared -> end of packet
  405.     while (GDO1);
  406. halSpiStrobe(CCxxx0_SFTX);
  407. }
  408. INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length) 
  409. {
  410.     INT8U status[2];
  411.     INT8U packetLength;
  412.     halSpiStrobe(CCxxx0_SRX); //进入接收状态
  413.     while (!GDO1);
  414.     while (GDO1);
  415.     if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
  416. {
  417.         packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度
  418.         if (packetLength <= *length)  //如果所要的有效数据长度小于等于接收到的数据包的长度
  419. {
  420.             halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据
  421.             *length = packetLength; //把接收数据长度的修改为当前数据的长度
  422.         
  423.             // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
  424.             halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);  //读出CRC校验位
  425.             return (status[1] & CRC_OK); //如果校验成功返回接收成功
  426.         }
  427.  else 
  428. {
  429.             *length = packetLength;
  430.             halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区
  431.             return 0;
  432.         }
  433.     } 
  434. else
  435.   return 0;
  436. }
  437. /******************************************************************************************
  438. *******************************************************************************************
  439. ************************************中断服务程序*********************************************
  440. *******************************************************************************************
  441. ******************************************************************************************/
  442. /*void Timer0ISR(void) interrupt 1
  443. {
  444. EA = 0;
  445. TH0+=TIMER0H;
  446. TL0+=TIMER0L;
  447. TimerCount++;
  448. timer[0]++;
  449. timer[1]++;
  450. EA = 1;
  451. }
  452. */
  453. /******************************************************************************************
  454. *******************************************************************************************
  455. ******************************************主程序*******************************************
  456. *******************************************************************************************
  457. ******************************************************************************************/
  458. main(void)
  459. {
  460. INT8U leng;
  461. INT8U arrTx[4];
  462. INT8U arrRx[4];
  463. CpuInit();
  464. POWER_UP_RESET_CC1100();
  465. halRfWriteRfSettings();
  466. halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);
  467. LED1 = 0;
  468. delay(60000);
  469. LED1 = 1;
  470. delay(30000);
  471. arrTx[0] = 0xBB;
  472. arrTx[1] = 0xAA;
  473. arrTx[2] = 0x55;
  474. arrTx[3] = 0x09;
  475. leng = 3;
  476. while(1)
  477. {  
  478. /* halRfSendPacket(arrTx,4);
  479. LED2 = 0;
  480. delay(10000);
  481. LED2 = 1;
  482. delay(20000);*/
  483. if(halRfReceivePacket(arrRx,&leng))
  484. {
  485. LED2 = 0;
  486. delay(10000);
  487. LED2 = 1;
  488. halSpiStrobe(CCxxx0_SFRX);
  489. SendCh(arrRx[0]);
  490. SendCh(arrRx[1]);
  491. SendCh(arrRx[2]);
  492. SendCh(arrRx[3]);
  493. }
  494. }
  495. }