|  | 
 
| 
求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内.
x
EDA365欢迎您登录!您需要 登录 才可以下载或查看,没有帐号?注册  ' Z1 M' a7 M" G) r     网上看到一个帖子的程序说是将收发两端分开调试
 + [; @, H1 f4 x. n5 F( y( x单独调试发送,完全抛开接收,配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。
 # F% C3 X5 S. P        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                 // 失能通道0自动应答8 C' d' K# {0 K" G$ ]
 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);            // 失能接收通道02 H/ r! j, z) l9 @; e
 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发
 ; T0 _! X7 U6 x  b
 6 _9 M9 y. a5 @- {" g3 N7 m而后程序如下:! r: P, ]# B  m) F! M. y  R
 
 6 F: R& r7 J3 T7 p# S#include
 ( k4 b+ ]' r# @) G: q5 S; J#include$ H% P, r  |7 B& d
 typedef unsigned char uchar;" |. \2 D2 R7 F' j
 typedef unsigned char uint;/ h; v" ?4 }/ Q  z  y6 T
 //****************************************IO端口定义***************************************
 3 j3 F) W+ [0 k8 C5 b5 {" O% d" E+ H+ @: u' h1 ?
 ***it         MISO        =P2^0;+ j8 L; e( m# r4 M1 k
 ***it         MOSI        =P2^4;. C8 u! o3 y9 Y% d% S5 @
 ***it        SCK            =P2^1;
 " ?" d! y( ~  Q2 i***it        CE            =P2^2;
 & ^! g; @4 @+ H  f9 d) k***it        CSN                =P3^3;; `$ z. |3 R0 n% J7 ?! y$ J
 ***it        IRQ                =P2^5;. B/ M  I$ U, n  ?  D
 ***it LED = P0^0;
 * a" J: G, L/ d* f8 R4 P! j! j, S4 y, \; J8 L$ L4 E
 //*********************************************NRF24L01*************************************( T$ U* J4 x- |2 M% n* s6 Q
 #define TX_ADR_WIDTH    5    // 5 uints TX address width
 5 G! k& m: {- G4 T& ~0 Z4 H6 k#define RX_ADR_WIDTH    5    // 5 uints RX address width
 . f, U% V, w+ {0 R4 Y; m2 E/ J$ M* R#define TX_PLOAD_WIDTH  20  // 20 uints TX payload# G5 ~8 @' V5 T; D  r
 #define RX_PLOAD_WIDTH  20   // 20 uints TX payload: k+ \& n. h) X* O
 
 / [8 Y; j& f, _  e8 v6 M//***************************************NRF24L01寄存器指令*******************************************************
 4 {* g! y, b  C2 s. E& B#define READ_REG        0x00   // 读寄存器指令
 5 z$ `2 l7 h# A% A! ^" B- ?8 j#define WRITE_REG       0x20  // 写寄存器指令- y  [8 h* P: K
 #define RD_RX_PLOAD     0x61   // 读取接收数据指令+ w8 ^+ G% z- E# R1 q. ^  ?
 #define WR_TX_PLOAD     0xA0   // 写待发数据指令
 ! {: `  U/ y# d5 C6 k" o#define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令/ G& s# m$ R8 P" x! s6 Q/ W
 #define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令. R, B- d- X! x
 #define REUSE_TX_PL     0xE3   // 定义重复装载数据指令
 # A6 j; S) R1 I2 s0 R" E4 ]; P6 ~#define NOP             0xFF   // 保留
 1 w+ i  l+ H! U/ ^8 H( S//*************************************SPI(nRF24L01)寄存器地址****************************************************
 1 D0 p) {! a3 D. F! R5 ^" a3 T#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式& [6 g. H" V4 b! e
 #define EN_AA           0x01  // 自动应答功能设置; x( w- o8 Z# s* z; a$ ~9 ]
 #define EN_RXADDR       0x02  // 可用信道设置( ], h3 J1 P3 q$ M
 #define SETUP_AW        0x03  // 收发地址宽度设置
 + O- u/ e) o2 T" t#define SETUP_RETR      0x04  // 自动重发功能设置
 3 l1 e4 X) l1 h: o, D  H( m#define RF_CH           0x05  // 工作频率设置
 ' a/ k1 f) p6 s9 D#define RF_SETUP        0x06  // 发射速率、功耗功能设置
 9 D2 k+ k# I3 q" n/ ?#define STATUS          0x07  // 状态寄存器/ U1 T' A3 y0 a- \* }/ V3 R
 #define OBSERVE_TX      0x08  // 发送监测功能8 ?9 j# N7 H7 j) `$ R% T
 #define CD              0x09  // 地址检测            ' T* x7 @$ Z2 J% B/ x; q& o
 #define RX_ADDR_P0      0x0A  // 频道0接收数据地址8 L& e4 f4 L0 o  Z/ i, x
 #define RX_ADDR_P1      0x0B  // 频道1接收数据地址
 " E  A- @" e. Z5 z" {! d+ H#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
 $ M6 r: i% h! V- O5 P#define RX_ADDR_P3      0x0D  // 频道3接收数据地址
 1 S$ l/ t& X1 h2 Q) C% E0 I#define RX_ADDR_P4      0x0E  // 频道4接收数据地址* H6 i9 V* v8 _. C1 O1 F# a
 #define RX_ADDR_P5      0x0F  // 频道5接收数据地址! k0 b' R5 z& @& N3 h( `5 i
 #define TX_ADDR         0x10  // 发送地址寄存器
 : z3 C7 t2 @; t; I; H#define RX_PW_P0        0x11  // 接收频道0接收数据长度* Z5 W+ A7 K) p* G3 d. }
 #define RX_PW_P1        0x12  // 接收频道0接收数据长度
 6 @; B$ R; F+ W0 v" K3 ]# ?4 U#define RX_PW_P2        0x13  // 接收频道0接收数据长度# j5 ^: Z; g! ?9 B
 #define RX_PW_P3        0x14  // 接收频道0接收数据长度
 . J- N% G4 j( \8 h# F#define RX_PW_P4        0x15  // 接收频道0接收数据长度
 * w% A4 j% \( }#define RX_PW_P5        0x16  // 接收频道0接收数据长度1 }! ^+ g& J1 u+ G; d! A
 #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置) m; q# r* K; S5 ~  S9 T! r
 //**************************************************************************************
 6 f' m+ U$ H3 W: Y# Svoid Delay(unsigned int x);
 4 Z5 G, U) T& }$ r# ~. dvoid InerDelay_us(unsigned char n);
 0 Q1 z; I9 W5 L. j: W0 k, j# [5 Dvoid Init_NRF24L01(void);7 }& s1 V; S( x" v. `, R
 uint SPI_RW(uint uchar);+ T: N+ X. K5 [2 ^9 B4 j, v
 uchar SPI_Read(uchar reg);
 ! Q# d+ X8 {% j8 F8 Evoid SetRX_Mode(void);
 * D4 r+ L( H# K* xuint SPI_RW_Reg(uchar reg, uchar value);# D9 i, V$ X: C: J9 t% r4 G" s
 uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);2 x" G! Q/ l0 `4 L7 ~4 k
 uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
 * |3 K; M- @! O6 X9 Q' ?* Iunsigned char NRF24L01_RxPacket(unsigned char* rx_buf);
 ; m$ _& f* `& s) H2 U6 A# R
 W! O+ ]% C0 q7 p$ P( [//******************************************************************************************
 1 f2 B( z4 n/ m9 Q# u) C1 |uint  bdata sta;   //状态标志/ p, h( G9 X; Y
 ***it RX_DR =sta^6;( }7 V6 }+ E: O- _+ T& Y1 [" j( v
 ***it TX_DS =sta^5;6 ^+ {& Q  o5 p8 V
 ***it MAX_RT =sta^4;% x6 [  n% N$ u+ Q/ g# O
 
 ' |6 G# I( w. n6 {+ }- Luint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址  * C) g! ?% T+ W) |! E
 /******************************************************************************************# x/ d# B* `  M$ B# P  i- m$ L
 /*延时函数9 {0 p' ]% m! ^: @4 k$ I( b; T
 /******************************************************************************************/
 ! A9 T! V8 P1 Zvoid InerDelay_us(unsigned char n)* z0 j7 L7 z2 F% C: E+ Z2 o
 {
 2 c4 G% P; m. U& S# y6 T  for(;n>0;n--)
 - x: C$ e  ]& \# Q/ ~  [  {2 B% W/ P) G# E# a7 W/ p3 a# o
 _nop_();  V9 a9 n0 Q) {& ?
 }5 z/ e, c3 ~! m0 m
 }" s) T5 A9 l4 x7 ]4 m6 g
 : [2 P5 O- y# v
 //*****************************************长延时*****************************************
 ' @1 B3 |' a' [0 |4 Dvoid Delay(unsigned int x); R% T+ O7 X5 t% @, u2 O
 {
 4 _7 g) |$ y9 k' ?6 \/ E& t  unsigned int i,j;0 E8 j' e9 O- ^: x3 G* f  @
 for(i=x; i>0; i--)" J& U5 z* h  @' ^/ @4 p0 G+ u
 {
 + a. w  r) r+ Q    for(j=110; j>0; j--);
 5 S. Q; d& @0 Z. @6 G! }  }
 3 Q* b5 R3 a; A  X- ?) [}+ A$ d6 E7 }+ o4 ~: }6 }6 `; M
 / b, |9 W) J0 H6 }
 /****************************************************************************************
 & L4 p6 j5 [, x) J/*NRF24L01初始化
 , \5 q3 y  o( w5 L( X) t% E//***************************************************************************************/2 B! ?2 S, a% j# ]3 h, o+ l
 void Init_NRF24L01(void)# ~6 H1 W/ ^8 u: l6 T4 ]
 {
 & K+ _6 n1 t3 u, `; G    InerDelay_us(100);2 K" t0 {' |$ @8 N! V7 I3 r, E
 CE=0;     * |$ B9 }! f! X
 CSN=1;     $ i- Z4 U; G5 u+ j! `4 x/ f) n- ]  U
 SCK=0;
 # e8 d: m% @3 t8 @1 d2 }    IRQ=1;4 k1 c  v7 d, y( ^
 SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址
 ' h+ S9 V4 {& E2 o% G    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //  写自动应答频道0地址
 6 ]! X* K5 `# \  _2 |# P0 H2 U    SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止      1
 0 ?# w8 f% ^# Y$ x" |    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  频道0接收禁止         2
 8 l% p- d3 w7 T9 O3 K  s    SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   //禁止自动重发       3   调试时注意这三点
 1 A1 ]  M; o1 o- @    SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
 7 a, F7 x4 Z1 @( H2 m+ [/ T- Q- b    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节+ a: _8 ?2 R) K  o- N
 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB
 : A) Q9 Q$ j' |  M' {) M}9 Q5 S1 A" Y* d/ n2 _9 M7 f1 l
 ) j+ Z1 ^1 {# p
 /****************************************************************************************************
 / P  T# k3 L+ K$ U, t8 b$ H0 F& n/*函数:uint SPI_RW(uint uchar): I, [% k& P1 ^
 /*功能:NRF24L01的SPI写时序
 " z8 |) g! U+ D. W( {/****************************************************************************************************/( a3 Q0 a: j' g% F8 j
 uint SPI_RW(uint uuchar)
 ' O7 t- ]' `. @' K{. g2 z2 |4 `3 ~* z
 uint bit_ctr;7 ]- ?. S, q% o4 |0 v1 `
 for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit2 ^8 l! C* N6 b8 e! H9 T8 y
 {
 + l- v7 P: S# M2 S9 Q: ]/ W      MOSI = (uuchar & 0x80);         // output 'uchar', MSB to MOSI- z6 R  g* z% F, j4 t/ d8 G
 uuchar = (uuchar << 1);           // shift next bit into MSB..4 L/ {8 m0 w3 i3 [$ m* j7 d" o: Z
 SCK = 1;                      // Set SCK high..* [0 _* y# j- K7 }
 uuchar |= MISO;           // capture current MISO bit
 ; H1 J& @4 v) M- d" B      SCK = 0;                // ..then set SCK low again
 7 o( f4 v* A1 I+ n. E    }
 ) Q( a8 R* l/ S1 i5 y    return(uuchar);               // return read uchar' x* w4 G! l$ p# s/ a+ I0 t; X
 }
 ( `. J$ c% A8 H, i* q) c5 @% k( G5 ~* L. k
 /****************************************************************************************************
 ! U8 s  x. x$ O/*函数:uchar SPI_Read(uchar reg)' ]- n' \$ f3 @5 q& w  ?
 /*功能:NRF24L01的SPI时序% o- m8 G) s4 \3 A
 /****************************************************************************************************/, r+ m1 ?( g' o( G
 uchar SPI_Read(uchar reg)
 ]) b1 O( o2 d" p! V{% P  q2 H' @4 Z" c9 N
 uchar reg_val;
 3 R) b9 Q( {) r! `. G9 t, q1 a  D$ O, e
 CSN = 0;                // CSN low, initialize SPI communication...
 1 ?' {9 p1 f0 ?. J  SPI_RW(reg);            // Select register to read from..
 J4 u5 X8 \9 V$ P  reg_val = SPI_RW(0);    // ..then read registervalue  \7 }) E# L7 x2 d: N7 ?$ `
 CSN = 1;                // CSN high, terminate SPI communication7 J2 j: x; d" _* ~) t3 m* q
 X0 U# T7 ^( t  s+ N# l! A4 z
 return(reg_val);        // return register value
 - D9 y$ j% w% b) O}6 z& j$ J0 j2 t* [  m% N/ e$ }9 ?
 
 * q* G2 R5 E8 h! ^# j) U/****************************************************************************************************/
 8 W% C5 y" V; H+ p  r% @/*功能:NRF24L01读写寄存器函数
 " s: z$ `; d0 D/ c& A9 V/****************************************************************************************************/
 8 @6 k  U1 U9 l. u& @7 x. duint SPI_RW_Reg(uchar reg, uchar value)4 Q3 i% j5 c# f
 {4 b/ f( C6 M7 @' ~7 C. K- |
 uint status;
 3 \3 {/ Z  c1 ]# B) R9 {! b* K8 c, {' j
 CSN = 0;                   // CSN low, init SPI transaction
 / ^- K( m1 B' y/ N7 D! D8 \/ u  status = SPI_RW(reg);      // select register
 & S1 ^1 O3 ?1 s; N+ U  SPI_RW(value);             // ..and write value to it... o+ p4 v3 Q) u; b$ v. s$ P  ~& b( H
 CSN = 1;                   // CSN high again. q" q7 F! z$ l9 ]
 
 : `0 U' K+ Q3 n  W8 M  return(status);            // return nRF24L01 status uchar, B4 `  r( L7 W9 ~) O
 }
 ! ~9 V! t% h1 J% k+ F
 / r/ ~9 @2 _) ~- F/*********************************************************************************************************
 . Y# F1 e$ V* L/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars). b( y! Y* O, {- x
 /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数( T$ k4 s/ d" [5 D. m( C( v) I# S
 /*********************************************************************************************************/
 3 U+ q, M0 ^3 [6 j+ _' zuint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
 7 \" E7 J0 ^* F- X1 Q- F+ f{
 $ r% T3 f* [4 ?% d0 H  uint status,uchar_ctr;
 - Q1 b; x, v( s2 k) Z. N) h4 Y$ T1 f* N; k' }
 CSN = 0;            //SPI使能
 , {# y+ t+ T5 m5 V  status = SPI_RW(reg);   9 z/ |3 j( P; k' N7 f( L" B
 for(uchar_ctr=0; uchar_ctr   {
 7 F- t4 w) X6 J4 Z7 M, i# l/ `* h    SPI_RW(*pBuf++);( h$ B+ {. \( ]- E' _, R( w! u
 }8 j+ U/ c" U2 c& h; m
 CSN = 1;           //关闭SPI2 z# J4 @- j/ Q/ Y& y& S
 return(status);    //
 : n2 z1 K: ^/ w}0 F$ n/ r  O6 g+ C
 
 ( s8 ^" t9 y! y" |/***********************************************************************************************************! ^1 X1 J3 q# `$ v7 H1 |& |
 /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
 + P3 x. I  ~9 l: C/*功能:发送 tx_buf中数据( o. s% I; ^$ ]! [# {
 /**********************************************************************************************************/- ^; A* d, [# L0 `7 F" \
 void nRF24L01_TxPacket(unsigned char * tx_buf)2 X8 B8 u, `( U& d- B" ?
 {
 1 p3 ~) K/ W8 f7 C! g2 L  O8 }; h  CE = 0;   //StandBy I模式   # ~+ V0 _( p2 Y+ e( S
 SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据
 3 O4 M! q4 _: g0 d  O5 ^: d  SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送
 T# ]$ P9 O% F0 |  A  CE = 1;   //置高CE,激发数据发送  K9 B/ f, f6 v6 a2 @
 InerDelay_us(50);! v: b- D* C+ Z0 k5 o' k
 }
 " L' |$ \8 v- J$ j* b
 3 [# s) O: O2 r! T//************************************主函数************************************************************
 ) |$ n$ a- V% }9 Q. evoid main()
 5 H/ u( s1 N$ h7 D{
 3 l; p# k! A# Q( q; `6 A  U  unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,& x5 u" i6 h0 S$ g0 G/ M
 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};
 & `/ D3 g, F  c4 p+ H  Init_NRF24L01();* B: _1 J# ?, f6 ?; t/ s3 b
 nRF24L01_TxPacket(TxBuf);4 O2 m! f% V( F0 G
 while(1)  q( d* b& a7 j
 {+ y+ ~) J% h% I! B
 nRF24L01_TxPacket(TxBuf);9 W( Q2 S$ }8 s+ @+ d( B
 sta = SPI_Read(STATUS);6 N# I) \* h3 H- B7 Y$ s6 l
 if(sta == 0x2e)                      //查看是否发送成功
 0 [8 {$ K1 ^$ P$ U. Q    {
 . @( X0 `1 k8 W, y       P1 = 0xfe;     / K  u  L, h5 \, A
 }
 - `  J0 M+ d$ u# S! `6 B    SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器+ ^8 o, r1 C  w
 Delay(1000); //延时
 - T' @# i8 M: ~5 y   }  2 [3 S: N! ?4 K% b! t1 H  e6 y" r& i) @
 }
 8 g6 G# q5 _% e/ q*
 1 m7 `) [  d$ X8 C" x" v; h2 c' q, j) z
 
 & t! h* I2 `% {% p# Q8 T
 | 
 |