国产在线中文字幕亚洲,一区视频国产精品观看,欧美日韩国产高清片,久久久久久AV无码免费网站,亚洲无码一二三四五区,日韩无码www.,sese444

您好,歡迎來到維庫電子市�(chǎng)�(wǎng) 登錄 | 免費(fèi)注冊(cè)

nrf905
閱讀�4595�(shí)間:2017-06-20 13:47:04

  nRF905無線芯片是由挪威NORDIC公司出品的低�1GHz無線�(shù)傳芯�,主要工作于433MHz�868MHz�915MHz的ISM頻段。芯片內(nèi)�頻率合成�、功率放大器�晶體振蕩��(diào)制器等功能模�,輸出功率和通信頻道可通過程序�(jìn)行配�。非常適合于低功�、低成本的系�(tǒng)�(shè)�(jì)�

性能參數(shù)

  �422.4�473.5MHz工作頻段
  �512�(gè)通訊頻道,滿足多�(diǎn)通訊、分�、跳頻等�(yīng)用需�,通道切換�(shí)間≤6us
  ◆發(fā)射功率可�(shè)置為�10dBm�6dBm�-2dBm�-10dBm
  ◆通過SPI接口與MCU連接
  ◆支�50kbps傳輸速率
  ◆ShockBurst傳輸模式,自�(dòng)生成前導(dǎo)碼和CRC校驗(yàn)�
  ◆工作電壓范圍:1.9V�3.6V,待�(jī)模式下電流僅�12.5μA
  ◆工作溫度范圍:-40℃~+85�

工作模式

  nRF905采用Nordic公司的VLSI ShockBurst技�(shù)。ShockBurst技�(shù)使nRF905能夠提供高速的�(shù)�(jù)傳輸,而不需要昂貴的高速M(fèi)CU來�(jìn)行數(shù)�(jù)處理/�(shí)鐘覆�。通過將與RF�(xié)議有�(guān)的高速信�(hào)處理放到芯片�(nèi),nRF905提供給應(yīng)用的微控制器一�(gè)SPI接口,速率由微控制器自己設(shè)定的接口速度決定。nRF905通過ShockBurst工作模式在RF以速率�(jìn)行連接�(shí)降低�(shù)字應(yīng)用部分的速度來降低在�(yīng)用中的平均電流消�。在ShockBurst RX模式�,地址匹配AM和數(shù)�(jù)�(zhǔn)備就緒DR信號(hào)通知MCU一�(gè)有效的地址和數(shù)�(jù)包已�(jīng)各自接收完成。在ShockBurst TX模式中,nRF905自動(dòng)�(chǎn)生前�(dǎo)碼和CRC校驗(yàn)�,數(shù)�(jù)�(zhǔn)備就緒DR信號(hào)通知MCU�(shù)�(jù)傳輸已經(jīng)完成??傊?,這意味著降低MCU的存�(chǔ)器需求也就是說降低MCU成本,又同時(shí)縮短軟件開發(fā)�(shí)間�
  1)典型ShockBurst TX模式�
 ?�?、當(dāng)�(yīng)用MCU有遙�?cái)?shù)�(jù)節(jié)�(diǎn)�(shí),接收節(jié)�(diǎn)的地址TX-address和有效數(shù)�(jù)TX-payload通過SPI接口傳送給nRF905�(yīng)用協(xié)議或MCU�(shè)置接口速度�
 ?、凇CU�(shè)置TRX_CE、TX_EN為高來激活nRF905 ShockBurst傳輸�
  �、nRF905 ShockBurst�
  l 無線系統(tǒng)自動(dòng)上電
  l �(shù)�(jù)包完成(加前�(dǎo)碼和CRC校驗(yàn)碼)
  l �(shù)�(jù)包發(fā)送(100kbps,GFSK,曼徹斯特編碼)
  �、如果AUTO_RETRAN被設(shè)置為高nRF905將連續(xù)地發(fā)送數(shù)�(jù)包直到TRX_CE被設(shè)置為��
 ?�?、當(dāng)TRX_CE被設(shè)置為低時(shí),nRF905�(jié)束數(shù)�(jù)傳輸并自�(dòng)�(jìn)入standby模式�
  2)典型ShockBurst RX模式
 ?�?、通過�(shè)置TRX_CE高,TX_EN低來選擇ShockBurst模式�
 ?、凇?50us以后,nRF905�(jiān)�(cè)空中的信息;
 ?、邸�?dāng)nRF905�(fā)�(xiàn)和接收頻率相同的載波�(shí),載波檢�(cè)CD被置��
 ?�?、當(dāng)nRF905接收到有效的地址�(shí),地址匹配AM被置��
 ?�?、當(dāng)nRF905接收到有效的�(shù)�(jù)包(CRC校驗(yàn)正確)時(shí),nRF905去掉前導(dǎo)�、地址和CRC�,數(shù)�(jù)�(zhǔn)備就緒(DR)被置高�
 ?�?、MCU�(shè)置TRX_CE�,�(jìn)入standby模式低電流模��
  �、MCU可以以合適的速率通過SPI接口讀出有效數(shù)�(jù)�
 ?、唷�?dāng)所有的有效�(shù)�(jù)被讀出后,nRF905將AM和DR置低�
 ?�?、nRF905將準(zhǔn)備�(jìn)入ShockBurst RX、ShockBurst TX或Powerdown模式�
  3)掉電模�
  在掉電模式中,nRF905被禁�,電流消耗最�,典型值低�2.5uA。當(dāng)�(jìn)入這種模式�(shí),nRF905是不活動(dòng)的狀�(tài)。這時(shí)候平均電流消耗最�,電池使用壽命最�(zhǎng)。在掉電模式�,配置字的內(nèi)容保持不��
  4)STANDBY模式
  Standby模式在保持電流消耗最小的同時(shí)保證最短的ShockBurstRX、ShockBurstTX的啟�(dòng)�(shí)�。當(dāng)�(jìn)入這種模式�(shí),一部分晶體振蕩器是活動(dòng)�。電流消耗取決于晶體振蕩器頻率,如:�(dāng)頻率�4MHZ�(shí),IDD=12uA;當(dāng)頻率�20MHZ �(shí),IDD=46uA。如果uPCLK(Pin3)被使能,電流消耗將增加。并且取決于�(fù)載電容和頻率。在此模式中,配置字的內(nèi)容保持不��

