📄 nrf24l01.lst
字号:
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 + -