久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4051|回復: 0
打印 上一主題 下一主題
收起左側

nrf24l01d發射機 接收機 無線通信程序那點事!!!!!

[復制鏈接]
跳轉到指定樓層
樓主
ID:26188 發表于 2015-6-23 16:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
從2015年5月15號開始做無線通訊的。開始我并沒有重視這個無線通信,但是偶爾一次去工地的路上看見一個城建鋼筋場地里的龍門吊,那個傻逼竟然用遙控器控制龍門吊!!開始驚奇,轉而又想我能不能做呢?我分析其實關于控制部分早在技校里就學了,正反轉嗎,不難,但是中間你要實現遙控就不易了,我還是模塊化思路,我搞到了RF模塊,開始進入了漫漫的實驗之路,射頻信號我在此之前根本不懂,也不知道是個什么東西,只是知道手機里有那個東西,數據手冊有兩種一種是英文的,一種是翻譯的中文,因為在這方面我還是有經驗的,不能盡心中文資料,要信英文資料,但是翻譯太麻煩了要用中文資料為參考。
    我的第一個實驗便是RF模塊與主控芯片之間的通信問題,因為無線通信的流程大概是這樣的:發送端 數據和信號送入模塊的數據區,CRC效驗后打包,然后打包后的信號送往調制器進行調制,調制完畢后進入射頻功率放大,然后通過天線發射出去;接收端 實時監測空中信號,如果有信號那么接收回來,解調處理,然后對包進行逆打包,CRC效驗,地址是否匹配,如果一切正確那么就把數據信號送入數據緩沖區。也就完成了一次通信!和電視和收音機差不多,所以模塊與主控通信的重要性關系到你能否駕馭它了!!可喜可賀的是我沒用幾天就解決這一問題了,因為它使用的外圍數據接口以前我用的很多,解決了主機和模塊之間的對話下一步是對RF模塊的設置和通信的程序,我沒想到這可是難倒我了,任憑我怎樣設置怎樣修改,就是無法發射,沒有接收,沒有任何的檢測工具,我開始懷疑芯片的好壞!是不是壞了?那為什么還能讀寫呢?又上網找資料找朋友,但是這個東西可不像別的,沒有任何教學視頻可參考,網上的程序也很爛,說實話我看不下去,我只會用我的思路來編程,他們的太精致了,各種猜測,輾轉反側,夜不能寐。很快就過春節了,我和爸爸1月27號回的家,本想著在家里搞,可是到家后沒時間搞,和老爸弄自來水管,寫春聯,收拾房屋,打掃衛生,可以這么說,今年的春節我是最累的,過了春季有忙著和朋友們玩DOTA,走親戚,來親戚,轉眼初九了,又極不情愿的踏上了北上打工的旅途!哎!!!人啊!!!



接收機:
  1. /*無線模塊定義*/
  2. sbit CE=P1^3;//nrf24l01d的模式控制線在 CSN 為低的情況下,CE 協同NRF24L01 的CONFIG 寄存器共同決定NRF24L01 的狀態(參照NRF24L01 的狀態機)
  3. sbit CSN=P1^4;//nrf24l01d的片選線,低電平有效
  4. sbit IRQ=P1^5;//nrf24l01d的中斷信號


  5. /*SPI定義
  6. */
  7. sbit  SI=P1^0;//MOSI主出-從入
  8. sbit  SO=P1^1;//MISO主入-從出
  9. sbit  SCK=P1^2;// 時鐘信號

  10. /*定義無線模塊的收發狀態位
  11. */
  12. unsigned char bdata FLAGE;
  13. sbit MAX_RT=FLAGE^4; //達到最大發送次數置1
  14. sbit TX_DS=FLAGE^5;//數據發送被置1
  15. sbit RX_DR=FLAGE^6;//數據接收被置1

  16. /*可謂操作字節dat定義,用來構成最底層的SPT讀寫函數使用
  17. */
  18. unsigned char bdata dat;
  19. sbit dat_0=dat^0;
  20. sbit dat_1=dat^1;
  21. sbit dat_2=dat^2;
  22. sbit dat_3=dat^3;
  23. sbit dat_4=dat^4;
  24. sbit dat_5=dat^5;
  25. sbit dat_6=dat^6;
  26. sbit dat_7=dat^7;

  27. /*串口程序*/
  28. void InitUART(void)
  29. {
  30.     TMOD = 0x20;
  31.     SCON = 0x50;
  32.     TH1 = 0xFD;
  33.     TL1 = TH1;
  34.     PCON = 0x00;
  35.     EA = 1;
  36.     ES = 1;
  37.     TR1 = 1;
  38. }
  39. void UARTInterrupt(void) interrupt 4
  40. {
  41.     if(RI)
  42.     {
  43.         RI = 0;

  44.   //add your code here!
  45.     }
  46.     else
  47.         TI = 0;
  48. }

  49. void SendOneByte(unsigned char c)
  50. {
  51.     SBUF = c;
  52.     while(!TI);
  53.     TI = 0;
  54. }

  55. /*串口程序*/
  56. /*SPI最底層寫一個字節函數
  57. 無返回值
  58. 有參
  59. 帶形參H
  60. */

  61. void delay1ms(uchar time)//1ms
  62. {

  63. unsigned char a,b,c,d;
  64.   for(d=time;d>0;d--)

  65.       for(c=8;c>0;c--)
  66.         for(b=197;b>0;b--)
  67.             for(a=2;a>0;a--);

  68. }



  69. void delay10us(uchar time)//10us
  70. {
  71.    unsigned char a,b,c;
  72.   for(c=time;c>0;c--)
  73.     for(b=1;b>0;b--)
  74.         for(a=52;a>0;a--);


  75. }





  76. /*************************
  77.         *
  78. SPI寫一個字節的最底層函數 *
  79. 有參       *
  80. 無返回值      *
  81. ***************************/
  82. void write_spi_2401(uchar h)//SPI寫一字節函數
  83. {
  84.             dat=h;



  85.             SI=dat_7;
  86.       delay10us(10);
  87.    
  88.       SCK=0;   
  89.       SCK=1;
  90.       
  91.    
  92.       SI=dat_6;
  93.       delay10us(10);
  94.      
  95.       SCK=0;
  96.       SCK=1;
  97.       
  98.    

  99.       SI=dat_5;
  100.       delay10us(10);
  101.    
  102.       SCK=0;
  103.       SCK=1;
  104.               

  105.    

  106.       SI=dat_4;
  107.       delay10us(10);
  108.    
  109.       SCK=0;
  110.       SCK=1;
  111.         
  112.      

  113.        SI=dat_3;
  114.     delay10us(10);
  115.    
  116.       SCK=0;
  117.       SCK=1;
  118.         
  119.      

  120.        SI=dat_2;
  121.     delay10us(10);
  122.      
  123.       SCK=0;
  124.       SCK=1;
  125.         


  126.     SI=dat_1;
  127.     delay10us(10);
  128.    
  129.       SCK=0;
  130.       SCK=1;
  131.         
  132.      

  133.     SI=dat_0;
  134.     delay10us(10);
  135.          
  136.       SCK=0;
  137.       SCK=1;
  138.         
  139.    


  140. }

  141. /************************
  142. SPI最底層讀取一個字節  *
  143. 返回值是讀出的這一個字節 *
  144. 無參      *
  145.        *
  146. *************************/
  147. uchar read_spi_2401()//SPI讀一字節函數
  148. {
  149.          SO=1;//初始化SO線


  150.          SCK=1;
  151.    SCK=0;
  152.   
  153.     dat_7=SO;
  154.      
  155.   SCK=1;
  156.   SCK=0;

  157.     dat_6=SO;
  158.       
  159.   SCK=1;
  160.   SCK=0;

  161.   
  162.     dat_5=SO;
  163.    
  164.   SCK=1;
  165.   SCK=0;

  166.   
  167.     dat_4=SO;
  168.    
  169.      SCK=1;  
  170.      SCK=0;
  171.   
  172.    
  173.     dat_3=SO;
  174.    
  175.      SCK=1;
  176.   SCK=0;
  177.   
  178.    
  179.     dat_2=SO;
  180.    
  181.      SCK=1;
  182.   SCK=0;
  183.   
  184.    
  185.     dat_1=SO;
  186.      

  187.      SCK=1;
  188.   SCK=0;
  189.    
  190.     dat_0=SO;
  191.    

  192.    return (dat);//返回讀取數值


  193. }


  194. /****************************
  195.        *
  196. 寫入寄存器命令函數   *
  197. 有參      *
  198. 無返回值     *
  199.        *
  200. m:表示要操作的寄存器地址 *
  201. date:表示要向內不寫入的數據 *
  202. *****************************/

  203. void write_rge_nrf24l01(uchar m,uchar date)
  204. {
  205.   SCK=0;//時鐘預選拉低
  206.   CSN=1;
  207.   CSN=0; //SPI開
  208.     write_spi_2401((0x20+m));//寫入寫寄存器命令
  209.     write_spi_2401(date);//寫入date指向的寄存器數據
  210. CSN=1;//SPI關


  211. }
  212. /*************************
  213.         *
  214. 度寄存器子函數     *
  215. 將寄存器的數值讀出    *
  216. 有參  M表示要讀的寄存器   *
  217. 有返回值 返回讀出的數據   *
  218.                           *
  219. **************************/
  220. uchar read_reg_nrf24l01(uchar m)
  221. {  uchar date;

  222.    SCK=0;
  223.   CSN=1;
  224.   CSN=0;
  225.     write_spi_2401(m);//讀寄存器
  226. date=read_spi_2401();
  227. CSN=1;


  228. return (date);
  229. }



  230. /***************************
  231.          *
  232. 待機模式進入后相關對寄存器 *
  233. 的設置函數           *
  234.                            *
  235. ****************************/
  236. void set_Register_tx()//"待機-I模式下的對寄存器的設置  接收機  接收地址是ABABABABAB,通道0,一字節有效數據
  237. {
  238.   
  239.    
  240.    


  241. // 下段是寄存器設置在待機-I模式完成



  242.   

  243.    write_rge_nrf24l01(0x01,0x3f);/*允許所有自動應答開啟*///EN_AA使能自動應答功能
  244.   
  245.    write_rge_nrf24l01(0x02,0x3f);/*允許所有接收地址開啟*///EN_RXADDR接收地址允許

  246.    write_rge_nrf24l01(0x03,0x03);/*所有地址通道的收發地址寬度設為5字節*///STEUP_AW設置地址寬度所有通道

  247.    write_rge_nrf24l01(0x04,0x28);/*允許建立自動重發延時為(750+86us)自動重發計數次數為8次*///STEUP_RETR建立自動重發

  248.    write_rge_nrf24l01(0x11,0x01);/*接收數據通道0 有效數據寬度  一字節*///RX_PW_P0接收通道0有效數據寬度
  249.    








  250.   







  251. /**********************************************/
  252. // 本段是對接收機的地址設置在待機-I模式完成
  253. //
  254. /**********************************************/






  255. /*這里有必要說明下,由于以上的設置寄存器都是一個字節的所以我使用了子函數,這個是發射/接收地址 我沒使用因為上面的只能寫一個字節*/

  256.   SCK=0;//時鐘預選拉低
  257.   CSN=1;
  258.   CSN=0; //SPI開
  259.     write_spi_2401(0x2a);//寫入寫寄存器命令       /* RX_ADDR_P0 數據通道0接收地址設為0xABABABABAB */
  260.     write_spi_2401(0xab);//寫入date指向的寄存器數據
  261. write_spi_2401(0xab);//寫入date指向的寄存器數據         
  262. write_spi_2401(0xab);//寫入date指向的寄存器數據     
  263. write_spi_2401(0xab);//寫入date指向的寄存器數據
  264. write_spi_2401(0xab);//寫入date指向的寄存器數據
  265. CSN=1;//SPI關
  266.   

  267. }





  268. void main () //主函數
  269. {   
  270.   uchar i;


  271.        InitUART();//初始化串口
  272.      
  273.       
  274.     SendOneByte(0xf8);//發送標志位
  275. FLAGE=read_reg_nrf24l01(0x17);//狀態寄存器讀取
  276. SendOneByte(FLAGE);
  277. FLAGE=read_reg_nrf24l01(0x07);//狀態寄存器讀取;發射前讀取狀態寄存器
  278.     SendOneByte(FLAGE);


  279.    delay1ms(200);//開機上電復位延時200毫秒后進入掉電模式
  280.   
  281.   
  282.     CSN=1;
  283.     SCK=0;
  284.       CE=0;         //發射使能關閉或叫初始化


  285.      write_rge_nrf24l01(0x00,0x0f);/*只允許中斷開啟,CRC使能,16位,PWR_UP=1(上電),PRIM_RX=1(接收模式)*///配置寄存器



  286.   delay1ms(50);//此處指著個延時很管用,標志著24L01由掉電模式向待機-I模式轉換的過程,以上是掉電模式一下就是待機-I模式了
  287.   


  288.   

  289.     set_Register_tx();// 待機1模式下的寄存器配置
  290.   

  291.   
  292. while(1)
  293.   {
  294.   
  295.       

  296.    


  297. //***********************************************************************
  298.    
  299.    
  300.   
  301.   



  302.      CE=1;//進入接收模式
  303.   

  304. //*888888888888888888888888888888888888888888888888888888


  305.     do
  306. {
  307.        // SendOneByte(0xe8);//發送標志位
  308. FLAGE=read_reg_nrf24l01(0x07);//狀態寄存器讀取;
  309.     //SendOneByte(FLAGE);

  310. }
  311. while((~RX_DR)); //檢查是否接收數據?如果接收到向下,接收不到等待

  312.         CE=0;//進入待機一I模式
  313.   
  314.   write_rge_nrf24l01(0x07,0x4e);/*清除接收中斷信號*/
  315.    

  316.             
  317. //***********************************
  318.       //這一步是讀FIFO數據,讀完FIFO清空
  319.            
  320.      CE=0;      
  321.      SCK=0;      
  322.      CSN=1;
  323.      CSN=0;
  324.   
  325. write_spi_2401(0x61);//讀FIFO寄存器

  326.   i=read_spi_2401();
  327.    
  328.                //數據     注意這里我只要發送一個字節的數據,可以最大一次發送32字節 從0字節開始讀


  329.      

  330.       CSN=1;

  331. //****************************************


  332.   
  333. SendOneByte(0xe8);//發送標志位
  334. FLAGE=read_reg_nrf24l01(0x07);//狀態寄存器讀取;
  335.     SendOneByte(FLAGE);
  336.      
  337. SendOneByte(i); //發送接收到的數據到PC


  338. }



  339. }