器件配置

  nRF905的所有配置都通過SPI接口�(jìn)�。SPI接口�5�(gè)寄存器組�,一條SPI指令用來決定�(jìn)行什么操�。SPI接口只有在掉電模式和Standby模式是激活的�
  1)狀�(tài)寄存器(Status-Register�
  寄存器包含數(shù)�(jù)就緒DR和地址匹配AM狀�(tài)�
  2)RF配置寄存器(RF-Configuration Register�
  寄存器包含收�(fā)器的頻率、輸出功率等配置信息�
  3)發(fā)送地址(TX-Address�
  寄存器包含目�(biāo)器件地址,字節(jié)�(zhǎng)度由配置寄存器設(shè)��
  4)發(fā)送有效數(shù)�(jù)(TX-Payload�
  寄存器包含發(fā)送的有效ShockBurst�(shù)�(jù)包數(shù)�(jù),字節(jié)�(zhǎng)度由配置寄存器設(shè)��
  5)接收有效數(shù)�(jù)(RX-Payload�
  寄存器包含接收到的有效ShockBurst�(shù)�(jù)包數(shù)�(jù),字節(jié)�(zhǎng)度由配置寄存器設(shè)�。在寄存器中的有效數(shù)�(jù)由數(shù)�(jù)�(zhǔn)備就緒DR指示�

�(yīng)用領(lǐng)�

  超低功耗無線收�(fā)�
  無線傳感�(wǎng)�(luò)
  家庭和樓宇自�(dòng)�
  無線�(bào)警安全系�(tǒng)
  無線�(shù)�(jù)傳輸系統(tǒng)
  �(bào)警及安全系統(tǒng)
  家庭自動(dòng)�
  遙感�(jiān)�(cè)
  無線門禁系�(tǒng)
  無線鼠標(biāo)
  遙控開鎖
  遙控玩具

程序

  �(fā)送部�
  /****************************
  //寫發(fā)射數(shù)�(jù)命令:20H
  //讀�(fā)射數(shù)�(jù)命令:21H
  //寫發(fā)射地址命令:22H
  //讀�(fā)射地址命令:23H //讀接收�(shù)�(jù)命令:24H
  ******************************/
  #include <reg52.h>
  #define uint unsigned int
  #define uchar unsigned char
  sbit TXEN = P2^7; //配置口定�5`6`7//
  sbit TRX_CE = P2^6;
  sbit PWR = P2^5;
  sbit MISO = P2^2; //SPI口定�0`1`2`3//
  sbit MOSI = P2^3;
  sbit SCK = P2^1;
  sbit CSN = P2^0;
  sbit DR = P2^4; //狀�(tài)輸出�4//
  sbit led=P1^0;
  /************//*RF寄存器配�*//*************
  // 0x00, //配置命令//
  // 0x6C, //CH_NO,配置頻段�433.2MHZ
  // 0x0E, //輸出功率�10db,不重�(fā),節(jié)電為正常模式
  // 0x44, //地址寬度�(shè)�,為4字節(jié)
  // 0x03,0x03, //接收�(fā)送有效數(shù)�(jù)�(zhǎng)度為3字節(jié)
  // 0xE7,0xE7,0xE7,0xE7,//接收地址,16位CRC校驗(yàn),外部時(shí)鐘信�(hào)使能�16M晶振//UP_CLK輸出1MHZ頻率
  // 0xDE, //CRC充許
  //******************************/
  /*uchar code RFConf[11]={0x00,0x6c,0x0e,0x44,0x03,0x03,
  0xe7,0xe7,0xe7,0xe7,0xde};
  */
  uchar RFConf[11]=
  {
  0x00, //配置命令//
  0x4c, //CH_NO,配置頻段�423MHZ
  0x0C, //輸出功率�10db,不重�(fā),節(jié)電為正常模式
  0x44, //地址寬度�(shè)置,�4字節(jié)
  0x02,0x02, //接收�(fā)送有效數(shù)�(jù)�(zhǎng)度為32字節(jié)
  0xCC,0xCC,0xCC,0xCC, //接收地址
  0x58, //CRC充許�8位CRC校驗(yàn),外部時(shí)鐘信�(hào)不使能,16M晶振
  };
  void delay(uint z)
  {
  uint x,y;
  for(x=z;x>0;x--)
  for(y=110;y>0;y--);
  }
  void SpiWrite(uchar date) //用SPI口寫�(shù)�(jù)至NRF905�(nèi)//
  {
  uchar i;
  for(i=0;i<8;i++)
  {
  delay(1);
  SCK=0;
  MOSI=(date&0x80);
  date<<=1 ;
  delay(1);
  SCK=1;
  delay(1);
  SCK=0;
  }
  SCK=0;
  }
  void TxPacket(void)
  {
  // TXEN=1;
  CSN=0;
  SpiWrite(0x22); //寫發(fā)送地址,后面�4字節(jié)地址//
  SpiWrite(0xcc);
  SpiWrite(0xcc);
  SpiWrite(0xcc);
  SpiWrite(0xcc);
  CSN=1;
  delay(1);
  CSN=0;
  SpiWrite(0x20); //寫發(fā)送數(shù)�(jù)命令,后面跟三字節(jié)�(shù)�(jù)//
  SpiWrite(0x01);
  SpiWrite(0x02);
  // SpiWrite(0x04);
  CSN=1;
  delay(1);
  TRX_CE=1;
  TXEN=1; //CE,EN同時(shí)�1,為發(fā)送模�
  delay(1); //等待�(fā)送完�//
  led=~led;
  // while(!DR); //在非屏蔽狀�(tài)�,只能發(fā)射一�
  TRX_CE=0;
  //led=~led; //加上led后,�(duì)接收�(chǎn)生了一定的影響�
  //while(!DR); //有時(shí)多接收一次的�(shù)�(jù)
  }
  void Ini_System(void)
  { //初始化配置寄存器//
  uchar i;
  // delay(1);
  CSN=1;
  SCK=0;
  DR=0;
  PWR=1; //�(jìn)入掉電模�
  TRX_CE=0;
  TXEN=0;
  delay(1);
  CSN=0; //�(jìn)入SIP模式
  for(i=0;i<11;i++)
  {
  SpiWrite(RFConf[i]); //�(shè)置配置寄存器
  }
  CSN=1; //�(guān)閉SPI,�(jìn)入發(fā)射狀�(tài)
  // PWR=1;
  }
  void main(void)
  {
  led=1;
  Ini_System(); //�(shè)置配�,并�(jìn)入發(fā)射模�
  // PWR=1; //�(jìn)入掉電模�
  while(1)
  {
  TxPacket(); //�(fā)送數(shù)�(jù)
  led=~led;
  DR=0;
  }
  }
  接收部分
  #include <reg52.h>
  #define uint unsigned int
  #define uchar unsigned char
  bit lcdbit;
  sbit TXEN = P2^7; //配置口定�7`6`5//
  sbit TRX_CE = P2^6;
  sbit PWR = P2^5;
  sbit MISO = P2^2; //SPI口定�0`1`2`3//
  sbit MOSI = P2^3;
  sbit SCK = P2^1;
  sbit CSN = P2^0;
  sbit DR = P2^4; //狀�(tài)輸出�4//
  sbit led=P1^0;
  /************//*RF寄存器配�*//*************
  // 0x00, //配置命令//
  // 0x6C, //CH_NO,配置頻段�433.2MHZ
  // 0x0E, //輸出功率�10db,不重�(fā),節(jié)電為正常模式
  // 0x44, //地址寬度�(shè)置,�4字節(jié)
  // 0x03,0x03, //接收�(fā)送有效數(shù)�(jù)�(zhǎng)度為3字節(jié)
  // 0xE7,0xE7,0xE7,0xE7,//接收地址,16位CRC校驗(yàn),外部時(shí)鐘信�(hào)使能�16M晶振//UP_CLK輸出1MHZ頻率
  // 0xDE, //CRC充許
  //******************************/
  /*uchar code RFConf[11]={0x00,0x6c,0x0e,0x44,0x03,0x03,
  0xe7,0xe7,0xe7,0xe7,0xde};
  */
  uchar RFConf[11]={ //配置命令//
  0x00,0x4c,0x0c,0x44,0x02,0x02,
  0xcc,0xcc,0xcc,0xcc,0x58 //CRC充許�8位CRC校驗(yàn),外部時(shí)鐘信�(hào)不使��16M晶振
  };
  uchar TxRxBuffer[2];
  uchar date;
  void delay(uint z)
  {
  uint x,y;
  for(x=z;x>0;x--)
  for(y=110;y>0;y--);
  }
  void SpiWrite(unsigned char date) //用SPI口寫�(shù)�(jù)至NRF905�(nèi)//
  {
  uchar i;
  for(i=0;i<8;i++)
  {
  delay(1);
  SCK=0;
  MOSI=(date&0x80);
  date<<=1 ;
  delay(1);
  SCK=1;
  delay(1);
  SCK=0;
  }
  SCK=0;
  }
  unsigned char SpiRead(void) //from 905 read data//
  {
  uchar i;
  for(i=0;i<8;i++)
  {
  date<<=1 ;
  SCK=0;
  delay(1);
  date|=MISO;
  SCK=1 ;
  delay(1);
  }
  SCK=0;
  return(date);
  }
  void RxPacket(void) //接收�(shù)�(jù)�//
  {
  uchar i;
  //while(DR)
  for (i = 0 ;i < 2 ;i++)
  {
  //led=~led;
  TxRxBuffer[i] = SpiRead();
  //i++;
  }
  }
  void Wait_Rec_Packet(void) //等待接收�(shù)�(jù)�//
  {
  // uchar temp;
  // PWR=1;
  TXEN=0; //接收模式
  TRX_CE=1;
  delay(2);
  while(!DR)
  { delay(10);
  // if(DR) //�(shù)�(jù)接收成功
  {
  led=~led;
  TRX_CE=0; //如果�(shù)�(jù)�(zhǔn)備好,則�(jìn)入待�(jī)模式,以便SPI口操�
  CSN=0;
  delay(1);
  SpiWrite(0x24); //讀nRF905所接受到的�(shù)�(jù)
  RxPacket(); //保存�(shù)�(jù)
  CSN=1;
  delay(10);
  TRX_CE=1;
  /*temp=TxRxBuffer[0]+TxRxBuffer[1]+TxRxBuffer[2];
  if(temp==0x07)
  {
  lcdbit=!lcdbit; //lcdbit=0
  }*/
  break;
  }
  }
  }
  void Ini_System(void) //初始化配置寄存器//
  {
  uchar i;
  //lcdbit=1;
  CSN=1;
  SCK=0;
  DR=0;
  PWR=1; //�(jìn)入掉電模�
  TRX_CE=0;
  TXEN=0;
  delay(1);
  CSN=0; //�(jìn)入SIP模式
  for(i=0;i<11;i++)
  {
  SpiWrite(RFConf[i]); //�(shè)置配置寄存器
  }
  CSN=1; //�(guān)閉SPI,�(jìn)入接收狀�(tài)
  PWR=1;
  //TRX_CE=1;
  //TXEN=0;
  }
  void main(void)
  {
  P0=0x00;
  led=1;
  Ini_System(); //�(shè)置配�,并�(jìn)入接收模� (收�
  PWR=1; //�(jìn)入掉電模�
  while(1)
  {
  Wait_Rec_Packet(); //等待接收完成,保存完接收數(shù)�(jù)(保存數(shù)�(jù)+地址�
  //CSN=0;
  P0 = TxRxBuffer[0];
  delay(600);
  P0 = TxRxBuffer[1];
  delay(600);
  P0 = TxRxBuffer[2];
  delay(600);
  //CSN=1;
  }
  }
  程序�(jīng)本人�(cè)試后沒太大問題,如要深入研究,本人附加詳�(xì)資料,希望對(duì)您有所幫助�

接口

  1�、模式控制接口:
  該接口由 PWR 、TRX_CE、TX_EN組成控制由nRF905組成的高頻頭的四種工作模式:掉電� SPI編程模式;待�(jī)和SPI編程模式 ;發(fā)射模�;接收模��
  2�、SPI接口�
  SPI 接口� CSN、SCK、MOSI以及MISO組成。在配置模式下單片機(jī)通過SPI接口配置高頻頭的工作參數(shù);在�(fā)�/接收模式下單片機(jī)SPI接口�(fā)送和接收�(shù)�(jù)�
  3�、狀�(tài)輸出接口�
  提供載波檢測(cè)輸出CD,地址匹配輸出AM,數(shù)�(jù)就緒輸出DR�

外圍

  1�、晶體規(guī)�
  為了�(shí)�(xiàn)晶體振蕩器低功耗和快速啟�(dòng)�(shí)間的解決方案,推薦使用低值晶體負(fù)載電�。指定CL=12pF是可以接受的。但�,也可能增大�16pF。指定一�(gè)晶體并行相等電容,Co=1.5pF也是很好�,但這樣一來會(huì)增加晶體自身成本。典型的�(shè)定晶體電容Co=1.5pF,指定Co_max=7.0pF�
  2�、外部參考時(shí)�
  一�(gè)外部參考時(shí)鐘如MCU�(shí)�,可以用來代替晶體震蕩器。這�(gè)�(shí)鐘信�(hào)�(yīng)該直接連接到XC1引腳,XC2引腳為高阻態(tài)。當(dāng)使用外部�(shí)鐘代替晶體時(shí)鐘工作時(shí),始終必須工作在Standby模式以降低電流消�。如果器件被�(shè)置成Standby模式而沒有使用外部時(shí)鐘或晶體�(shí)�,則電流消耗可�(dá)1mA�
  3�、微處理器輸出時(shí)�
  在默�(rèn)情況下,微處理器提供輸出�(shí)�。在Standby模式下提供輸出時(shí)鐘將增加電流消�。在Standby模式電流消耗取決于頻率和外部晶體負(fù)�、輸出時(shí)鐘的頻率和提供輸出時(shí)鐘的電容�(fù)��
  4�、天線輸�
  ANT1和ANT2輸出腳給天線提供�(wěn)定的RF輸出。這兩�(gè)腳必須有連接到VDD_PA的直流通路,通過RF扼流�,或者通過天線雙極的中心點(diǎn)。在ANT1和ANT2之間的負(fù)載阻抗應(yīng)該在200-700Ω范圍�(nèi),通過�(jiǎn)單的匹配�(wǎng)�(luò)或RF變壓器(不平衡變壓器)可以獲得較低的阻抗(例�50Ω��

拓展

  基于nRF905 模塊的AT89S 單片�(jī)無線收發(fā)系統(tǒng)�(shè)�(jì)
  管腳 名稱 管腳功能 說明
  1 VCC 電源 電源+3.3�3.6V DC
  2 TX_EN �(shù)字輸� 工作模式選擇
  3 TRX_CE �(shù)字輸� 使能芯片�(fā)射或接收
  4 PWR_UP �(shù)字輸� 芯片上電
  5 uCLK �(shí)鐘輸� (未使�)
  6 CD �(shù)字輸� 載波檢測(cè)
  7 AM �(shù)字輸� 地址匹配
  8 DR �(shù)字輸� 接收或發(fā)射數(shù)�(jù)完成
  9 MISO SPI 接口 SPI 輸出
  10 MOSI SPI 接口 SPI 輸入
  11 SCK SPI �(shí)� SPI �(shí)�
  12 CSN SPI 使能 SPI 使能
  13�14 GND � 接地
  下面為典型的 nRF905 模塊�(shù)�(jù)�(fā)送流程[3]�
  �1)當(dāng)微控制器要發(fā)送數(shù)�(jù)�(shí),將接收�(jī)的地址和發(fā)
  送數(shù)�(jù)通過SPI 接口傳輸給nRF905 模塊�
 ?�?)微控制器設(shè)置TRX_CE 和TX_EN 管腳同時(shí)置為
  高電平,啟動(dòng)�(fā)送端的nRF905 模塊為發(fā)送模��
 ?�?)發(fā)送端的nRF905 模塊�(fā)送過程處理:
  a)射頻寄存器開啟�
  b)數(shù)�(jù)打包(加字頭和CRC 校驗(yàn)碼)�
  c)數(shù)�(jù)包發(fā)��
  d)當(dāng)�(shù)�(jù)包發(fā)送結(jié)�,將�(shù)�(jù)�(fā)送完成管腳(DR 管腳�
  置為高電��
 ?�?)如果AUTO_RETRAN 被設(shè)置為高,nRF905 模塊
  將連續(xù)地發(fā)送數(shù)�(jù)�,直到TRX_CE 被設(shè)置為��
 ?�?)TRX_CE 被設(shè)置為低時(shí),nRF905 模塊�(shù)�(jù)包發(fā)�
  過程�(jié)束并回到待機(jī)模式�
  AT89S單片�(jī)控制nRF905 模塊�(shù)�(jù)�(fā)送流程圖如圖3
  所示�
  下面為典型的 nRF905 模塊�(shù)�(jù)接收流程[4]�
 ?�?)微控制器控制TRX_CE 為高電平、TX_EN 為低�
  �,nRF905 模塊�(jìn)入接收模式;
  �2�650us 后,nRF905 模塊�(jiān)�(cè)空中的信息,等待�
  收數(shù)�(jù)�
 ?�?)當(dāng)nRF905 模塊檢測(cè)到與接收頻率相同的載波時(shí)�
  �(shè)置載波檢�(cè)管腳(CD 管腳)為高電平;
 ?�?)當(dāng)nRF905 模塊接收到有效的地址�(shí),設(shè)置地址�
  配管腳(AM 管腳)為高電��
 ?�?)當(dāng)一�(gè)正確的數(shù)�(jù)包接收完畢后,nRF905 模塊�
  �(dòng)去掉�(shù)�(jù)包的字頭、地址和CRC 校驗(yàn)�,然后將�(shù)�(jù)�
  受完成管腳置為高電平�
  �6)微控制器將TRX_CE �(shè)置為低電平;
 ?�?)微控制器通過SPI 接口以一定的速率提取�(shù)�(jù)�
  中的有效接收�(shù)�(jù)�
 ?�?)當(dāng)所有的有效�(shù)�(jù)接收完畢,微控制器控制nRF905
  模塊�(shù)�(jù)接收完成管腳(DR 管腳)和地址匹配管腳(AM
  管腳)為低電��
 ?�?)nRF905 �(jìn)入待�(jī)模式�
  說明:(1)VCC電壓范圍為DC 3.3V�3.6V之間,不能超�3.6V否則�(huì)燒壞模塊�
 ?�?)模�
  附加更加詳細(xì)的收�(fā)程序,包括解釋:
  ////////////////////////////////////////////整體參數(shù)////////////////////////////////////////////////////
  //NewMsg-RF905-共有四種工作模式,其中有兩種活動(dòng)RX/TX模式和兩種節(jié)電模��
  //活動(dòng)模式
  // ShockBurst RX
  //ShockBurst TX
  //節(jié)電模�
  //掉電和SPI編程
  //工作模式�

 

//┏━━━━┳━━━━┳━━━━┳━━━━━━━━━━━━━━━━�

 

//┃PWR UP � TRX CE � TX_EN ┃工作模� �

 

//┣━━━━╋━━━━╋━━━━╋━━━━━━━━━━━━━━━━�

 

//�0 � x � x ┃掉電和SPI編程 �

 

//┣━━━━╋━━━━╋━━━━╋━━━━━━━━━━━━━━━━�

 

//�1 � 0 � x � Standby和SPI編程 �

 

//┣━━━━╋━━━━╋━━━━╋━━━━━━━━━━━━━━━━�

 

//�1 � 1 � O ┃ShockB urst RX �

 

//┣━━━━╋━━━━╋━━━━╋━━━━━━━━━━━━━━━━�

 

//� 1 � l � 1 ┃ShockBurst T X �

 

//┗━━━━┻━━━━┻━━━━┻━━━━━━━━━━━━━━━━?

 

//ShockBurst TX�(fā)送流�:

 

//典型的RF905�(fā)送流程分以下幾步�

 

//A.當(dāng)微控制器有數(shù)�(jù)要發(fā)送時(shí),通過SPI接口,按�(shí)序把接收�(jī)的地址和要�(fā)送的�(shù)�(jù)送傳給RF905�

 

