找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3587|回复: 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. }
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表