復制代碼


發射機程序:


  1. /*無線模塊定義*/
  2. sbit CE=P1^3;//nrf24l01d的模式控制線在 CSN 為低的情況下,CE 協同NRF24L01 的CONFIG 寄存器共同決定NRF24L01 的狀態(參照NRF24L01 的狀態機)
  3. sbit CSN=P1^4;//nrf24l01d的片選線,低電平有效
  4. sbit IRQ=P1^5;//nrf24l01d的中斷信號


  5. /*SPI定義
  6. */
  7. sbit  SI=P1^0;//MOSI主出-從入
  8. sbit  SO=P1^1;//MISO主入-從出
  9. sbit  SCK=P1^2;// 時鐘信號

  10. /*無線模塊的狀態位定義
  11. */
  12. unsigned char bdata FLAGE;
  13. sbit MAX_RT=FLAGE^4; //達到最大發送次數置1
  14. sbit TX_DS=FLAGE^5;//數據發送被置1
  15. sbit RX_DR=FLAGE^6;//數據接收被置1


  16. /*可謂操作字節dat定義,用來構成最底層的SPT讀寫函數使用
  17. */
  18. unsigned char bdata dat;
  19. sbit dat_0=dat^0;
  20. sbit dat_1=dat^1;
  21. sbit dat_2=dat^2;
  22. sbit dat_3=dat^3;
  23. sbit dat_4=dat^4;
  24. sbit dat_5=dat^5;
  25. sbit dat_6=dat^6;
  26. sbit dat_7=dat^7;

  27. /*串口程序*/
  28. void InitUART(void)
  29. {
  30.     TMOD = 0x20;
  31.     SCON = 0x50;
  32.     TH1 = 0xFD;
  33.     TL1 = TH1;
  34.     PCON = 0x00;
  35.     EA = 1;
  36.     ES = 1;
  37.     TR1 = 1;
  38. }
  39. void UARTInterrupt(void) interrupt 4
  40. {
  41.     if(RI)
  42.     {
  43.         RI = 0;

  44.   //add your code here!
  45.     }
  46.     else
  47.         TI = 0;
  48. }

  49. void SendOneByte(unsigned char c)
  50. {
  51.     SBUF = c;
  52.     while(!TI);
  53.     TI = 0;
  54. }

  55. /*串口程序*/
  56. /*SPI最底層寫一個字節函數
  57. 無返回值
  58. 有參
  59. 帶形參H
  60. */

  61. void delay1ms(uchar time)//1ms
  62. {

  63. unsigned char a,b,c,d;
  64.   for(d=time;d>0;d--)

  65.       for(c=8;c>0;c--)
  66.         for(b=197;b>0;b--)
  67.             for(a=2;a>0;a--);

  68. }

  69. void delay10us(uchar time)//10us
  70. {
  71.    unsigned char a,b,c;
  72.   for(c=time;c>0;c--)
  73.     for(b=1;b>0;b--)
  74.         for(a=52;a>0;a--);


  75. }





  76. /**********************
  77. SPI寫一個字節的最底層函數
  78. 有參
  79. 無返回值
  80. ***********************/
  81. void write_spi_2401(uchar h)//SPI寫一字節函數
  82. {
  83.             dat=h;



  84.             SI=dat_7;
  85.       delay10us(10);
  86.    
  87.       SCK=0;   
  88.       SCK=1;
  89.       
  90.    
  91.       SI=dat_6;
  92.       delay10us(10);
  93.      
  94.       SCK=0;
  95.       SCK=1;
  96.       
  97.    

  98.       SI=dat_5;
  99.       delay10us(10);
  100.    
  101.       SCK=0;
  102.       SCK=1;
  103.               

  104.    

  105.       SI=dat_4;
  106.       delay10us(10);
  107.    
  108.       SCK=0;
  109.       SCK=1;
  110.         
  111.      

  112.        SI=dat_3;
  113.     delay10us(10);
  114.    
  115.       SCK=0;
  116.       SCK=1;
  117.         
  118.      

  119.        SI=dat_2;
  120.     delay10us(10);
  121.      
  122.       SCK=0;
  123.       SCK=1;
  124.         


  125.     SI=dat_1;
  126.     delay10us(10);
  127.    
  128.       SCK=0;
  129.       SCK=1;
  130.         
  131.      

  132.     SI=dat_0;
  133.     delay10us(10);
  134.          
  135.       SCK=0;
  136.       SCK=1;
  137.         
  138.    


  139. }

  140. /*****************************
  141. SPI最底層讀取一個字節
  142. 返回值是讀出的這一個字節
  143. 無參

  144. ******************************/
  145. uchar read_spi_2401()//SPI讀一字節函數
  146. {
  147.          SO=1;//初始化SO線


  148.          SCK=1;
  149.    SCK=0;
  150.   
  151.     dat_7=SO;
  152.      
  153.   SCK=1;
  154.   SCK=0;

  155.     dat_6=SO;
  156.       
  157.   SCK=1;
  158.   SCK=0;

  159.   
  160.     dat_5=SO;
  161.    
  162.   SCK=1;
  163.   SCK=0;

  164.   
  165.     dat_4=SO;
  166.    
  167.      SCK=1;  
  168.      SCK=0;
  169.   
  170.    
  171.     dat_3=SO;
  172.    
  173.      SCK=1;
  174.   SCK=0;
  175.   
  176.    
  177.     dat_2=SO;
  178.    
  179.      SCK=1;
  180.   SCK=0;
  181.   
  182.    
  183.     dat_1=SO;
  184.      

  185.      SCK=1;
  186.   SCK=0;
  187.    
  188.     dat_0=SO;
  189.    

  190.    return (dat);//返回讀取數值


  191. }

  192. /***************************
  193. 寫入寄存器命令函數
  194. 有參
  195. 無返回值

  196. m:表示要操作的寄存器地址
  197. date:表示要向內不寫入的數據
  198. ****************************/

  199. void write_rge_nrf24l01(uchar m,uchar date)
  200. {
  201.   SCK=0;//時鐘預選拉低
  202.   CSN=1;
  203.   CSN=0; //SPI開
  204.     write_spi_2401((0x20+m));//寫入寫寄存器命令
  205.     write_spi_2401(date);//寫入date指向的寄存器數據
  206. CSN=1;//SPI關


  207. }
  208. /**********************

  209. 度寄存器子函數
  210. 將寄存器的數值讀出
  211. 有參  M表示要讀的寄存器
  212. 有返回值 返回讀出的數據
  213. ************************/
  214. uchar read_reg_nrf24l01(uchar m)
  215. {  uchar date;

  216.    SCK=0;
  217.   CSN=1;
  218.   CSN=0;
  219.     write_spi_2401(m);//讀寄存器
  220. date=read_spi_2401();
  221. CSN=1;


  222. return (date);
  223. }


  224. /*
  225. 在待機模式下對發射機的寄存器的設置
  226. 定義了發送地址和應答信號的接收通道和地址*/

  227. void set_Register_tx()//"待機-I模式下的對寄存器的設置  發射機
  228. {
  229.   
  230.    
  231.     uchar i;

  232. /**********************************************/
  233. // 本段是寄存器設置在待機-I模式完成
  234. //
  235. /**********************************************/

  236.   

  237.    write_rge_nrf24l01(0x01,0x3f);/*允許所有自動應答開啟*///EN_AA使能自動應答功能
  238.   
  239.    write_rge_nrf24l01(0x02,0x3f);/*允許所有接收地址開啟*///EN_RXADDR接收地址允許

  240.    write_rge_nrf24l01(0x03,0x03);/*所有地址通道的收發地址寬度設為5字節*///STEUP_AW設置地址寬度所有通道

  241.    write_rge_nrf24l01(0x04,0x28);/*允許建立自動重發延時為(750+86us)自動重發計數次數為8次*///STEUP_RETR建立自動重發

  242.    write_rge_nrf24l01(0x11,0x01);/*接收數據通道0 有效數據寬度  一字節*///RX_PW_P0接收通道0有效數據寬度
  243.    








  244.    /**********************************************/
  245. // 本段是對FIF0寫入要發送的數據也在在待機-I模式完成
  246. //
  247. /**********************************************/





  248. //***********************************
  249.     for(i=32;i;i--)  //這一步是寫32字節的數據到FIFO中,必須使CE=0;重復一次寫一字節,
  250.    {          //重復N此寫N字節當然最大是32字節;
  251.      CE=0;        //困擾我多日的寫FIFO數據問題解決了2011/2/24/18:47于天津第四項目部宿舍
  252.      SCK=0;       //原來那個手冊里的狀態圖是這么的重要啊I服了游!!!!(radio control state diagram)
  253.      CSN=1;
  254.      CSN=0;
  255.   
  256. write_spi_2401(0xa0);//寫FIFO寄存器


  257.    
  258.     write_spi_2401(0xcc);//數據     注意這里我只要發送一個字節的數據,可以最大一次發送32字節


  259.      

  260.       CSN=1;
  261.   }
  262. //****************************************








  263. /**********************************************/
  264. // 本段是對接收機的地址設置在待機-I模式完成
  265. //
  266. /**********************************************/






  267. /*這里有必要說明下,由于以上的設置寄存器都是一個字節的所以我使用了子函數,這個是發射/接收地址 我沒使用因為上面的只能寫一個字節*/

  268.   SCK=0;//時鐘預選拉低
  269.   CSN=1;
  270.   CSN=0; //SPI開
  271.     write_spi_2401(0x2a);//寫入寫寄存器命令       /* RX_ADDR_P0 數據通道0接收地址設為0xABABABABAB */
  272.     write_spi_2401(0xab);//寫入date指向的寄存器數據
  273. write_spi_2401(0xab);//寫入date指向的寄存器數據         /*這里其實是用來接收接收機的應答的所以要和發送的地址一樣,*/
  274. write_spi_2401(0xab);//寫入date指向的寄存器數據      /*你想,你要找王均偉,那么你要發送王均偉,王均偉聽見后要回應王均偉*/
  275. write_spi_2401(0xab);//寫入date指向的寄存器數據
  276. write_spi_2401(0xab);//寫入date指向的寄存器數據
  277. CSN=1;//SPI關




  278.   SCK=0;//時鐘預選拉低
  279.   CSN=1;
  280.   CSN=0; //SPI開
  281.     write_spi_2401(0x30);//寫入寫寄存器命令
  282.     write_spi_2401(0xab);//寫入date指向的寄存器數據       /* TX_ADDR 發送地址設為0xABABABABAB */
  283. write_spi_2401(0xab);//寫入date指向的寄存器數據   
  284. write_spi_2401(0xab);//寫入date指向的寄存器數據
  285. write_spi_2401(0xab);//寫入date指向的寄存器數據
  286. write_spi_2401(0xab);//寫入date指向的寄存器數據
  287. CSN=1;//SPI關





  288.   

  289. }





  290. void main () //主函數
  291. {   
  292.   
  293.        InitUART();//初始化串口


  294.    delay1ms(200);//開機上電復位延時200毫秒后進入掉電模式
  295.    delay1ms(200);//開機上電復位延時200毫秒后進入掉電模式
  296.    
  297.    
  298.     CSN=1;
  299.     SCK=0;
  300.       CE=0;      //初始化端口


  301.    SendOneByte(0xf8); //發送個標志
  302.      FLAGE=read_reg_nrf24l01(0x17);//狀態寄存器讀取;發射前讀取狀態寄存器
  303.     SendOneByte(FLAGE);
  304.     FLAGE=read_reg_nrf24l01(0x07);//狀態寄存器讀取;發射前讀取狀態寄存器
  305.     SendOneByte(FLAGE);


  306.      write_rge_nrf24l01(0x00,0x0e);/*只允許中斷開啟,CRC使能,8位,PWR_UP=1(上電),PRIM_RX=0(發射模式)*///配置寄存器



  307.   delay1ms(50);//此處指著個延時很管用,標志著24L01由掉電模式向待機-I模式轉換的過程,以上是掉電模式一下就是待機-I模式了
  308.   


  309.      while(1)
  310.   {

  311.     set_Register_tx();// 待機1模式下的寄存器配置
  312.   

  313.   

  314.   
  315.       
  316.    
  317.    


  318. //***********************************************************************
  319.    
  320.    
  321.   




  322.      CE=1;
  323.   delay10us(2); //進入發射模式數據進行打包準備發送
  324.       CE=0;  

  325.   delay10us(15); //130微秒后進入發射模式CE=0;發送完畢后轉到待機一I模式

  326. //*888888888888888888888888888888888888888888888888888888


  327.     do
  328. {
  329.   SendOneByte(0x88);//發送標志位
  330. FLAGE=read_reg_nrf24l01(0x07);
  331. //P0=FLAGE;
  332. SendOneByte(FLAGE);

  333. }
  334. while((~TX_DS)); //檢查是否發送成功?成功向下,否則等待




  335.    //*********************************************

  336.          CE=0;//轉到待機-I模式
  337.   write_rge_nrf24l01(0x07,0x2e);/*清除發送中斷信號*/
  338.          
  339.      SCK=0;      
  340.      CSN=1;
  341.      CSN=0;  
  342. write_spi_2401(0xe1);//清除TX的FIFO寄存器為下一個包發送做準備
  343.         CSN=1;

  344.   
  345.    SendOneByte(0xe8);//發送標志位
  346. FLAGE=read_reg_nrf24l01(0x17);//狀態寄存器讀取
  347. SendOneByte(FLAGE);
  348. FLAGE=read_reg_nrf24l01(0x07);//狀態寄存器讀取;發射前讀取狀態寄存器
  349.     SendOneByte(FLAGE);



  350.   wk=0;
  351.     }

  352. while(1);



  353. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品成人一区二区三区夜夜夜 | 中文字幕在线精品 | 久久av一区二区三区 | 成人久久久久 | 日日干夜夜干 | 国产性生活一级片 | 欧美三级视频在线观看 | 国产高清在线 | 国产一区二区三区 | 亚洲国产欧美在线人成 | 成人午夜视频在线观看 | 免费黄色大片 | 国产日韩精品在线 | 午夜影院在线观看视频 | 成人午夜网站 | 九九亚洲 | 亚洲欧美视频一区二区 | 精品久久久网站 | av在线天天 | 久久亚洲一区二区三区四区 | 91中文| 国产天天操 | 四虎最新视频 | 欧美性大战久久久久久久蜜臀 | 91高清在线 | 午夜精品久久 | 国产精品久久久久久久岛一牛影视 | 国产高清一区二区 | 日韩伦理一区二区 | 国产精品久久亚洲 | 亚洲欧美日韩精品 | 亚洲精品二区 | 夜夜草av| 久久精品欧美一区二区三区不卡 | www.日韩av.com| 日本在线你懂的 | 久久看片 | 在线欧美视频 | 久久久久久高潮国产精品视 | 日韩在线视频播放 | 亚洲精品视频久久 |