//SPI接口的速率在通信�(xié)議和器件配置�(shí)確定�

 

//B.微控制器置高TRX_CE和TX_EN,激�(fā)RF905的ShockBurs�(fā)送模��

 

//C.RF905的ShockBurs tTMI�(fā)送:

 

//(1)射頻寄存器自�(dòng)開啟�

 

//(2)�(shù)�(jù)打包(加字頭和CRC校驗(yàn)碼)�

 

//(3)�(fā)送數(shù)�(jù)��

 

//(4)�(dāng)�(shù)�(jù)�(fā)送完�,數(shù)�(jù)�(zhǔn)備好引腳被置高;

 

//D.AUTO_REI'RAN被置�,RF905不斷重發(fā),直到TRX_CE被置��

 

//E.當(dāng)TRX-CE被置低,RF905�(fā)送過程完�,自�(dòng)�(jìn)入空閑模式�

 

//注意:ShockBurs tTM工作模式保證,一旦發(fā)送數(shù)�(jù)的過程開始,�

 

// 論TRX_EN和TX—EN引腳是高或低,發(fā)送過程都�(huì)被處理完。只�

 

// 在前一�(gè)�(shù)�(jù)包被�(fā)送完畢,RF905才能接受下一�(gè)�(fā)送數(shù)�(jù)�

 

