EDA365电子论坛网

标题: nrf24l01调不通,不明白硬件还是程序出问题? [打印本页]

作者: hope123    时间: 2019-11-12 13:47
标题: nrf24l01调不通,不明白硬件还是程序出问题?
求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内.5 v* f! S. F/ P! c: F# Y
     网上看到一个帖子的程序说是将收发两端分开调试  
5 H3 [+ e: i+ \单独调试发送,完全抛开接收,配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。
7 \* Q& G1 A# Y! t1 N9 N        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                 // 失能通道0自动应答
: f  I" P8 s8 y: W9 {' ]        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);            // 失能接收通道0
1 V6 F+ M" |8 \8 s& N  Q+ I4 d: R        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发
; ^6 G! G3 q( M9 b9 v/ q7 b, {) R: o: ]9 ]4 k9 g
而后程序如下:/ t! y' n0 g' ^
1 e+ d. l/ T* C! ^5 D# v1 B' V# T% d
#include <reg52.h>
; b2 A: ~$ c. \# F2 ^#include <intrins.h>
% L* D2 v5 f. |typedef unsigned char uchar;
1 R1 T& f0 G( W3 |' C: W' M. O2 ptypedef unsigned char uint;
8 g6 F! \2 ^) O! L; D3 O) @//****************************************IO端口定义*************************************** 5 [" b, R: u4 ^
; G  m# d9 ^' ^6 w4 z
sbit         MISO        =P2^0;
6 ~# l  R$ E* osbit         MOSI        =P2^4;: o2 g; ~" N, a6 u& B+ ?9 C' {( H8 l
sbit        SCK            =P2^1;
! v: l$ Q8 k% o  X, z' V% F' Ssbit        CE            =P2^2;
! ?( _# a& S* ^3 \% b6 g. E3 b% hsbit        CSN                =P3^3;
0 i+ u6 z9 S9 n  Q9 c8 K1 K. y7 Lsbit        IRQ                =P2^5;& X5 r! f# i9 j( H% t# R& N
sbit LED = P0^0;
4 X/ a5 u1 v: p0 z* x3 V* T: K) z" o8 v% @6 j+ {
//*********************************************NRF24L01*************************************   J/ |: o- t" K. f8 s
#define TX_ADR_WIDTH    5    // 5 uints TX address width
; N1 W8 v  p# `& e- c2 _  g& b#define RX_ADR_WIDTH    5    // 5 uints RX address width
! ~1 p. v; V' u% w#define TX_PLOAD_WIDTH  20  // 20 uints TX payload # x* l0 `6 u1 I4 y' C5 p- `
#define RX_PLOAD_WIDTH  20   // 20 uints TX payload
' V: U, N. C# i* Q. \. ^& |* }/ O8 i8 v+ S
//***************************************NRF24L01寄存器指令*******************************************************
6 r7 D" b3 A0 h, r# S( a: c#define READ_REG        0x00   // 读寄存器指令
( a" T/ b3 d+ D7 r3 x5 O& t/ p) s0 x" [#define WRITE_REG       0x20  // 写寄存器指令 6 T0 `- t/ e/ p1 C. }
#define RD_RX_PLOAD     0x61   // 读取接收数据指令 8 F- l) h5 `# @
#define WR_TX_PLOAD     0xA0   // 写待发数据指令 9 p- l/ A# W5 U9 i* \
#define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令 # \; Y2 ~3 V* m% U
#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令 1 J$ {& {6 b+ S$ }) B/ i- ~
#define REUSE_TX_PL     0xE3   // 定义重复装载数据指令 8 @. S  v) C" M
#define NOP             0xFF   // 保留 1 t: S9 P& H5 t, }9 i7 P8 j1 o
//*************************************SPI(nRF24L01)寄存器地址****************************************************
+ [3 ]3 W# T6 d% H3 |% B& d7 K8 V#define CONFIG          0x00  // 配置收发状态,crc校验模式以及收发状态响应方式 5 h! ~, g+ Q+ r% C; v  Q& b1 E
#define EN_AA           0x01  // 自动应答功能设置
; h8 e% y# r% `& I5 Y#define EN_RXADDR       0x02  // 可用信道设置 8 A  f3 l* v- g5 }1 |8 d; F0 a
#define SETUP_AW        0x03  // 收发地址宽度设置 ( l& c) P  b  ]+ W' W
#define SETUP_RETR      0x04  // 自动重发功能设置
& K$ T: ~7 W4 K# z#define RF_CH           0x05  // 工作频率设置
% o: q. k% ]2 I( l#define RF_SETUP        0x06  // 发射速率、功耗功能设置
( D* z& [! \1 ^5 x#define STATUS          0x07  // 状态寄存器 ' r+ u6 k1 ^; G  {# R- I
#define OBSERVE_TX      0x08  // 发送监测功能 ! V' ]! h1 }+ W+ Y7 C
#define CD              0x09  // 地址检测            9 ?; [2 I8 W' f7 k8 K2 C; P
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址
% [, D0 b* Y# C) @#define RX_ADDR_P1      0x0B  // 频道1接收数据地址
: X# K+ w8 W8 P#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
- ?/ H# q, V/ j1 s4 K6 _0 g0 v4 ]#define RX_ADDR_P3      0x0D  // 频道3接收数据地址
; s) G) J) z' Y4 {! Y+ r#define RX_ADDR_P4      0x0E  // 频道4接收数据地址
& y/ x& a- p0 F6 N( O#define RX_ADDR_P5      0x0F  // 频道5接收数据地址 ) F8 d# l, w5 n5 z* f) k) D' ^% V4 U( W  k
#define TX_ADDR         0x10  // 发送地址寄存器 2 u" s/ U, u" F7 m
#define RX_PW_P0        0x11  // 接收频道0接收数据长度 # @  `/ F  g& \" A0 X. M
#define RX_PW_P1        0x12  // 接收频道0接收数据长度 5 B  O% a3 p1 S
#define RX_PW_P2        0x13  // 接收频道0接收数据长度 + f8 h$ T/ [  |) \
#define RX_PW_P3        0x14  // 接收频道0接收数据长度
9 v" w  c- h% Y& U#define RX_PW_P4        0x15  // 接收频道0接收数据长度
; ^% E, o4 ^- c7 M#define RX_PW_P5        0x16  // 接收频道0接收数据长度
  _( P$ G: h& l/ i! T#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
( d4 K3 v  M! S8 e2 w: t//************************************************************************************** 1 @9 Y: r- D. X* q0 c/ y' ?5 @
void Delay(unsigned int x); 8 \7 Q, K& a1 Y- e5 ]: B7 D8 I9 `1 U, J
void InerDelay_us(unsigned char n);
/ e( R' O, Y$ f: Avoid Init_NRF24L01(void);
. f; V  p* r! c8 _; e, \1 S. W" y0 Muint SPI_RW(uint uchar); 0 c, M) m! T6 H+ R
uchar SPI_Read(uchar reg); 1 {8 n" k+ U) ]8 e( ^7 M9 h
void SetRX_Mode(void); - Q/ w- E+ b! y6 _8 u6 q* T  e
uint SPI_RW_Reg(uchar reg, uchar value); ! ?# h. j! f: ?# U9 C. U
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
9 A" D! A! V" P; F' j" _uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); 8 b$ j7 j5 Z0 a+ Q  T; ?
unsigned char NRF24L01_RxPacket(unsigned char* rx_buf);  
, }: ~/ Y6 l$ W+ a
' k9 a6 U8 R$ J( P//******************************************************************************************
+ e" q9 u$ o0 Q; b% `6 Q" quint  bdata sta;   //状态标志 , d; O: S# o  C- \' t
sbit RX_DR =sta^6;
" V7 h" V1 F, Xsbit TX_DS =sta^5;
, I! G1 \6 i+ z) X! r- Fsbit MAX_RT =sta^4;' k. g# B( S7 \+ n' t

( T* U0 H. l) W% t/ t8 z6 \% @2 q2 Wuint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址  
. n. M# p; i* U$ t/******************************************************************************************
0 d9 e; {: j$ V/ j4 R/*延时函数
, _% W0 V8 K4 G4 n3 F& d' D/******************************************************************************************/ 8 R, A4 `8 B  V* \9 Q& T# O9 p
void InerDelay_us(unsigned char n)
& }! l+ P0 O  O  C. g* F! I{ 3 Y# Q4 r+ c# @. p7 c+ ^
  for(;n>0;n--)
" \/ x+ K7 {" p5 o  {- L6 M5 I7 P& l+ ?% B
     _nop_();1 ~: N( u. J& ~" r
  }
" d0 t, s4 j# Y}2 q1 _" w; P7 j) ]; @" ^$ q! b
9 p6 D& N3 f- p/ ^) F
//*****************************************长延时*****************************************
4 {: S7 }, Q( f2 pvoid Delay(unsigned int x) 3 R% Y7 T/ a9 G2 Q/ X
{ 1 x; t# o) n8 S. r
  unsigned int i,j; 1 ]" Y* V+ |1 m. f: m( J; w+ s5 c# G  \
  for(i=x; i>0; i--)- [! y) v3 i4 V
  {
' p# [: z5 f; W; n" {) l4 H3 \9 a    for(j=110; j>0; j--);
# q2 X3 a; N* Y  }
1 O  g% w, c) s& \* n}
  }3 H& c2 N4 |% s
! T  I6 k# i0 P* `4 q6 a6 v/****************************************************************************************
# d3 Y$ G  T* O2 @/*NRF24L01初始化 , ]. h) b- a( }  h% ]
//***************************************************************************************/
" h0 q5 s  |$ ~  ivoid Init_NRF24L01(void)   o0 Y! j& I2 w
{ % E* ?& E5 y! k  A) c; T' ]; g
    InerDelay_us(100); # D( E4 n* I0 h+ m7 s$ ^8 c2 `% A
    CE=0;     
; u* Y0 V1 k8 f, M    CSN=1;     : R: k9 M# d, X/ w( U
    SCK=0;   
4 I0 l# y# G# q    IRQ=1; # x% n( O3 F* a" w
    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址  
( S8 k/ w1 _( a- `+ Y    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //  写自动应答频道0地址
6 h9 b1 r! z. A0 j    SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止      1
0 v; y: z, r4 T& k0 z2 Y) r, O5 f    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  频道0接收禁止         23 M# A% k5 M' R( i/ X" B; w% F
    SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   //禁止自动重发       3   调试时注意这三点
4 i9 F5 ?0 Q2 C+ a: l7 x) K9 c    SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致 + ]) i" Q& Y1 E- U" s
    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
0 O+ a/ s. o1 U* p; ^    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB  2 f4 a2 c! ~+ n
}6 t! o9 ?- j4 g
! P# D3 ?  }' ~! t& l" y. a! x
/**************************************************************************************************** . @- i! ]  u& n8 M1 h( D
/*函数:uint SPI_RW(uint uchar) - ]2 q" S3 f: l& |, P
/*功能:NRF24L01的SPI写时序 & c8 f0 s7 R. F% {2 B4 Y! Y
/****************************************************************************************************/ 2 D* B8 S+ }, Z: ^2 U5 j
uint SPI_RW(uint uuchar)   ^2 F# F3 f/ i, ?: ^
{
+ p# J# ]) s$ h: S8 n    uint bit_ctr;
% A1 c4 m' o, [    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
% W. E; l: G; ]& {/ ^( b    {
' m+ {: _) M/ }5 ^  ~, s      MOSI = (uuchar & 0x80);         // output 'uchar', MSB to MOSI ) |! g. N0 z( ?, o2 Q
      uuchar = (uuchar << 1);           // shift next bit into MSB..
0 v6 a5 g$ ^+ ^& Z3 ~# {      SCK = 1;                      // Set SCK high.. : u) g0 \$ ]& `4 D; H6 u: a
      uuchar |= MISO;           // capture current MISO bit
% `! _% x6 F+ z- b# R. Z% X! c      SCK = 0;                // ..then set SCK low again ; A( m2 X0 X6 c# p
    } * ^  D. k# h0 l/ D
    return(uuchar);               // return read uchar ! k4 ?9 v- N  v0 V# A# e' [
}
. H; M2 D* L- u: N
; I  g' S: [5 d8 A, ~+ j3 Y/****************************************************************************************************
9 v" W; D% f7 r/ o/*函数:uchar SPI_Read(uchar reg) 9 r5 W! D% T. T' r- V3 P4 f: n* C
/*功能:NRF24L01的SPI时序 8 [( K" h: K; A8 X) L2 P/ S
/****************************************************************************************************/ 8 @4 @: G6 K, s
uchar SPI_Read(uchar reg) & l& B0 \0 f+ o- D& v( @4 K- L
{ 4 x% l8 t. c0 h- g+ S
  uchar reg_val; / A$ }( Z' b3 t$ }$ T

" K0 ^* D% I* D8 [& R; ~  CSN = 0;                // CSN low, initialize SPI communication... 9 h( `; S0 q1 m% r( b! Q
  SPI_RW(reg);            // Select register to read from..
4 e7 T" _% U! e& K& J6 I  reg_val = SPI_RW(0);    // ..then read registervalue 3 m0 [( w( ]$ H- ^( J
  CSN = 1;                // CSN high, terminate SPI communication ) N/ X" ^. P( B' ~
, t1 O0 ~" P- u' r7 |# X# v
  return(reg_val);        // return register value
. g: b) G1 Y* [} . x  F- M2 [7 @

" w8 F3 D. {. `5 G, e! w0 u/****************************************************************************************************/
* f! g8 n" ?1 b/*功能:NRF24L01读写寄存器函数 2 ]" E$ t9 @% @5 g% h/ U/ S
/****************************************************************************************************/
. v' M. g- [- p3 P5 E. e. ~: Wuint SPI_RW_Reg(uchar reg, uchar value) , |5 c0 h' ?& s3 h6 e" v4 \
{ - Z2 W( [6 V$ U' l' ~: `% k7 X# }
  uint status;
) p- ]6 W% U% V# N: v% p8 o
, {# O3 y( }- w0 d5 h/ d  CSN = 0;                   // CSN low, init SPI transaction   k6 Y/ o9 s' z
  status = SPI_RW(reg);      // select register 1 C( V  ^$ W9 m
  SPI_RW(value);             // ..and write value to it.. # T  Y5 {4 t) [# e4 s7 U
  CSN = 1;                   // CSN high again ( u7 ]( u& s; H: n$ E/ h. D

# p9 Z+ f+ Q. y& |2 V  return(status);            // return nRF24L01 status uchar
0 }" ?$ x) r. O3 d. v} 4 \% J2 s" @, p( e  s  o$ {
. ]6 g0 T: C; o  [4 P5 Z
/********************************************************************************************************* + G5 C6 R. l  f% u5 Y- v
/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
1 w3 e+ y: E0 p2 \# o2 E/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数 3 X; D% B& F/ I, _
/*********************************************************************************************************/
4 k& d' C! K* S" d  o5 [uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) & R0 w' B( r+ D  m
{
. c9 M$ T* L& S  uint status,uchar_ctr;
9 o" A. V! ]8 ]7 v, a: G/ O3 }' b7 E$ k0 o& b
  CSN = 0;            //SPI使能        ' W- r3 @: J+ J0 n* U
  status = SPI_RW(reg);    8 V% }6 {5 k% J
  for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) // $ T2 o/ Y% `5 G/ _5 t
  {' [% V! {  E" a$ a% ?  S
    SPI_RW(*pBuf++);1 M0 ?, l. P; i+ I3 O7 F0 v
  }
2 s' z4 T9 d  p0 A; ?: d4 h1 o0 t1 w  CSN = 1;           //关闭SPI 1 \" S9 Z+ X3 Z: a) M
  return(status);    //  
/ i2 Y9 f6 Y5 t3 v} 5 a! u9 w( x" [
& y5 i" h0 T2 z4 v! ~$ |
/*********************************************************************************************************** 4 e7 }7 Z, v' Z8 K7 t- o
/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf) 6 w- w  f; J$ S
/*功能:发送 tx_buf中数据 5 ^. k% L6 A4 [% |% W4 Y0 y
/**********************************************************************************************************/ , U0 _& G6 j! a/ a4 j( E4 y
void nRF24L01_TxPacket(unsigned char * tx_buf) / Y7 _, f+ |4 B8 L& x) ^! D9 @7 @) d
{ - i% w1 a3 e7 J# H0 F0 G
  CE = 0;   //StandBy I模式   . w$ A% E( l% v3 G) L2 ~9 W4 b
  SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据  
7 j/ Q0 k! Y! |9 u  SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送 " s* N, U: s0 l: Y0 t
  CE = 1;   //置高CE,激发数据发送
. X+ u9 R& I  k( _5 Z1 u  InerDelay_us(50); 4 y8 m6 _0 O; E
}
3 d( w4 T6 _' p5 i+ U, m# U7 L+ ^6 n" b" |/ Z* r- @
//************************************主函数************************************************************
6 L" y9 w6 g/ ]- kvoid main() / l2 c$ D/ z$ v/ Y
{     
: J9 {9 a8 e7 G+ `! l+ u  unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,, u9 l0 ]3 s, R& O% S/ w4 n
                                             0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};   [) _  T5 ?* g; A5 d
  Init_NRF24L01(); ! ^- A7 i& h( `& ~2 H
  nRF24L01_TxPacket(TxBuf); 2 D: n2 M2 H7 s8 S" |# e
  while(1)
9 a. X. o0 c2 y4 a3 P) I$ k, W8 q/ k: Y  { $ s# t9 E2 Y+ O( }
    nRF24L01_TxPacket(TxBuf);
) l( ?* a* i3 t3 z6 G0 U, A; ~   sta = SPI_Read(STATUS);7 z- `& ^4 Z1 {- c) }: r
   if(sta == 0x2e)                      //查看是否发送成功9 {3 J( o, M4 ?" K' [! ^2 J/ m
    {6 J& v2 x: h7 `& f) U; T( D
       P1 = 0xfe;     
, N4 y' n% @4 V# G+ i' j+ D' v}& T- K: m3 h- a2 d8 u
    SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器 / y6 e0 u; g8 _# h% R+ T+ k& A
    Delay(1000); //延时
  c5 W) b8 T) j- ~) k   }  
% q; W! i, q' k. |4 O1 O} , H$ C! X3 S0 {, L! ?
*
* m  Q( r4 C. ^% U8 @4 [% V

, }! h; B* W9 T/ `" G
作者: aarom    时间: 2019-11-12 15:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: hyz12888    时间: 2019-11-13 08:24
:hug::hug::hug:
作者: 无聊搞飞机    时间: 2019-11-16 23:02
搞个仪器先确认硬件吧!




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2