Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1270703
  • 博文数量: 160
  • 博客积分: 4132
  • 博客等级: 中校
  • 技术积分: 2086
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-06 21:56
文章分类

全部博文(160)

文章存档

2012年(25)

2011年(120)

2010年(15)

分类: C/C++

2012-04-24 21:51:33

1.定义三个gpio: p0-sclk, p1-sdi, p2-sdo;p0用于模拟spi的clock,p1用于接收数据,p2用于f发送数据;硬件上单片机A的p0接单片机B的p0,A的p1接B的p2,A的p2接B的p1 2.发送程序:clock拉低,sdo输出0或1(数据),延时一定时间,clock拉高,延时一定时间,这样A就发送一位数据到B,循环8次就发送一个字节数据 3.接收程序:检测clock状态,如果为低,就读取sdi,直到clock拉高,结束该次输入,重复8次,读取一个字节 注意: 1。clock空闲状态为高,发送数据就拉低; 2.还需要加入起始停止同步协议,可根据需要进行完善

  1. #include "reg52.h"
  2. #include "intrins.h"
  3. #include "CC1100.h"


  4. #define        INT8U                unsigned char
  5. #define        INT16U                unsigned int


  6. #define     WRITE_BURST     0x40                        //连续写入
  7. #define     READ_SINGLE     0x80                        //读
  8. #define     READ_BURST     0xC0                        //连续读
  9. #define     BYTES_IN_RXFIFO 0x7F                         //接收缓冲区的有效字节数
  10. #define     CRC_OK 0x80                         //CRC校验通过位标志



  11. #define     INT8U        unsigned char
  12. #define     INT16U        unsigned int





  13. sbit     GDO0 =P3^2;
  14. sbit     GDO2 =P3^3;
  15. sbit    CSN     =P1^4;
  16. sbit    MOSI =P1^5;
  17. sbit    MISO =P1^6;
  18. sbit    SCLK =P1^7;
  19. sbit spz =P2^4;
  20. sbit LED1 = P2^1;
  21. sbit LED2 = P2^1;
  22. sbit key =P2^0;





  23. /****************************************************************************************
  24. //全局变量定义
  25. /****************************************************************************************/
  26. //INT16U TimeOutCount[2]={0,0};                            //超时计数器
  27. INT8U code PaTabel[8] = {0xC0, 0xC8, 0x85, 0x51, 0x3A, 0x06, 0x1C, 0x6C};


  28. //*****************************************************************************************
  29. //函数名:delay(unsigned int s)
  30. //输入:时间
  31. //输出:无
  32. //功能描述:普通廷时
  33. //*****************************************************************************************        
  34. delay(unsigned int s)
  35. {
  36.     unsigned int i;
  37.     for(i=0; i<s; i++);
  38.     for(i=0; i<s; i++);
  39. }


  40. void halWait(INT16U timeout) {
  41.     do {
  42.         _nop_();
  43.         _nop_();
  44.         _nop_();
  45.         _nop_();
  46.         _nop_();
  47.         _nop_();
  48.         _nop_();
  49.         _nop_();
  50.         _nop_();
  51.         _nop_();
  52.         _nop_();
  53.         _nop_();
  54.         _nop_();
  55.         _nop_();
  56.         _nop_();
  57.     } while (--timeout);
  58. }

  59. /*****************************************************************************************
  60. //函数名:UartInit()
  61. //输入:无
  62. //输出:无
  63. //功能描述:串口初始化程序
  64. /*****************************************************************************************/
  65. void UartInit(void)
  66. {
  67.     
  68.     SCON = 0x50;             // uart in mode 1 (8 bit), REN=1
  69.     TMOD = TMOD | 0x20 ; // Timer 1 in mode 2
  70.     TH1 = 0xFD; // 9600 Bds at 11.059MHz
  71.     TL1 = 0xFD;             // 9600 Bds at 11.059MHz
  72.     TR1 = 1;                          // Timer 1 run
  73. }


  74. /*****************************************************************************************
  75. //函数名:void TimerInit(void)
  76. //输入:无
  77. //输出:无
  78. //功能描述:定时器0初始化程序
  79. /*****************************************************************************************/



  80. void SpiInit(void)
  81. {
  82.     CSN=0;
  83.     SCLK=0;
  84.     CSN=1;
  85. }

  86. /*****************************************************************************************
  87. //函数名:CpuInit()
  88. //输入:无
  89. //输出:无
  90. //功能描述:SPI初始化程序
  91. /*****************************************************************************************/
  92. CpuInit(void)
  93. {
  94.         UartInit();
  95. //        TimerInit();
  96.         SpiInit();
  97.         delay(5000);
  98. }
  99.     
  100. /*
  101. //*****************************************************************************************
  102. //函数名:ResetTimer(INT8U n)
  103. //输入:要复位的计时器
  104. //输出:无
  105. //功能描述:复位计时器
  106. //*****************************************************************************************
  107. void ResetTimer(INT8U n)
  108. {
  109.     ET0 = 0; // Disable Timer0 interrupt
  110.     timer[n & 0x01] = 0; // Clear timer[n]
  111.     ET0 = 1; // Enable Timer0 interrupt
  112. }


  113. //*****************************************************************************************
  114. //函数名:INT16U ReadTimer(INT8U n)
  115. //输入:要读的计时器
  116. //输出:读出值
  117. //功能描述:读计时器
  118. //*****************************************************************************************
  119. INT16U ReadTimer(INT8U n)
  120. {
  121.     INT16U tmp;
  122.     ET0 = 0; // Disable Timer0 interrupt
  123.     tmp = timer[n]; // Clear timer[n]
  124.     ET0 = 1; // Enable Timer0 interrupt
  125.     return tmp;
  126. }
  127. */
  128. /*****************************************************************************************
  129. //函数名:SendCh(ch)
  130. //输入:无
  131. //输出:无
  132. //功能描述:串口发送一个字符
  133. /*****************************************************************************************/
  134. void SendCh(INT8U ch)
  135. {
  136.     SBUF = ch;
  137.     while(!TI);
  138.     TI = 0;
  139. }


  140. /*****************************************************************************************
  141. //函数名:void SendStr(INT8U *arr)
  142. //输入:发送的字符串
  143. //输出:无
  144. //功能描述:发送一个字符串
  145. /*****************************************************************************************/
  146. //void SendStr(INT8U *arr)
  147. //{
  148. //    INT8U i;
  149.     
  150. //    i = 0;
  151. //    while(arr[i] != '\0')
  152. //    {
  153. //        SendCh(arr[i]);
  154. //        i++;
  155. //    }
  156. //}

  157. //*****************************************************************************************
  158. //函数名:SpisendByte(INT8U dat)
  159. //输入:发送的数据
  160. //输出:无
  161. //功能描述:SPI发送一个字节
  162. //*****************************************************************************************
  163. INT8U SpiTxRxByte(INT8U dat)
  164. {
  165.     INT8U i,temp;
  166.     temp = 0;
  167.     
  168.     SCLK = 0;
  169.     for(i=0; i<8; i++)
  170.     {
  171.         if(dat & 0x80)
  172.         {
  173.             MOSI = 1;
  174.         }
  175.         else MOSI = 0;
  176.         dat <<= 1;

  177.         SCLK = 1;
  178.         _nop_();
  179.         _nop_();

  180.         temp <<= 1;
  181.         if(MISO)temp++;
  182.         SCLK = 0;
  183.         _nop_();
  184.         _nop_();    
  185.     }
  186.     return temp;
  187. }

  188. //*****************************************************************************************
  189. //函数名:void RESET_CC1100(void)
  190. //输入:无
  191. //输出:无
  192. //功能描述:复位CC1100
  193. //*****************************************************************************************
  194. void RESET_CC1100(void)
  195. {
  196.     CSN = 0;
  197.     while (MISO);
  198.     SpiTxRxByte(CCxxx0_SRES);         //写入复位命令
  199.     while (MISO);
  200.     CSN = 1;
  201. }

  202. //*****************************************************************************************
  203. //函数名:void POWER_UP_RESET_CC1100(void)
  204. //输入:无
  205. //输出:无
  206. //功能描述:上电复位CC1100
  207. //*****************************************************************************************
  208. void POWER_UP_RESET_CC1100(void)
  209. {
  210.     CSN = 1;
  211.     halWait(1);
  212.     CSN = 0;
  213.     halWait(1);
  214.     CSN = 1;
  215.     halWait(41);
  216.     RESET_CC1100();         //复位CC1100
  217. }

  218. //*****************************************************************************************
  219. //函数名:void halSpiWriteReg(INT8U addr, INT8U value)
  220. //输入:地址和配置字
  221. //输出:无
  222. //功能描述:SPI写寄存器
  223. //*****************************************************************************************
  224. void halSpiWriteReg(INT8U addr, INT8U value)
  225. {
  226.     CSN = 0;
  227.     while (MISO);
  228.     SpiTxRxByte(addr);        //写地址
  229.     SpiTxRxByte(value);        //写入配置
  230.     CSN = 1;
  231. }

  232. //*****************************************************************************************
  233. //函数名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  234. //输入:地址,写入缓冲区,写入个数
  235. //输出:无
  236. //功能描述:SPI连续写配置寄存器
  237. //*****************************************************************************************
  238. void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  239. {
  240.     INT8U i, temp;
  241.     temp = addr | WRITE_BURST;
  242.     CSN = 0;
  243.     while (MISO);
  244.     SpiTxRxByte(temp);
  245.     for (i = 0; i < count; i++)
  246.      {
  247.         SpiTxRxByte(buffer[i]);
  248.     }
  249.     CSN = 1;
  250. }

  251. //*****************************************************************************************
  252. //函数名:void halSpiStrobe(INT8U strobe)
  253. //输入:命令
  254. //输出:无
  255. //功能描述:SPI写命令
  256. //*****************************************************************************************
  257. void halSpiStrobe(INT8U strobe)
  258. {
  259.     CSN = 0;
  260.     while (MISO);
  261.     SpiTxRxByte(strobe);        //写入命令
  262.     CSN = 1;
  263. }





  264. //*****************************************************************************************
  265. //函数名:INT8U halSpiReadReg(INT8U addr)
  266. //输入:地址
  267. //输出:该寄存器的配置字
  268. //功能描述:SPI读寄存器
  269. //*****************************************************************************************
  270. INT8U halSpiReadReg(INT8U addr)
  271. {
  272.     INT8U temp, value;
  273.     temp = addr|READ_SINGLE;//读寄存器命令
  274.     CSN = 0;
  275.     while (MISO);
  276.     SpiTxRxByte(temp);
  277.     value = SpiTxRxByte(0);
  278.     CSN = 1;
  279.     return value;
  280. }


  281. //*****************************************************************************************
  282. //函数名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  283. //输入:地址,读出数据后暂存的缓冲区,读出配置个数
  284. //输出:无
  285. //功能描述:SPI连续写配置寄存器
  286. //*****************************************************************************************
  287. void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
  288. {
  289.     INT8U i,temp;
  290.     temp = addr | READ_BURST;        //写入要读的配置寄存器地址和读命令
  291.     CSN = 0;
  292.     while (MISO);
  293.     SpiTxRxByte(temp);
  294.     for (i = 0; i < count; i++)
  295.     {
  296.         buffer[i] = SpiTxRxByte(0);
  297.     }
  298.     CSN = 1;
  299. }


  300. //*****************************************************************************************
  301. //函数名:INT8U halSpiReadReg(INT8U addr)
  302. //输入:地址
  303. //输出:该状态寄存器当前值
  304. //功能描述:SPI读状态寄存器
  305. //*****************************************************************************************
  306. INT8U halSpiReadStatus(INT8U addr)
  307. {
  308.     INT8U value,temp;
  309.     temp = addr | READ_BURST;        //写入要读的状态寄存器的地址同时写入读命令
  310.     CSN = 0;
  311.     while (MISO);
  312.     SpiTxRxByte(temp);
  313.     value = SpiTxRxByte(0);
  314.     CSN = 1;
  315.     return value;
  316. }


  317. //*****************************************************************************************
  318. //函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)
  319. //输入:无
  320. //输出:无
  321. //功能描述:配置CC1100的寄存器
  322. //*****************************************************************************************
  323. void halRfWriteRfSettings(void)
  324. {
  325.     halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL2);//自已加的
  326.     // Write register settings
  327.     halSpiWriteReg(CCxxx0_FSCTRL1, rfSettings.FSCTRL1);
  328.     halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL0);
  329.     halSpiWriteReg(CCxxx0_FREQ2, rfSettings.FREQ2);
  330.     halSpiWriteReg(CCxxx0_FREQ1, rfSettings.FREQ1);
  331.     halSpiWriteReg(CCxxx0_FREQ0, rfSettings.FREQ0);
  332.     halSpiWriteReg(CCxxx0_MDMCFG4, rfSettings.MDMCFG4);
  333.     halSpiWriteReg(CCxxx0_MDMCFG3, rfSettings.MDMCFG3);
  334.     halSpiWriteReg(CCxxx0_MDMCFG2, rfSettings.MDMCFG2);
  335.     halSpiWriteReg(CCxxx0_MDMCFG1, rfSettings.MDMCFG1);
  336.     halSpiWriteReg(CCxxx0_MDMCFG0, rfSettings.MDMCFG0);
  337.     halSpiWriteReg(CCxxx0_CHANNR, rfSettings.CHANNR);
  338.     halSpiWriteReg(CCxxx0_DEVIATN, rfSettings.DEVIATN);
  339.     halSpiWriteReg(CCxxx0_FREND1, rfSettings.FREND1);
  340.     halSpiWriteReg(CCxxx0_FREND0, rfSettings.FREND0);
  341.     halSpiWriteReg(CCxxx0_MCSM0 , rfSettings.MCSM0 );
  342.     halSpiWriteReg(CCxxx0_FOCCFG, rfSettings.FOCCFG);
  343.     halSpiWriteReg(CCxxx0_BSCFG, rfSettings.BSCFG);
  344.     halSpiWriteReg(CCxxx0_AGCCTRL2, rfSettings.AGCCTRL2);
  345.     halSpiWriteReg(CCxxx0_AGCCTRL1, rfSettings.AGCCTRL1);
  346.     halSpiWriteReg(CCxxx0_AGCCTRL0, rfSettings.AGCCTRL0);
  347.     halSpiWriteReg(CCxxx0_FSCAL3, rfSettings.FSCAL3);
  348.     halSpiWriteReg(CCxxx0_FSCAL2, rfSettings.FSCAL2);
  349.     halSpiWriteReg(CCxxx0_FSCAL1, rfSettings.FSCAL1);
  350.     halSpiWriteReg(CCxxx0_FSCAL0, rfSettings.FSCAL0);
  351.     halSpiWriteReg(CCxxx0_FSTEST, rfSettings.FSTEST);
  352.     halSpiWriteReg(CCxxx0_TEST2, rfSettings.TEST2);
  353.     halSpiWriteReg(CCxxx0_TEST1, rfSettings.TEST1);
  354.     halSpiWriteReg(CCxxx0_TEST0, rfSettings.TEST0);
  355.     halSpiWriteReg(CCxxx0_IOCFG2, rfSettings.IOCFG2);
  356.     halSpiWriteReg(CCxxx0_IOCFG0, rfSettings.IOCFG0);
  357.     halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1);
  358.     halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0);
  359.     halSpiWriteReg(CCxxx0_ADDR, rfSettings.ADDR);
  360.     halSpiWriteReg(CCxxx0_PKTLEN, rfSettings.PKTLEN);
  361. }






  362. //*****************************************************************************************
  363. //函数名:void halRfSendPacket(INT8U *txBuffer, INT8U size)
  364. //输入:发送的缓冲区,发送数据个数
  365. //输出:无
  366. //功能描述:CC1100发送一组数据
  367. //*****************************************************************************************
  368. void halRfSendPacket(INT8U *txBuffer, INT8U size)
  369. {
  370.     halSpiWriteReg(CCxxx0_TXFIFO, size);
  371.     halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);    //写入要发送的数据

  372.     halSpiStrobe(CCxxx0_STX);        //进入发送模式发送数据

  373.     // Wait for MISO to be set -> sync transmitted
  374.     while (!GDO0);

  375.     // Wait for MISO to be cleared -> end of packet
  376.     while (GDO0);
  377.     halSpiStrobe(CCxxx0_SFTX);
  378. }



  379. INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)
  380. {
  381.     INT8U status[2];
  382.     INT8U packetLength;

  383.     halSpiStrobe(CCxxx0_SRX);        //进入接收状态
  384.     while (!GDO0);
  385.     while (GDO0);
  386.     if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
  387.     {
  388.         packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度
  389.         if (packetLength <= *length)         //如果所要的有效数据长度小于等于接收到的数据包的长度
  390.         {
  391.             halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据
  392.             *length = packetLength;                //把接收数据长度的修改为当前数据的长度
  393.         
  394.             // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
  395.             halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);     //读出CRC校验位
  396.             return (status[1] & CRC_OK);            //如果校验成功返回接收成功
  397.         }
  398.          else
  399.         {
  400.             *length = packetLength;
  401.             halSpiStrobe(CCxxx0_SFRX);        //清洗接收缓冲区
  402.             return 0;
  403.         }
  404.     }
  405.     else
  406.      return 0;
  407. }

  408. /******************************************************************************************
  409. *******************************************************************************************
  410. ************************************中断服务程序*********************************************
  411. *******************************************************************************************
  412. ******************************************************************************************/
  413. /*void Timer0ISR(void) interrupt 1
  414. {
  415.     EA = 0;
  416.     TH0+=TIMER0H;
  417.     TL0+=TIMER0L;
  418.     TimerCount++;
  419.     timer[0]++;
  420.     timer[1]++;
  421.     EA = 1;
  422. }
  423. */
  424. void delay1ms(int t)
  425. {
  426.   int i,j;
  427.   for(i=0;i<t;i++)
  428.   for(j=0;j<120;j++)
  429. ;
  430. }


  431. /******************************************************************************************
  432. *******************************************************************************************
  433. ******************************************主程序*******************************************
  434. *******************************************************************************************
  435. ******************************************************************************************/
  436. main(void)
  437. {
  438.     INT8U i;
  439.     INT8U leng;
  440.     //INT8U code arrTx[60]="where there is a will,there is a way,trust me,I will be ";
  441.     INT8U xdata arrRx[100]=0;
  442.     CpuInit();
  443.     POWER_UP_RESET_CC1100();
  444.     halRfWriteRfSettings();
  445.     halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);
  446.     LED1 = 0;
  447.     delay(60000);
  448.     LED1 = 1;
  449.     delay(30000);
  450.    leng=sizeof arrRx;
  451.     while(1)
  452.     {    
  453.        //    if(!key)
  454.        // {
  455.        // delay1ms(20);
  456.       // if(!key)
  457.       // {
  458.             
  459.     //     halRfSendPacket(arrTx,leng);
  460.     //     LED2 = 0;
  461.     //     delay(1000);
  462.     //     LED2 = 1;
  463.     //     delay(2000);
  464.                        
  465.                  
  466.   
  467.     if(halRfReceivePacket(arrRx,&leng))
  468.     {
  469.             
  470.             LED2 = 0;
  471.             delay(10000);
  472.             LED2 = 1;
  473.             halSpiStrobe(CCxxx0_SFRX);
  474.             for(i=0;i<leng;i++)
  475.            {
  476.              SendCh(arrRx[i]);
  477.             }
  478.             
  479.             
  480.   }
  481. }
  482.             
  483.     //    }
  484. //    }
  485. } ...







阅读(5407) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

sillyboytao2012-05-06 00:29:17

147189385: - - 怎么没有一点注释呢、、.....
重比较要的地方都有注释啊……

1471893852012-04-25 16:16:38

- - 怎么没有一点注释呢、、