//ShockBurst RX接收流程

 

// 接收流程

 

//A.當(dāng)TRX_CE為高、TX_EN為低�(shí),RF905�(jìn)入ShockBurs tTM接收模式�

 

//B�650us后,RF905不斷�(jiān)�(cè),等待接收數(shù)�(jù)�

 

//C.當(dāng)RF905檢測(cè)到同一頻段的載波時(shí),載波檢�(cè)引腳被置高;

 

//D.當(dāng)接收到一�(gè)相匹配的地址,AM引腳被置��

 

//E.當(dāng)一�(gè)正確的數(shù)�(jù)包接收完�,RF905自動(dòng)穆去字頭、地址和CRC

 

// 校驗(yàn)�,然后把DR引腳置高

 

//F.微控制器把TRX_CE置低,nRF905�(jìn)入空閑模��

 

//G.微控制器通過SPI口,以一定的速率把數(shù)�(jù)穆到微控制器�(nèi)�

 

//H.彼?械氖?萁郵脹甌?,nRF905把DR引腳和AM引腳置低�

 

?

 

//�(dāng)正在接收一�(gè)�(shù)�(jù)包時(shí),TRX_CE或TX_EN引腳的狀�(tài)�(fā)生改變,

 

//RF905立即把其工作模式改變,數(shù)�(jù)包則丟失。當(dāng)微處理器接到AM

 

//引腳的信�(hào)之后� 其就知道RF905正在接收�(shù)�(jù)包,其可以決定是

 

//讓RF905繼續(xù)接收該數(shù)�(jù)包還是�(jìn)入另一�(gè)工作模式�

 

///////節(jié)能模�

 

//RF905的節(jié)能模式包括關(guān)�(jī)模式和節(jié)能模��

 

//在關(guān)�(jī)模式,RF905的工作電流最�,一般為2.SuA。�(jìn)入關(guān)�(jī)�

 

//式后,RF905保持配置字中的內(nèi)容,但不�(huì)接收或發(fā)送任何數(shù)�(jù)?�?/DIV>

 

//閑模式有利于減小工作電流,其從空閑模式到�(fā)送模式或接收模式�

 

//啟動(dòng)�(shí)間也比較�。在空闌模式�,RF905�(nèi)部的部分晶體振蕩器處

 

//于工作狀�(tài)?

 

//�、配置NeWMsg-RF905模塊

 

//所有配置字都是通過SPlI接口送給RF905。SIP接口的工作方式可

 

//通過SPlI指令�(jìn)行設(shè)�。當(dāng)RF905處于空閑模式或關(guān)�(jī)模式�(shí),SPI

 

//按口可以保持在工作狀?

 

//SPI寄存器配�

 

//SPI接口�5�(gè)�(nèi)部寄存器組成。執(zhí)行寄存器的回讀模式來確�(rèn)寄存器的�(nèi)容�

 

//狀�(tài)寄存�(Status-Register)

 

//寄存器包含數(shù)�(jù)就緒(DR)和地址匹配(AM)狀�(tài)�

 

//RF配置寄存�(RF-Configuration Register)

 

//寄存器包含收�(fā)器的頻率,輸出功率等配置信息�

 

//�(fā)送地址(IX-Address)

 

//寄存器包含目�(biāo)器件地址,字節(jié)�(zhǎng)度由配置寄存器設(shè)置�

 

//�(fā)送有效數(shù)�(jù)( IX-Payload)

 

//寄存器包含發(fā)送的有效ShockBurst�(shù)�(jù)包數(shù)�(jù),字節(jié)�(zhǎng)度由配置寄存器設(shè)��

 

//接收有效�(shù)�(jù)( IX-Payload)

 

//寄存器包含接收到的有效ShockBurst�(shù)�(jù)包數(shù)�(jù),字節(jié)�(zhǎng)度由配置寄存器設(shè)�。在寄存器中的有效數(shù)�(jù)�

 

//�(shù)�(jù)�(zhǔn)備就�(DR)指荊

 

//SPI指令�(shè)�

 

//用于SPI接口的有用命令見下表。當(dāng)CSN為低�(shí),SPI接口開始等待一條指令,任何一條新指令均由CSN

 

//的由高到低的�(zhuǎn)換開��

 

//┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

 

//� SPI串行接口指令 �

 

//┣━━━━━━┳━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫

 

//┃指令名� ┃指令格� ┃操� �

 

//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫

 

//┃W CONFIG � OOOOAAAA ┃寫配置寄存器。AAAA指出寫操作的開始字節(jié),字節(jié)�(shù)量取決于 �

 

//�(WC) � ┃AAAA指出的開始地址� �

 

//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫

 

//┃R CONFIG � OOOIAAAA ┃讀配置寄存�。AAAA指出讀操作的開始字節(jié),字節(jié)�(shù)量取決于 �

 

//�(RC) � ┃AAAA指出的開始地址� �

 

//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫

 

//┃W TX PAYLOA � 00100000 ┃寫TX有效�(shù)�(jù)�1-32字節(jié)。寫操作全部從字節(jié)o開始� �

 

//┃D � � �

 

//�(WTP) � � �

 

//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫

 

//┃R TX PAYLOA � 00100001 ┃讀TX有效�(shù)�(jù)�1-32字節(jié)。讀操作全部從字節(jié)o開始� �

 

//┃D � � �

 

//�(RTP) � � �

 

//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫

 

//┃W TX ADDRES �00100010 ┃寫TX地址�1-4字節(jié)。寫操作全部從字節(jié)o開始 �

 

//┃S � � �

 

//�(WTA) � � �

 

//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫

 

//┃R TX ADDRES �0010001 1 ┃讀TX地址�1-4字節(jié)。讀操作全部從字節(jié)o開始� �

 

//┃S � � �

 

//�(RTA) � � �

 

//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫

 

//┃R RX PAYLOA � 001 001 00 ┃讀RX有效�(shù)�(jù)�1-32字節(jié)。讀操作全部從字節(jié)o開始� �

 

//┃D � � �

 

//�(RRP) � � �

 

//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫

 

//┃CHANNEL CON ┃lOOOpphc ┃快速設(shè)置配置寄存器中CH NO,HFREQ_PLL和PA PWR的專� �

 

//┃FIG ┃cccccccc ┃命令_ CH NO=ccccccccc: HFREQ_PLL=h: PA_PWR=pp �

 

//�(CC) � � �

 

//┗━━━━━━┻━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━�

 

#include <reg52.h>

 

//#include <ABSACC.h>

 

//#include <intrins.h>

 

//#include <stdio.h>

 

////----------------------------------------------------------------------------------------------------------------

 

#define uint unsigned int

 

#define uchar unsigned char

 

//----------------------------------------------------------------------------------------------------------------

 

#define BYTE_BIT00x01

 

#define BYTE_BIT1 0x02

 

#define BYTE_BIT2 0x04

 

#define BYTE_BIT3 0x08

 

#define BYTE_BIT4 0x10

 

#define BYTE_BIT5 0x20

 

#define BYTE_BIT6 0x40

 

#define BYTE_BIT70x80

 

//----------------------------------------------------------------------------------------------------------------

 

bdata unsigned char DATA_BUF;//可位尋址的片�(nèi)RAN

 

#define DATA7((DATA_BUF&BYTE_BIT7) != 0)

 

#define DATA0 ((DATA_BUF&BYTE_BIT0) != 0)

 

sbitflag=DATA_BUF^7;

 

sbitflag1=DATA_BUF^0;

 

//------------------------------------ �(fā)送數(shù)�(jù)緩沖區(qū)-------------------------------------------------

 

#define TxRxBuf_Len 4

 

unsigned char TxRxBuf[TxRxBuf_Len]={0x29,0x30,0x31,0x32,};

 

code TxAddress[4]={0xcc,0xcc,0xcc,0xcc};

 

char tf;

 

//----------------------------------------NRF905工作模式控制端口------------------------------------------------------

 

sbitTXEN=P2^4;//�(fā)射使�

 

sbitTRX_CE=P3^2;//�(fā)射接收使�

 

sbitPWR=P2^3;

 

//----------------------------------------LED顯示端口---------------------------------------------------

 

sbit LED=P1^0;

 

//----------------------------------------NRF905 �(shù)�(jù)交換端口(SPI)---------------------------------------------------

 

sbitMISO=P2^6;//輸出

 

sbitMOSI=P2^1;//輸入

 

sbitSCK=P2^5;//�(shí)�

 

sbitCSN=P2^0;//使能

 

