⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nrf24l01.lst

📁 C51驱动nrf24l01无线发送
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V9.00   NRF24L01                                                              07/18/2012 17:58:49 PAGE 1   


C51 COMPILER V9.00, COMPILATION OF MODULE NRF24L01
OBJECT MODULE PLACED IN nrf24l01.obj
COMPILER INVOKED BY: G:\Keil_51\C51\BIN\C51.EXE nrf24l01\nrf24l01.c BROWSE INCDIR(.\Define;.\MyDseign;.\nrf24l01;.\User;
                    -.\12864液晶) DEBUG OBJECTEXTEND PRINT(.\nrf24l01.lst) TABS(2) OBJECT(nrf24l01.obj)

line level    source

   1          #include <intrins.h>
   2          #include "define.h"
   3          #include "nrf24l01.h"
   4          
   5          
   6          /***************************************************************************************/
   7          /*    NRF24L01 的管脚定义,以及在本程序中的应用,VCC接3.3V电源,可以通过5V用电压转换芯片
   8          /*得到,NC 管脚可以接可以不接,暂时没用途。本程序应用于51或者52单片机,是两个模块进行通讯
   9          /*成功的简单指示,现象是:模块1的 KEY1 对应模块1的LED1 和模块2的LED3 ,模块1的 KEY2 对应模
  10          /*块1的LED2 和模块2的LED4,发过来也对应。
  11          /***************************************************************************************/
  12          
  13          /*****************************************长延时*****************************************/
  14          void Delay(unsigned int s)
  15          {
  16   1        unsigned int i;
  17   1        for(i=0; i<s; i++);
  18   1        for(i=0; i<s; i++);
  19   1      }
  20          /******************************************************************************************/
  21          /*延时函数
  22          /******************************************************************************************/
  23          void inerDelay_us(unsigned char n)  //延时,us 级
  24          {
  25   1        for(;n>0;n--)
  26   1          _nop_();
  27   1      }
  28          /****************************************************************************************/
  29          /*NRF24L01初始化
  30          /***************************************************************************************/
  31          void init_NRF24L01(void)
  32          {
  33   1        inerDelay_us(100);
  34   1        CE=0;    // 芯片使能
  35   1        CSN=1;   // 禁止 SPI 
  36   1        SCK=0;   // SPI时钟置低
  37   1        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址  
  38   1        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
  39   1        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动 ACK应答允许 
  40   1        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  
  41   1        SPI_RW_Reg(WRITE_REG + RF_CH, 0x02);        //   设置信道工作为2.4GHZ,收发必须一致
  42   1        SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
  43   1        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);       //设置发射速率为1MHZ,发射功率为最大值0dB
  44   1      }
  45          /****************************************************************************************************/
  46          /*函数:unsigned int SPI_RW(unsigned int unsigned char)
  47          /*功能:NRF24L01的SPI写时序-----根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01 读出一字节
  48          /****************************************************************************************************/
  49          unsigned int SPI_RW(unsigned int dat)
  50          {
  51   1        unsigned int i;
  52   1          for(i=0;i<8;i++) // 循环8次
  53   1          {
  54   2          MOSI = (dat & 0x80);  // dat的最高位输出到MOSI   MSB to MOSI
C51 COMPILER V9.00   NRF24L01                                                              07/18/2012 17:58:49 PAGE 2   

  55   2          inerDelay_us(DELAY);
  56   2          dat = (dat << 1);     // 从右向左进一位          shift next bit into MSB..
  57   2          SCK = 1;              // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据  Set SCK high..
  58   2          inerDelay_us(DELAY);
  59   2          dat |= MISO;          //读MISO到 dat 最低位       capture current MISO bit
  60   2          inerDelay_us(DELAY);
  61   2          SCK = 0;              // SCK置低                  ..then set SCK low again
  62   2          inerDelay_us(DELAY);
  63   2          }
  64   1          return(dat);              //返回读出的一字节           return read dat
  65   1      }
  66          /****************************************************************************************************
  67          /*函数:unsigned char SPI_Read(unsigned char reg)
  68          /*功能:NRF24L01的SPI时序-----------从reg寄存器读一字节
  69          /****************************************************************************************************/
  70          unsigned char SPI_Read(unsigned char reg)
  71          {
  72   1        unsigned char reg_val;
  73   1        
  74   1        CSN = 0;             //CSN置低,开始传输数据  CSN low, initialize SPI communication...
  75   1        inerDelay_us(DELAY);
  76   1        SPI_RW(reg);         //选择寄存器             Select register to read from..
  77   1        reg_val = SPI_RW(0); //然后从该寄存器读数据   ..then read registervalue
  78   1        CSN = 1;             //CSN拉高,结束数据传输  CSN high, terminate SPI communication
  79   1        inerDelay_us(DELAY);
  80   1        
  81   1        return(reg_val);     //返回寄存器数据         return register value
  82   1      }
  83          /****************************************************************************************************/
  84          /*功能:NRF24L01读写寄存器函数
  85          /*描述:写数据value到reg寄存器
  86          /****************************************************************************************************/
  87          unsigned int SPI_RW_Reg(unsigned char reg, unsigned char value)
  88          {
  89   1        unsigned char status;
  90   1        
  91   1        CSN = 0;               // CSN置低,开始传输数据      CSN low, init SPI transaction
  92   1        inerDelay_us(DELAY);
  93   1        status = SPI_RW(reg);  // 选择寄存器,同时返回状态字 select register
  94   1        SPI_RW(value);         // 然后写数据到该寄存器       ..and write value to it..
  95   1        CSN = 1;               // CSN拉高,结束数据传输      CSN high again
  96   1        inerDelay_us(DELAY);
  97   1        
  98   1        return(status);        // 返回状态寄存器             return nRF24L01 status unsigned char
  99   1      }
 100          /****************************************************************************************************/
 101          /*函数:unsigned int SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char unsigned chars)
 102          /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,unsigned chars:读出数据的个数
 103          /*描述: 从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址
 104          /****************************************************************************************************/
 105          unsigned int SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char uchars)
 106          {
 107   1        unsigned int status,i;
 108   1        
 109   1        CSN = 0;                 //CSN置低,开始传输数据   Set CSN low, init SPI tranaction
 110   1        inerDelay_us(DELAY);
 111   1        status = SPI_RW(reg);    //选择寄存器,同时返回状态字 Select register to write to and read status unsigne
             -d char
 112   1        
 113   1        for(i=0;i<uchars;i++)
 114   1          pBuf[i] = SPI_RW(0); //逐个字节从nRF24L01读出 
 115   1        
C51 COMPILER V9.00   NRF24L01                                                              07/18/2012 17:58:49 PAGE 3   

 116   1        CSN = 1;                 //CSN拉高,结束数据传输
 117   1        inerDelay_us(DELAY);          
 118   1        
 119   1        return(status);          //返回状态寄存器      return nRF24L01 status unsigned char
 120   1      }
 121          /*********************************************************************************************************
 122          /*函数:unsigned int SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char unsigned chars)
 123          /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,unsigned chars:写入数据的个数
 124          /*描述:把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址
 125          /*********************************************************************************************************
             -/
 126          unsigned int SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char uchars)
 127          {
 128   1        unsigned int status,i;
 129   1        
 130   1        CSN = 0;               //CSN置低,开始传输数据
 131   1        inerDelay_us(DELAY);       
 132   1        status = SPI_RW(reg);  //选择寄存器,同时返回状态字
 133   1        inerDelay_us(DELAY);   
 134   1        for(i=0; i<uchars; i++) 
 135   1          SPI_RW(*pBuf++);  //逐个字节写入nRF24L01
 136   1        CSN = 1;           //CSN拉高,结束数据传输
 137   1        inerDelay_us(DELAY);
 138   1        return(status);    //返回状态寄存器 
 139   1      }
 140          /****************************************************************************************************/
 141          /*函数:void SetRX_Mode(void)
 142          /*功能:数据接收配置 
 143          /****************************************************************************************************/
 144          void SetRX_Mode(void)
 145          {
 146   1        CE=0;
 147   1        inerDelay_us(DELAY);
 148   1        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);//CRC使能,16位CRC校验,上电,接收模式 
 149   1        CE = 1;    // 拉高CE启动接收设备
 150   1        inerDelay_us(DELAY);
 151   1        inerDelay_us(130);
 152   1      }
 153          /******************************************************************************************************/
 154          /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
 155          /*功能:数据读取后放入rx_buf接收缓冲区中
 156          /******************************************************************************************************/
 157          unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
 158          {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -