找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6067|回复: 3
收起左侧

NRF24L01单片机驱动程序(收发用同一套代码)

[复制链接]
ID:161768 发表于 2017-5-24 03:20 | 显示全部楼层 |阅读模式
收发用同一套代码。
注意:

          单片机型号          STC12LE5A48S2

          1   
            用到串口输出测试信息,按下唯一一个按键后,开始发送,接收端收到100个数据包后会打印一次OK,否者收到这100个包有错,打印这100个数据包的序列号。

           2 晶振频率22.1184M

           3
                  信号脚位定义:

                   sbit IRQ = P1^1;
                   sbit CE =  P1^0;
                   sbit CSN=  P1^4;
                   sbit SCK=  P1^5;
                   sbit MOSI= P1^6;
                   sbit MISO= P1^7;

唯一一个按键定义:
                   sbit KEY = P1^2;


0.png

单片机源程序如下:

  1. #include"config.h"
  2. #include"stdio.h"
  3. sbit led=P0^0;
  4. /*
  5. unsigned char xdata  re_send[100];
  6. void send_image(unsigned char *pic,unsigned char len)
  7. {
  8.   unsigned int send_k=0;
  9.   unsigned char temp1,temp2,temp3,a=0;
  10.   unsigned char mode_rec=0;
  11.   init_nrf24l01_io();
  12.   while(1)
  13.   {
  14.   ifnnrf_rx_mode();
  15.   IRQ=1;
  16.   SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  17.   tx_buf[0]=0xaa;
  18.   tx_buf[1]=0x55;
  19.   tx_buf[2]=0xaa;
  20.   tx_buf[3]=0x55;
  21.   tx_buf[4]=0x01;
  22.   tx_buf[5]=(len/256);
  23.   tx_buf[6]=(len%256);
  24.   ifnnrf_tx_mode();
  25.   while(IRQ);
  26.   sta=SPI_Read(STATUS);
  27.   SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  28.   if(sta&STA_MARK_TX)
  29.    {
  30.         com_printf("TX OK!",sta);
  31.     break;
  32.    }
  33.   else
  34.    {
  35.         com_printf("TX ER!",sta);
  36.     ifnnrf_CLERN_ALL();
  37.    }
  38.   }
  39.   while(1)
  40.   {
  41.   ifnnrf_rx_mode();
  42.   ifnnrf_CLERN_ALL();
  43.   while(IRQ==0);
  44.   _delay_us(1000);
  45.   if(IRQ==0)
  46.    {
  47.         sta=SPI_Read(STATUS);
  48.         SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  49.         if(sta&STA_MARK_RX)
  50.           {
  51.            SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer;
  52.        if((rx_buf[0]==0xaa)&&(rx_buf[1]==0x55)&&(rx_buf[2]==0xaa)&&(rx_buf[3]==0x55)&&(rx_buf[0]==0x01))
  53.        break;
  54.           }
  55.     }
  56.    }
  57.    while(1)
  58.    {
  59.     IRQ=1;
  60.     SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  61.     tx_buf[0]=(send_k/256);
  62.     tx_buf[1]=(send_k%256);
  63.         for(a=0;a<30;a++)
  64.         tx_buf[a+2]=*(pic+send_k*30+a);
  65.     ifnnrf_tx_mode();
  66.     while(IRQ);
  67.         if(send_k*30<len)
  68.         send_k++;
  69.         else
  70.         break;
  71.    }
  72.     while(1)
  73.     {
  74.           ifnnrf_rx_mode();
  75.           ifnnrf_CLERN_ALL();
  76.           while(IRQ==0);
  77.           _delay_us(1000);
  78.           if(IRQ==0)
  79.            {
  80.                 sta=SPI_Read(STATUS);
  81.                 SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  82.                 if(sta&STA_MARK_RX)
  83.                   {
  84.                    SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer;
  85.                if((rx_buf[0]==0xaa)&&(rx_buf[1]==0x55)&&(rx_buf[2]==0xaa)&&(rx_buf[3]==0x55)&&(rx_buf[4]==0x02))
  86.                    {
  87.            mode_rec=rx_buf[4];
  88.                break;
  89.                    }
  90.                   }
  91.             }
  92.      }

  93.         while(temp2<mode_rec)
  94.     {
  95.           ifnnrf_rx_mode();
  96.           ifnnrf_CLERN_ALL();
  97.           while(IRQ==0);
  98.           _delay_us(1000);
  99.           if(IRQ==0)
  100.            {
  101.                 sta=SPI_Read(STATUS);
  102.                 SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  103.                 if(sta&STA_MARK_RX)
  104.                   {
  105.                    SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer;
  106.            for(temp1=0;temp1<30;temp1++)
  107.                    re_send[temp2+temp1]=rx_buf[temp1];
  108.                   }
  109.             }
  110.      }
  111.    while(temp3<mode_rec)
  112.    {
  113.    
  114.    while(1)
  115.    {
  116.     IRQ=1;
  117.     SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  118.     tx_buf[0]=0;
  119.     tx_buf[1]=temp3;
  120.         for(a=0;a<30;a++)
  121.         tx_buf[a+2]=*(pic+re_send[temp3]*30+a);
  122.     ifnnrf_tx_mode();
  123.     while(IRQ);
  124.         if(send_k*30<len)
  125.         send_k++;
  126.         else
  127.         break;
  128.    }
  129.    temp3++;
  130.    }

  131.       
  132. }       
  133. */  
  134. main()
  135. {
  136.   unsigned char i=0;

  137.   unsigned int count_send=0;
  138.   unsigned int rec_new=0;
  139.   unsigned int rec_old=0;
  140.   unsigned int rec_err=0;
  141.   unsigned int lock_key=0;

  142.   init_cpu();

  143.   init_nrf24l01_io();

  144.   for(i=0;i<32;i++)
  145.   {
  146.     tx_buf[i]=i;
  147.   }
  148.   TI=1;
  149.   printf("hello world");
  150.   printf("hello world");
  151.   ifnnrf_rx_mode();

  152.   while(1)
  153.   {

  154.      KEY=1;
  155.      while(KEY==0)
  156.          {
  157.            IRQ=1;
  158.            SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  159.            count_send++;
  160.            tx_buf[30]=count_send/256;
  161.            tx_buf[31]=count_send%256;
  162.            ifnnrf_tx_mode();
  163.            while(IRQ);
  164.            sta=SPI_Read(STATUS);
  165.            SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  166.            if(sta&STA_MARK_TX)
  167.            {
  168.         if((count_send%100)==0)
  169.                 {
  170.                 TI=1;
  171.         printf("TX OK!%d\n\t",count_send);
  172.                 }
  173.            }
  174.            else
  175.            {
  176.                 TI=1;
  177.         printf("TX ER!%2XH\n\t",sta);
  178.         ifnnrf_CLERN_ALL();
  179.            }
  180.            lock_key=1;

  181.          }        //发送
  182.          if(lock_key)
  183.          {
  184.          lock_key=0;
  185.          ifnnrf_rx_mode();
  186.          IRQ=1;
  187.          while(IRQ==0);
  188.          _delay_us(400);
  189.          }
  190.          //ifnnrf_rx_mode();  每次都切换到输入 要过一段时间才能正常接收,而对方在一直发送,在发送过来后,这里还没初始化完,于是数据错误
  191.        //ifnnrf_CLERN_ALL();
  192.          IRQ=1;
  193.          if(IRQ==0)
  194.          {
  195.           
  196.           sta=SPI_Read(STATUS);
  197.           SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  198.           
  199.            if(sta&STA_MARK_RX)
  200.            {

  201.              SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer;
  202.              rec_new=(rx_buf[30]*256+rx_buf[31]);
  203.                  if(rec_new==(rec_old+1))
  204.                  {
  205.                     P2=0XFF;
  206.                         if((rec_new%100)==0)
  207. ……………………

  208. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-85697-1.html






回复

使用道具 举报

ID:457495 发表于 2020-8-10 13:44 | 显示全部楼层
楼主在吗?  这款音频解码芯片切换音乐的时候会不会有卡顿,有什么比较好的解决方案呢。还是一直存在这种卡顿情况
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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