//----------------------------------------nrf905狀�(tài)端口---------------------------------------------------------

 

sbitAM=P2^7;

 

sbitDR=P3^3;

 

sbitCD=P2^2;

 

//---------------------------------------------------------------------------------------------------------------

 

//----------------------------------------按鍵端口-------------------------------------------------------

 

sbitKEY=P3^7;

 

//---------------------nrf905控制指令-------------------------------------------

 

#define WC0x00 //寫配置寄存器

 

#define RC0x10 //讀配置寄存�

 

#define WTP0x20 //向TX-Payload寄存器寫入發(fā)送有效數(shù)�(jù)

 

#define RTP0x21 //向TX-Payload寄存器讀取發(fā)送有效數(shù)�(jù)

 

#define WTA0x22 //向TX-Addtess寄存器寫入發(fā)送地址

 

#define RTA0x23 //向TX-Addtess寄存器讀取發(fā)送地址

 

#define RRP0x24 //從RX-Payload寄存器讀取接收到的有效數(shù)�(jù)

 

//------------------------------------------NRF905寄存器配�------------------------------------------------

 

unsigned char idata RFConf[11]=

 

{

 

0x00, //配置命令//

 

0x4c, //CH_NO,配置頻段�430MHZ字節(jié)0,配置頻�

 

0x0c, //輸出功率�10db,不重�(fā),節(jié)電為正常模式 字節(jié)1�000 1100

 

0x44, //地址寬度�(shè)�,為4字節(jié)字節(jié)2�6:4 是TX地址寬度� 2�0是RX地址寬度

 

0x04,0x04, //接收�(fā)送有效數(shù)�(jù)�(zhǎng)度為4字節(jié)字節(jié)3(RX�,字節(jié)(TX):可設(shè)置為1�2�4�8�16�32 字節(jié),其�6�7 兩位為空,寫00,則4字節(jié)�:0000 0100 : 0x04 依次類推

 

0xCC,0xCC,0xCC,0xCC, //接收地址字節(jié)5到字節(jié)8

 

0x58, //CRC充許�8位CRC校驗(yàn),外部時(shí)鐘信�(hào)不使能,16M晶振 字節(jié)9�

 

};

 

//================================================延時(shí)===========================================================

 

void nrf905_Delay(int n)

 

{

 

uint i;

 

while(n--)

 

for(i=0;i<80;i++);

 

}

 

//=================================================SPI讀函數(shù)=======================================================

 

//步驟一:MISO線準(zhǔn)備好需要發(fā)送的�(shù)�(jù)�

 

//步驟二:SCK置高,主�(jī)讀取MISO線上的數(shù)�(jù)

 

//步驟�:SCK置低,準(zhǔn)備接收數(shù)�(jù)的下一�

 

// 以上步驟循環(huán)�(zhí)�8�,通過SPI從器件上讀取數(shù)�(jù)完成�

 

//�(shù)�(jù)傳送時(shí)�。高位在前,低位在后�

 

unsigned char SpiRead(void)

 

{

 

unsigned char j;

 

for (j=0;j<8;j++)

 

{

 

DATA_BUF=DATA_BUF<<1;

 

SCK=1;

 

if (MISO)//讀取位,保存至最末尾,通過左移位完成整�(gè)字節(jié)

 

{

 

DATA_BUF|=BYTE_BIT0;

 

}

 

else

 

{

 

DATA_BUF&=~BYTE_BIT0;

 

}

 

SCK=0;

 

}

 

return DATA_BUF;

 

}

 

//===========================================SPI寫函�(shù)===============================================================

 

//步驟一:MOSI線準(zhǔn)備好需要發(fā)送的�(shù)�(jù)�

 

//步驟二:SCK置高,器件讀取MOSI線上的數(shù)�(jù)

 

//步驟�:SCK置低,準(zhǔn)備發(fā)送數(shù)�(jù)的下一�

 

// 以上步驟循環(huán)�(zhí)�8次,通過SPI從器件上�(fā)送數(shù)�(jù)完成�

 

//�(shù)�(jù)傳送時(shí)�。低位在�,高位在��

 

void SpiWrite(unsigned char send)

 

{

 

unsigned char i;

 

DATA_BUF=send;

 

for (i=0;i<8;i++)

 

{

 

if (DATA7)//總是�(fā)送位

 

{

 

MOSI=1;//SPI輸入,主�(jī)寫操�

 

}

 

else

 

{

 

MOSI=0;

 

}

 

SCK=1;

 

DATA_BUF=DATA_BUF<<1;

 

SCK=0;

 

}

 

}

 

//--------------------------------------初始化nRF905---------------------------------------------

 

void nRF905Init(void)

 

{

 

CSN=1;// Spi disable

 

SCK=0;// Spi clock line init low

 

DR=1;// Init DR for input

 

AM=1;// Init AM for input

 

CD=1;// Init CD for input

 

PWR=1;// nRF905 power on

 

TRX_CE=0;// Set nRF905 in standby mode

 

TXEN=0;// set radio in Rx mode

 

}

 

//-----------------------------------------------------初始化寄存器-----------------------------------------------

 

//步驟一:CSN置低電平,SPI接口開始等待條命�

 

//步驟二:�(diào)用SpiWrite函數(shù),向nrf905�(fā)送WC指令,準(zhǔn)備寫入配置信�

 

//步驟三:反復(fù)�(diào)用SpiWrite函數(shù),向器件配置寄存器寫入配置信�

 

//步驟四:CSN置高電平,結(jié)束SPI通訊。即nrf905配置完成�

 

void Config905(void)

 

{

 

uchar i;

 

CSN=0;// CSN片選信號(hào),SPI使能

 

//SpiWrite(WC);// �905芯片寫配置命�

 

for (i=0;i<11;i++)// 循環(huán)寫入配置信息

 

{

 

SpiWrite(RFConf[i]); //RxTxConf保存�(yù)先設(shè)置好的配置信�

 

}

 

CSN=1;// �(jié)束SPI�(shù)�(jù)傳輸

 

}

 

//-------------------------------�(fā)送數(shù)�(jù)打包---------------------------------------------------

 

