| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391 |
- C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 1
- C51 COMPILER V9.53.0.0, COMPILATION OF MODULE NRF24L01_API
- OBJECT MODULE PLACED IN .\Output\nRF24L01_API.obj
- COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ..\..\Code\User\Driver\nRF24L01_API.c LARGE OPTIMIZE(0,SPEED) BROWSE INC
- -DIR(../../Code/Include;../../Code/User;../../Code/User/Common;../../Code/User/Driver) DEFINE(FOSC_160000=1) DEBUG OBJECT
- -EXTEND PRINT(.\Output\LST\nRF24L01_API.lst) TABS(2) OBJECT(.\Output\nRF24L01_API.obj)
- line level source
- 1 #include "nRF24L01_API.h"
- 2
- 3 static uchar TX_ADDRESS[TX_ADR_WIDTH] = {0x00, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}; //发送地址
- 4 static uchar RX_ADDRESS[RX_ADR_WIDTH] = {0x00, TR_ADDR_B1, TR_ADDR_B2, TR_ADDR_B3, TR_ADDR_B4}; //接收地址
- 5
- 6 /*
- 7 00 配置寄存器
- 8 [7]
- 9 [6]可屏蔽中断 RX_RD
- 10 [5]可屏蔽中断 TX_DS
- 11 [4]可屏蔽中断 MAX_RT
- 12 [3]CRC 使能
- 13 [2]CRC 模式
- 14 [1]1:上电0:掉电
- 15 [0]1:接收模式0:发射模式
- 16 01 使能“自动应答”功能
- 17 [7:6]
- 18 [5:0]数据通道 5 ~0自动应答允许
- 19 02 接收地址允许
- 20 [7:6]
- 21 [5:0]接收数据通道 5 ~0允许
- 22 03 设置地址宽度(所有数据通道)
- 23 [7:2]
- 24 [1:0]0.无效 1.3byte 2.4byte 3.5byte 宽度
- 25 04 建立自动重发
- 26 [7:4]自动重发延时:'0000'-等待 250+86us '1111'-等待 4000+86us
- 27 [3:0]自动重发计数:'0000'-禁止自动重发 '1111'-自动重发 15 次
- 28 05 射频通道
- 29 [7]
- 30 [6:0]设置 nRF24L01 工作通道频率
- 31 06 射频寄存器
- 32
- 33 .....
- 34 .....
- 35
- 36
- 37 */
- 38
- 39
- 40 #if 1
- 41 void delay_us ( uchar num )
- 42 {
- 43 1 uchar i;
- 44 1
- 45 1 for ( i = 0; i < num; i++ )
- 46 1 {
- 47 2 #ifdef N76E003_IAR
- asm ( "nop" );
- #else
- 50 2 nop;
- 51 2 #endif
- 52 2 }
- 53 1 }
- C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 2
- 54 #else
- #define delay_us(us) Timer3_Delay10us(us/10+1)
- #endif
- 57 /***************************************************************/
- 58
- 59 /*******************************************************************/
- 60 //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)
- 61 #if 0
- uchar SPI_RW ( uchar byte )
- {
- uchar bit_ctr;
-
- for ( bit_ctr = 0; bit_ctr < 8; bit_ctr++ ) // 输出8位
- {
- NRF_MOSI = ( byte & 0x80 ); // MSB TO MOSI
- byte = ( byte << 1 ); // shift next bit to MSB
- NRF_SCK = 1;
- byte |= NRF_MISO; // capture current MISO bit
- NRF_SCK = 0;
- }
-
- return byte;
- }
- #else
- 78 uchar SPI_RW ( uchar byte )
- 79 {
- 80 1 uchar i;
- 81 1 SPDR = byte; //写寄存器
- 82 1
- 83 1 for ( i = 0; i < 255; i++ )
- 84 1 {
- 85 2 if ( SPSR & SET_BIT7 )
- 86 2 {
- 87 3 break; //等待传输
- 88 3 }
- 89 2 }
- 90 1
- 91 1 SPSR &= ~SET_BIT7;
- 92 1 byte = SPDR; //读寄存器
- 93 1 return byte;
- 94 1 }
- 95
- 96 #endif
- 97 /*********************************************/
- 98 /* 函数功能:给24L01的寄存器写值(一个字节) */
- 99 /* 入口参数:reg 要写的寄存器地址 */
- 100 /* value 给寄存器写的值 */
- 101 /* 出口参数:status 状态值 */
- 102 /*********************************************/
- 103 uchar NRF24L01_Write_Reg ( uchar reg, uchar value )
- 104 {
- 105 1 uchar status;
- 106 1 NRF_CSN = 0; //CSN=0;
- 107 1 status = SPI_RW ( reg ); //发送寄存器地址,并读取状态值
- 108 1 SPI_RW ( value );
- 109 1 NRF_CSN = 1; //CSN=1;
- 110 1
- 111 1 return status;
- 112 1 }
- 113 /*************************************************/
- 114 /* 函数功能:读24L01的寄存器值 (一个字节) */
- 115 /* 入口参数:reg 要读的寄存器地址 */
- C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 3
- 116 /* 出口参数:value 读出寄存器的值 */
- 117 /*************************************************/
- 118 uchar NRF24L01_Read_Reg ( uchar reg )
- 119 {
- 120 1 uchar value;
- 121 1
- 122 1 NRF_CSN = 0; //CSN=0;
- 123 1 SPI_RW ( reg ); //发送寄存器值(位置),并读取状态值
- 124 1 value = SPI_RW ( NOP );
- 125 1 NRF_CSN = 1; //CSN=1;
- 126 1
- 127 1 return value;
- 128 1 }
- 129 /*********************************************/
- 130 /* 函数功能:读24L01的寄存器值(多个字节) */
- 131 /* 入口参数:reg 寄存器地址 */
- 132 /* *pBuf 读出寄存器值的存放数组 */
- 133 /* len 数组字节长度 */
- 134 /* 出口参数:status 状态值 */
- 135 /*********************************************/
- 136 uchar NRF24L01_Read_Buf ( uchar reg, uchar *pBuf, uchar len )
- 137 {
- 138 1 uchar status, u8_ctr;
- 139 1 NRF_CSN = 0; //CSN=0
- 140 1 status = SPI_RW ( reg ); //发送寄存器地址,并读取状态值
- 141 1
- 142 1 for ( u8_ctr = 0; u8_ctr < len; u8_ctr++ )
- 143 1 {
- 144 2 pBuf[u8_ctr] = SPI_RW ( 0XFF ); //读出数据
- 145 2 }
- 146 1
- 147 1 NRF_CSN = 1; //CSN=1
- 148 1 return status; //返回读到的状态值
- 149 1 }
- 150 /**********************************************/
- 151 /* 函数功能:给24L01的寄存器写值(多个字节) */
- 152 /* 入口参数:reg 要写的寄存器地址 */
- 153 /* *pBuf 值的存放数组 */
- 154 /* len 数组字节长度 */
- 155 /**********************************************/
- 156 uchar NRF24L01_Write_Buf ( uchar reg, uchar *pBuf, uchar len )
- 157 {
- 158 1 uchar status, u8_ctr;
- 159 1 NRF_CSN = 0;
- 160 1 status = SPI_RW ( reg ); //发送寄存器值(位置),并读取状态值
- 161 1
- 162 1 for ( u8_ctr = 0; u8_ctr < len; u8_ctr++ )
- 163 1 {
- 164 2 SPI_RW ( *pBuf++ ); //写入数据
- 165 2 }
- 166 1
- 167 1 NRF_CSN = 1;
- 168 1 return status; //返回读到的状态值
- 169 1 }
- 170
- 171 /*********************************************/
- 172 /* 函数功能:24L01接收数据 */
- 173 /* 入口参数:rxbuf 接收数据数组 */
- 174 /* 返回值: 0 成功收到数据 */
- 175 /* 1 没有收到数据 */
- 176 /*********************************************/
- 177 uchar NRF24L01_RxPacket ( uchar *rxbuf, uchar rxlen )
- C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 4
- 178 {
- 179 1 uchar state;
- 180 1 uchar res = 0;
- 181 1
- 182 1 state = NRF24L01_Read_Reg ( STATUS ); //读取状态寄存器的值
- 183 1
- 184 1 if ( state & RX_DR ) //接收到数据
- 185 1 {
- 186 2 state &= ~RX_DR;
- 187 2 NRF_CE = 0; //配置前
- 188 2 rxlen = ( rxlen < RX_PLOAD_WIDTH ) ? ( rxlen ) : ( RX_PLOAD_WIDTH );
- 189 2 NRF24L01_Read_Buf ( RD_RX_PLOAD, rxbuf, RX_PLOAD_WIDTH ); //读取数据
- 190 2 NRF24L01_Write_Reg ( FLUSH_RX, 0xff ); //清除RX FIFO寄存器
- 191 2 NRF_CE = 1; //配置完,使能收发
- 192 2 delay_us ( 150 );
- 193 2 res = 1;
- 194 2 }
- 195 1
- 196 1 NRF24L01_Write_Reg ( WRITE_REG + STATUS, state ); //清除TX_DS或MAX_RT中断标志
- 197 1 return res;//没收到任何数据
- 198 1 }
- 199 /**********************************************/
- 200 /* 函数功能:设置24L01为发送模式 */
- 201 /* 入口参数:txbuf 发送数据数组 */
- 202 /* 返回值; 0x10 达到最大重发次数,发送失败*/
- 203 /* 0x20 成功发送完成 */
- 204 /* 0xff 发送失败 */
- 205 /**********************************************/
- 206 uchar NRF24L01_TxPacket ( uchar *txbuf, uchar txlen )
- 207 {
- 208 1 uchar res = 1;
- 209 1 uchar state;
- 210 1 uint16 i;
- 211 1
- 212 1 NRF_CE = 0; //CE拉低,使能24L01配置
- 213 1 txlen = ( txlen < TX_PLOAD_WIDTH ) ? ( txlen ) : ( TX_PLOAD_WIDTH );
- 214 1 NRF24L01_Write_Buf ( WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH ); //写数据到TX BUF 32个字节
- 215 1 NRF_CE = 1; //CE置高,使能发送
- 216 1
- 217 1 for ( i = 0; i < 65535; i++ )
- 218 1 {
- 219 2 if ( NRF_IRQ == 1 )
- 220 2 {
- 221 3 break; //等待发送完成
- 222 3 }
- 223 2 }
- 224 1
- 225 1 state = NRF24L01_Read_Reg ( STATUS ); //读取状态寄存器的值
- 226 1
- 227 1 if ( state & MAX_RT ) //达到最大重发次数
- 228 1 {
- 229 2 NRF24L01_Write_Reg ( FLUSH_TX, 0xff ); //清除TX FIFO寄存器
- 230 2 state &= ~MAX_RT;
- 231 2 res = 0;
- 232 2 }
- 233 1
- 234 1 if ( state & TX_DS ) //发送完成
- 235 1 {
- 236 2 state &= ~TX_DS;
- 237 2 res = 0;
- 238 2 }
- 239 1
- C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 5
- 240 1 NRF24L01_Write_Reg ( WRITE_REG + STATUS, state ); //清除TX_DS或MAX_RT中断标志
- 241 1 return res; //发送失败
- 242 1 }
- 243
- 244 /********************************************/
- 245 /* 函数功能:检测24L01是否存在 */
- 246 /* 返回值; 1 存在 */
- 247 /* 0 不存在 */
- 248 /********************************************/
- 249 uchar NRF24L01_Check ( void )
- 250 {
- 251 1 uchar res = 0;
- 252 1 uchar check_in_buf[5] = {0x11, 0x22, 0x33, 0x44, 0x55};
- 253 1 uchar check_out_buf[5] = {0x00};
- 254 1
- 255 1 NRF_SCK = 0;
- 256 1 NRF_CSN = 1;
- 257 1 NRF_CE = 0;
- 258 1
- 259 1 NRF24L01_Write_Buf ( WRITE_REG + TX_ADDR, check_in_buf, 5 );
- 260 1
- 261 1 NRF24L01_Read_Buf ( READ_REG + TX_ADDR, check_out_buf, 5 );
- 262 1
- 263 1 if ( ( check_out_buf[0] == 0x11 ) && \
- 264 1 ( check_out_buf[1] == 0x22 ) && \
- 265 1 ( check_out_buf[2] == 0x33 ) && \
- 266 1 ( check_out_buf[3] == 0x44 ) && \
- 267 1 ( check_out_buf[4] == 0x55 ) )
- 268 1 {
- 269 2 res = 1;
- 270 2 }
- 271 1
- 272 1 return res;
- 273 1 }
- 274
- 275 uint16 NRF24L01_Wait_Check ( void )
- 276 {
- 277 1 uint16 i;
- 278 1
- 279 1 for ( i = 0; i < 50; i++ )
- 280 1 {
- 281 2 if ( NRF24L01_Check() )
- 282 2 {
- 283 3 break; //等待发送完成
- 284 3 }
- 285 2
- 286 2 Timer3_Delay10us ( 10 );
- 287 2 }
- 288 1
- 289 1 return i;
- 290 1 }
- 291 /**********************************************/
- 292 /* 函数功能:24L01初始化 */
- 293 /* 入口参数:PLOAD_WIDTH 有效数据宽度 */
- 294 /* TX_ADR 发送地址 */
- 295 /* TX_ADDR_WIDTH 发送地址宽度 */
- 296 /* RX_ADR 接收发送地址 */
- 297 /* RX_ADDR_WIDTH 接收地址宽度 */
- 298 /* RATE 有效数据宽度 */
- 299 /* 返回值 ;无 */
- 300 /**********************************************/
- 301 void NRF24L01_RT_Init ( void )
- C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 6
- 302 {
- 303 1 NRF_CE = 0;
- 304 1 NRF24L01_Write_Reg ( WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH ); //设置接收数据长度,本次设置为32字节
- 305 1 NRF24L01_Write_Reg ( FLUSH_RX, 0xff ); //清除RX FIFO寄存器
- 306 1 NRF24L01_Write_Buf ( WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH ); //写TX节点地址
- 307 1 NRF24L01_Write_Buf ( WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH ); //设置RX节点地址,主要为了使能
- -ACK
- 308 1
- 309 1 NRF24L01_Write_Reg ( WRITE_REG + EN_AA, 0x05 ); //使能通道0的自动应答
- 310 1 NRF24L01_Write_Reg ( WRITE_REG + EN_RXADDR, 0x01 ); //使能通道0的接收地址
- 311 1
- 312 1 NRF24L01_Write_Reg ( WRITE_REG + FEATURE, 0x00 ); //使能动态数据包长度,AUTO_ACK模式
- 313 1 NRF24L01_Write_Reg ( WRITE_REG + DYNPD, 0x01 ); //选择通道0动态数据包长度
- 314 1
- 315 1 NRF24L01_Write_Reg ( WRITE_REG + SETUP_RETR, 0x1a ); //设置自动重发间隔时间:500us + 86us;最大自动重发
- -次数:10(a)次
- 316 1 NRF24L01_Write_Reg ( WRITE_REG + RF_CH, 40 ); //设置RF通道为40 收发必须一致,0为2.4GHz + 40
- 317 1 NRF24L01_Write_Reg ( WRITE_REG + RF_SETUP, 0x0f ); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启
- 318 1 NRF24L01_Write_Reg ( WRITE_REG + CONFIG, 0x0f ); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接
- -收模式,开启所有中断
- 319 1 NRF_CE = 1; //CE置高,使能发送
- 320 1 }
- 321 /**********************************************/
- 322 /* 函数功能:发射函数 */
- 323 /* 入口参数:buf 发送寄存器 */
- 324 /* 返回值 ;无 */
- 325 /**********************************************/
- 326 /*
- 327 nRF24L01 可以设置为以下几种主要的模式,
- 328 模式 PWR_UP PRIM_RX CE FIFO 寄存器状态
- 329 接收模式 1 1 1 -
- 330 发送模式 1 0 1 数据在 TX FIFO 寄存器中
- 331 发送模式 1 0 1→0 停留在发送模式,直至数据发送完
- 332 待机模式II 1 0 1 TX FIFO 为空
- 333 待机模式I 1 - 0 无数据传输
- 334 掉电模式 0 - - -
- 335 CONFIG[0] PRIM_RX: 1:接收模式 0:发射模式
- 336 CONFIG[1] PWR_UP: 1:上电 0:掉电
- 337 */
- 338 uchar SEND_BUF ( uchar *buf, uchar len )
- 339 {
- 340 1 uchar state;
- 341 1 NRF_CE = 0;
- 342 1 NRF24L01_Write_Reg ( WRITE_REG + CONFIG, 0x0e ); //CONFIG[0] PRIM_RX=0.发射
- 343 1 NRF_CE = 1;
- 344 1 delay_us ( 15 );
- 345 1 state = NRF24L01_TxPacket ( buf, len );
- 346 1 NRF_CE = 0;
- 347 1 NRF24L01_Write_Reg ( WRITE_REG + CONFIG, 0x0f ); //CONFIG[0] PRIM_RX=0.发射
- 348 1 NRF_CE = 1;
- 349 1 return state;
- 350 1 }
- 351
- MODULE INFORMATION: STATIC OVERLAYABLE
- CODE SIZE = 1130 ----
- CONSTANT SIZE = 10 ----
- XDATA SIZE = 65 ----
- PDATA SIZE = ---- ----
- DATA SIZE = ---- ----
- IDATA SIZE = ---- ----
- C51 COMPILER V9.53.0.0 NRF24L01_API 09/30/2018 11:45:28 PAGE 7
- BIT SIZE = ---- ----
- END OF MODULE INFORMATION.
- C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
|