//步驟一:通過SpiWrite函數(shù)�(fā)送WTP命令,準(zhǔn)備寫入TX有效�(shù)�(jù)

 

//步驟二:循環(huán)�(diào)用SpiWrite向TX-Payload寄存器寫入有效數(shù)�(jù)(中間必須夾有CSN電平變化�

 

//步驟三:延時(shí)

 

//步驟四: 通過SpiWrite函數(shù)�(fā)送WTA命令,準(zhǔn)備寫入TX地址

 

//步驟五:循環(huán)�(diào)用SpiWrite向TX-Address寄存器寫入TX地址

 

//步驟六:TRC_CE=1;開始發(fā)送數(shù)�(jù),延�(shí),nrf905�(shù)�(jù)�(fā)送完成,

 

//�(dāng)nrf905接收到一條完成的信息�(shí),會(huì)將DR引腳置高�

 

void TxPacket(uchar *TxRxBuf)

 

{

 

uchar i;

 

//Config905();

 

CSN=0;

 

SpiWrite(WTP);// Write payload command

 

for (i=0;i<4;i++)

 

{

 

SpiWrite(TxRxBuf[i]);// 寫入32直接�(fā)送數(shù)�(jù)

 

}

 

CSN=1;

 

nrf905_Delay(1);// �(guān)閉SPI,保存寫入的�(shù)�(jù)

 

CSN=0;// SPI使能,保存寫入的�(shù)�(jù)

 

SpiWrite(WTA);// 寫數(shù)�(jù)至地址寄存�

 

for (i=0;i<4;i++)// 寫入四字節(jié)地址 寫入與對(duì)方地址一樣的地址

 

{

 

SpiWrite(TxAddress[i]);

 

}

 

CSN=1;// �(guān)閉SPI

 

TRX_CE=1;// �(jìn)入發(fā)送模�,啟�(dòng)射頻�(fā)�

 

nrf905_Delay(1);//�(jìn)入ShockBurst�(fā)送模式后,芯片保存數(shù)�(jù)

 

TRX_CE=0;// �(fā)送完成后返回ATANDBY模式 while (DR!=1);

 

}

 

//----------------------------------------------�(shè)置發(fā)送初始狀�(tài)---------------------------------------------

 

void SetTxMode(void)

 

{

 

TRX_CE=0;

 

TXEN=1;

 

nrf905_Delay(1); // nrf905_Delay for mode change(>=650us)

 

}

 

//步驟一:TRX_ce=0;必須將次引腳置�,使905�(jìn)入standby模式

 

//步驟二:�(fā)送RRP指令

 

//步驟三:循環(huán)�(diào)用SpiWrite函數(shù),讀取接收到的數(shù)�(jù)

 

//步驟四:等待DR和AM引腳�(fù)位為低電�

 

// AM 地址匹配,接收到有效地址,被置高

 

// DR 接收到有效數(shù)�(jù)包,并解碼后,被置高,當(dāng)所有有效數(shù)�(jù)被讀取后�

 

// nrf905降A(chǔ)M和DR置低,需要注意的�,必須首先設(shè)置器件的

 

// �(fā)�/接收模式才能保證有效的數(shù)�(jù)�(fā)生接�

 

//-----------------------------------------------�(shè)置nrf905�(jìn)入接收模�---------------------------------------------------

 

void SetRxMode(void)

 

{

 

TXEN=0;

 

TRX_CE=1;

 

nrf905_Delay(1); // nrf905_Delay for mode change(>=650us)

 

}

 

//-------------------------------------判斷�(shù)�(jù)接收狀�(tài)-----------------------------------------------------

 

unsigned char CheckDR(void)//檢查是否有新�(shù)�(jù)傳入 Data Ready

 

{

 

DR=1;

 

//通過�(duì)端口�1,可以使端口為輸入狀�(tài),�51� 特�。不熟悉者可以參�51相關(guān)書籍作證(將DR端口�(shè)置為輸入狀�(tài)�)

 

if (DR==1)

 

{

 

DR=0;

 

return 1;

 

}

 

else

 

{

 

return 0;

 

}

 

}

 

//----------------------------NRF905接收到數(shù)�(jù)后讀取保�------------------------------------------------------------

 

void RxPacket(void)

 

{

 

uchar i;

 

nrf905_Delay(1);

 

//TRX_CE=0;// �(shè)�905�(jìn)入待�(jī)模式

 

nrf905_Delay(100);

 

TRX_CE=0;

 

CSN=0;// 使能SPI

 

nrf905_Delay(1);

 

SpiWrite(RRP); //�(zhǔn)備讀取接收到的數(shù)�(jù)

 

for (i = 0 ;i < 4 ;i++)

 

{

 

TxRxBuf[i]=SpiRead();// 通過SPI接口�905芯片讀取數(shù)�(jù)

 

}

 

CSN=1;//禁用SPI

 

nrf905_Delay(10);

 

TRX_CE=1;

 

}

 

//--------------------------------------------------------�(shù)�(jù)接收------------------------------------------------

 

void RX(void)

 

{

 

SetRxMode();

 

// while (CheckDR()==0); 為了�(shí)�(xiàn)雙向通信,就不能一直處于接收等待狀�(tài),所以注釋掉

 

nrf905_Delay(10);

 

RxPacket();

 

if(TxRxBuf[0]==0x29)

 

{

 

LED=0;

 

nrf905_Delay(300);

 

LED=1;

 

nrf905_Delay(300);//接收到數(shù)�(jù) 后閃�

 

}

 

}

 

//-----------------------------------------------------------------------------------------------------------------

 

void main(void)

 

{

 

nRF905Init();

 

Config905();

 

LED=1;

 

while(1)

 

{

 

RX();

 

if(KEY ==0 )

 

{

 

while(KEY==0);

 

tf = 1 ;

 

TxRxBuf[0]=0x29;

 

}

 

if (tf==1)

 

{

 

SetTxMode();

 

TxPacket(TxRxBuf);// �(fā)送命令數(shù)�(jù)

 

LED=0;

 

nrf905_Delay(300);

 

LED=1;

 

nrf905_Delay(300);//�(fā)送后LED閃爍

 

tf = 0;

 

}

 

}

 

}