找回密码
 注册
关于网站域名变更的通知
查看: 557|回复: 3
打印 上一主题 下一主题

nrf24l01调不通,不明白硬件还是程序出问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2023-3-7 14:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内.8 h' x; y( R) o- y5 q: q
     网上看到一个帖子的程序说是将收发两端分开调试  , J, c# Y. i1 @& z6 n
单独调试发送,完全抛开接收,配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。2 l& J3 n% R$ N- S. M
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                 // 失能通道0自动应答4 i% n% j4 `9 F' {) s4 N9 r
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);            // 失能接收通道0
# Z7 K. @' C, w* @        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发1 L4 `: b9 D$ H& K* C8 j5 V9 s1 R
, H6 T( `# y6 J$ S: X
而后程序如下:. c1 }# a( v4 N% p. O4 b
; U$ g* X; C  \9 C0 i& h4 E
#include
; S! }: }2 R0 m5 Z1 b$ L' B#include6 L/ ]0 a/ w: L' v
typedef unsigned char uchar;" X5 h: s! B+ {8 f3 ~2 {
typedef unsigned char uint;/ s, q. h3 b! q" p, O  i" z
//****************************************IO端口定义***************************************
3 R( r9 B* x4 S# Y( D+ ]& |( k* F
$ m* ]; s& \$ b! G# {. t! C***it         MISO        =P2^0;! F5 x' \( i0 c: R- k/ f
***it         MOSI        =P2^4;. K) {% p' n  i7 }3 q# D1 k# Z
***it        SCK            =P2^1;
1 @- b8 I) I6 m: [! R9 z0 w4 g***it        CE            =P2^2;0 P# y! N& p( O2 X3 S
***it        CSN                =P3^3;
' \7 B. p7 T2 }7 l( G***it        IRQ                =P2^5;
6 `- [1 G( f8 N***it LED = P0^0;- U. {1 H% x# W/ K) A! V- h; [+ \0 T  Z

6 N" f" B+ K$ K( _& H. W- ^//*********************************************NRF24L01*************************************+ V% b. F2 C$ m5 N6 g
#define TX_ADR_WIDTH    5    // 5 uints TX address width
3 U9 Y5 N, E5 y1 X#define RX_ADR_WIDTH    5    // 5 uints RX address width7 O; d$ X6 v! K" b
#define TX_PLOAD_WIDTH  20  // 20 uints TX payload% }& [1 m; }+ u8 k$ e5 Y0 ~1 A# t
#define RX_PLOAD_WIDTH  20   // 20 uints TX payload
, L% I8 i. g( Y% X' @6 X8 u2 J( o0 I* Z! g# O. f
//***************************************NRF24L01寄存器指令*******************************************************
8 C3 {3 n6 y0 |( n#define READ_REG        0x00   // 读寄存器指令
6 d$ }: ]- q5 U3 [5 W( x& Q#define WRITE_REG       0x20  // 写寄存器指令
1 v! [7 K/ h2 Y3 g* j7 }#define RD_RX_PLOAD     0x61   // 读取接收数据指令
/ E8 @; Q* y3 c; f#define WR_TX_PLOAD     0xA0   // 写待发数据指令
1 j; N; b0 X) u#define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令+ J& L/ X5 i2 V4 h/ F' v
#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令* q' X1 ?" C" D9 J2 [5 d/ a6 u
#define REUSE_TX_PL     0xE3   // 定义重复装载数据指令  {5 O1 ~6 w) {$ F' [& E
#define NOP             0xFF   // 保留
7 b' y5 K! p( x6 }//*************************************SPI(nRF24L01)寄存器地址****************************************************9 @  d) @/ G! b8 D" A1 Z
#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式- ^: H1 a9 R% A3 \. L
#define EN_AA           0x01  // 自动应答功能设置
% @4 M% }6 c, @( G8 X#define EN_RXADDR       0x02  // 可用信道设置2 ~% u* R& e9 Q/ K% }
#define SETUP_AW        0x03  // 收发地址宽度设置, ^" M  G3 [4 n/ H0 [# E
#define SETUP_RETR      0x04  // 自动重发功能设置  [; ^* v  {! v5 e0 M3 s3 w
#define RF_CH           0x05  // 工作频率设置
$ X! _. A" d& r4 O* e- Q#define RF_SETUP        0x06  // 发射速率、功耗功能设置1 W3 d4 z0 U/ B/ i) Q
#define STATUS          0x07  // 状态寄存器
, @4 C$ z8 a7 V#define OBSERVE_TX      0x08  // 发送监测功能' s  u1 ]: a1 M6 C; a  W" K" R
#define CD              0x09  // 地址检测            - `' h# J! C8 x: C& w6 D
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址6 U% \( a  g1 O3 P3 C- x
#define RX_ADDR_P1      0x0B  // 频道1接收数据地址8 d1 P- ?/ q2 V& }' Q7 z- y
#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
; v, j4 S$ l- C6 R6 Z/ ~#define RX_ADDR_P3      0x0D  // 频道3接收数据地址
3 J' B2 P9 s5 W6 A/ y# F#define RX_ADDR_P4      0x0E  // 频道4接收数据地址
3 Y' V% r4 F5 d! g; g" {% ~/ W* n; }#define RX_ADDR_P5      0x0F  // 频道5接收数据地址6 Q- ?2 P, E  f% P( V9 Q1 M
#define TX_ADDR         0x10  // 发送地址寄存器+ @+ ?& X" X" z( Y. u$ j
#define RX_PW_P0        0x11  // 接收频道0接收数据长度9 U% ?' C( m+ R+ L% g, ]" v& O
#define RX_PW_P1        0x12  // 接收频道0接收数据长度- a; d7 ?" J$ a6 @: k" G
#define RX_PW_P2        0x13  // 接收频道0接收数据长度: n; p5 F3 ]+ ]6 A
#define RX_PW_P3        0x14  // 接收频道0接收数据长度
) ^+ m9 i: ?+ ]: C: U' u' b/ B2 g#define RX_PW_P4        0x15  // 接收频道0接收数据长度& B# {$ |4 ?, `$ d' b
#define RX_PW_P5        0x16  // 接收频道0接收数据长度' x. R4 j$ X4 Y8 k, l2 p
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置+ ~( R; j; N1 }( X5 D
//**************************************************************************************# x! g2 |+ F: B- i; A& I
void Delay(unsigned int x);
( \, W- I. o, p" h& t* [# vvoid InerDelay_us(unsigned char n);* g  W; z/ @1 T/ w% ~! ~
void Init_NRF24L01(void);3 N3 w: O% t2 A' I" a1 t
uint SPI_RW(uint uchar);
2 a5 v& k1 {, @uchar SPI_Read(uchar reg);
* Y& g+ h0 ^4 c; S2 ^4 g$ j) Q. [void SetRX_Mode(void);$ C' y% [3 n9 f1 y
uint SPI_RW_Reg(uchar reg, uchar value);' [3 Y8 c. g  N0 l3 Y
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
% b- T( ^* m7 }$ v8 g  l# v1 Guint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
( E  ]3 l9 w( U' h' dunsigned char NRF24L01_RxPacket(unsigned char* rx_buf);  
) }4 l& e1 Y" d7 V' X' \2 Y1 L, t% f
1 w; t7 ^2 o$ l" n' a5 J//******************************************************************************************
- q' t; F* D' c  P0 Yuint  bdata sta;   //状态标志
: G! B2 m5 U! l/ D5 e7 }***it RX_DR =sta^6;2 k9 X% e9 u( j* g: S
***it TX_DS =sta^5;9 d6 `2 J$ t& F  G
***it MAX_RT =sta^4;; S1 x2 w: q- F5 s# l

9 r2 ^  i7 Q. d& B% g. ouint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址  $ i8 T4 n: J% z9 {, M
/******************************************************************************************# I, c1 b0 n$ P+ K% p# ?4 ]
/*延时函数; b9 h+ S# Z# {) ^) I* O& Z' F( [
/******************************************************************************************/, p3 l) D# h7 w3 m  I/ a
void InerDelay_us(unsigned char n)
- t. s- h* l( u, _{
. m( I, D0 F/ n9 g, ]! W8 d$ `  for(;n>0;n--)
4 M# B9 {& e  s( M5 S  {9 x1 ~8 M* {5 S. f1 Z" h; q
     _nop_();
: y1 @0 v) c" ]  Q" l. e$ I  }
: Z' D% a' w, J1 V; z& H% j+ P# ?}/ U. a% N$ t5 n
* s4 t5 g; t7 L, t6 F! j4 C
//*****************************************长延时*****************************************
! [* I5 i+ N! T+ c& w& ?void Delay(unsigned int x)
3 r" Q: @. J& v, W" s" K{0 a4 A& t2 H" n# P* x7 k
  unsigned int i,j;* V  D; V  n# Z8 h) ^+ N
  for(i=x; i>0; i--)
2 b9 N7 N1 n  U# }" Z7 N  {$ l8 s. F: x! l1 X- {
    for(j=110; j>0; j--);# [$ v2 f/ g7 o% [& K" J# |" |
  }
7 H' p$ h9 Y# E; K' `2 ~( E}
6 v8 a3 y7 d$ I. T* i8 _3 d
+ Y0 Z  M. |9 p/ a/****************************************************************************************
: q+ ~8 s, {0 M6 ^2 _' D/*NRF24L01初始化
5 t7 E% f2 Z3 P! o//***************************************************************************************/& d9 |; |( S3 Y- |  B
void Init_NRF24L01(void)% t7 z, _/ ^6 W
{3 H4 B2 T' @1 H. M/ O- F
    InerDelay_us(100);8 N* g% S4 W8 e
    CE=0;     - V8 q! D, K$ a' W4 e
    CSN=1;     
( d4 m  h2 g- l' O- t7 p' I    SCK=0;   % Z& M" n  U; k
    IRQ=1;
& u6 }' ]' C- Z/ X& d$ |    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址  
; E6 Q7 o+ O4 q: {0 M' b    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //  写自动应答频道0地址
# H1 t, N1 q8 [* r$ P6 _    SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止      1; W' d$ e' n+ U' P& j0 c& R
    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  频道0接收禁止         2
; c# @6 Y9 E4 K* ^- n* n* ?    SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   //禁止自动重发       3   调试时注意这三点
5 K% X2 D, T4 D) e# d    SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
$ _, T- w5 n. r2 R6 _# u    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
2 d3 y+ c% ~) O( k/ q  l# Y    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB  " D9 F* P% J: b, H9 N% Q- s3 o
}
9 i* d: {0 H+ |, E  K' X& u5 r2 R* C, Y7 q4 `. D, @* g
/****************************************************************************************************
. h" i- a! [- n/*函数:uint SPI_RW(uint uchar)
& r7 {( s1 W  }4 b/*功能:NRF24L01的SPI写时序
/ a2 F: R9 o, V4 }/****************************************************************************************************/$ ]. C8 D. K) W$ f  |+ v
uint SPI_RW(uint uuchar)* \" t9 H1 q, U( g! b7 Q) E
{- F; H' @. p: A* `/ h! Y- f+ v1 P3 _
    uint bit_ctr;% M4 O' E5 q( I' p
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
0 t$ R0 t, I% F0 k$ L    {$ Z" o8 I3 c! p" R. C5 }
      MOSI = (uuchar & 0x80);         // output 'uchar', MSB to MOSI  A: w; _7 V/ G" r+ }3 n4 V
      uuchar = (uuchar << 1);           // shift next bit into MSB..
2 D9 U+ N) q% t8 ~      SCK = 1;                      // Set SCK high..
8 r2 z7 N" T3 l, c9 d+ P6 t  R      uuchar |= MISO;           // capture current MISO bit2 M: ?9 I& E9 ^7 \
      SCK = 0;                // ..then set SCK low again$ D: k4 A* P6 M  Y, {9 `
    }) e# P8 t8 }$ j# |
    return(uuchar);               // return read uchar
1 O, K. k3 X  @8 o" Q8 g}
9 n# ^% r. s- y; a8 u% D) \' @! E
/****************************************************************************************************
; ^8 @4 ]8 z; q0 y1 H( \/*函数:uchar SPI_Read(uchar reg)
/ `5 G; C" h8 a4 R, v/*功能:NRF24L01的SPI时序
$ F" ~# G6 @* F1 |0 u9 g/****************************************************************************************************/
# [0 F; c7 x) W( Y( B% H( Luchar SPI_Read(uchar reg)2 K2 L3 K0 b# d/ I
{; u' H! a: w: s4 F! L6 c; E# I
  uchar reg_val;9 ^0 F; l0 a2 f1 b' S$ O

) O) `# i/ c2 m, L1 }7 ~; F  CSN = 0;                // CSN low, initialize SPI communication...
" R) }, G; C4 o7 {  SPI_RW(reg);            // Select register to read from..( e) q% d$ s' h% t7 N/ b
  reg_val = SPI_RW(0);    // ..then read registervalue
/ K3 Q+ s4 `% T  CSN = 1;                // CSN high, terminate SPI communication
8 C8 I: u1 d1 s$ D1 O, y- S* H8 x+ J8 y$ z) l) x
  return(reg_val);        // return register value) `& ]" ]5 L9 ]8 V, y5 F5 N
}/ ^, w' U) Z# e
; W, z; z, p* D$ A/ Q. n; r$ M- g
/****************************************************************************************************/
$ r1 D3 T+ g! w4 F) L) f1 r) C/*功能:NRF24L01读写寄存器函数
, f8 @! [$ b; n8 Y/****************************************************************************************************/
- U+ g# @  ]5 ]9 C: }$ Nuint SPI_RW_Reg(uchar reg, uchar value)
5 ^+ _7 i- h( B3 d8 Q- }2 D  y{5 q% r* P0 R2 ]- b% S6 u
  uint status;$ k+ h* C. @+ i; s2 h5 n' C

! e, f( k7 m8 B, a+ H- H$ p  CSN = 0;                   // CSN low, init SPI transaction0 U2 `1 W7 L- s+ U8 r
  status = SPI_RW(reg);      // select register8 D9 z" I8 E, n% z5 u
  SPI_RW(value);             // ..and write value to it..1 E- k$ i  r! L8 x* w% P( Q
  CSN = 1;                   // CSN high again8 j( ]' b* J* }; h. @+ `! q- H
* h4 l9 w4 ?3 ]+ x1 A0 R8 b( F
  return(status);            // return nRF24L01 status uchar5 S/ d+ y4 I4 U; p0 i+ Y
}
: `/ Y9 S% ^5 n1 G8 i9 w" }- i
# p8 d+ L. Z2 S7 C7 ]/*********************************************************************************************************
8 Z9 ]9 M' y) B3 z" j6 ^& o/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
1 X& X/ K$ s: J: M3 K0 [/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
5 E: }# d( p4 z  N' W6 t/*********************************************************************************************************/
% B" Y: V$ j" X) j; Q, l# S$ [) Cuint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)9 G& K1 m) \: b! e: K
{) t( c2 Y: e1 F6 x4 E' e
  uint status,uchar_ctr;/ }4 g9 i  l+ N

* X. e  j$ Z6 Y+ i  CSN = 0;            //SPI使能        % k( {, F( T4 b; G) R; V
  status = SPI_RW(reg);   # v9 R2 K2 X# c7 j- p
  for(uchar_ctr=0; uchar_ctr   {( R* K3 w  I/ ~0 [) \7 s. v
    SPI_RW(*pBuf++);
. B- y& r! m5 i3 E3 d: W  }2 S/ y, W" p, H% G/ T
  CSN = 1;           //关闭SPI' [9 U3 e' b4 w- G% `
  return(status);    //  # a2 m& l: k4 A% C! U% ?
}, R4 i; E9 d; B+ e; z% R6 s2 F- r/ B

, Z& u  K/ x5 C9 G6 a2 J/***********************************************************************************************************; n+ d! ~" F* t- u4 f" b
/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)$ X6 A) o  E0 A$ s5 {
/*功能:发送 tx_buf中数据3 K0 }: @" c) [( S) h" E
/**********************************************************************************************************// `  b0 ^# z% ?
void nRF24L01_TxPacket(unsigned char * tx_buf)- O- v- e' w5 l: E$ b4 C
{
; w) t- ~$ L, I- [" L& @: P  CE = 0;   //StandBy I模式   2 u. z1 Q% j- u7 B
  SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据  6 g. h, Z9 a* U1 v  j( X
  SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送. e  V, s9 H; D" A
  CE = 1;   //置高CE,激发数据发送
+ t7 ]& ^5 L; H& h' W* L( K  InerDelay_us(50);" ~- B! z) c; F! r3 L" `9 K4 I
}$ a) U+ t% B. B1 }/ l) G) w3 u
5 h3 n: s4 B, d
//************************************主函数************************************************************( }/ j3 N3 g+ c! S2 i, Q, e
void main()
, P' Z  Q  k: D# u& E. ~: H{     
, P" ^" f9 c0 z0 J6 j: W  unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,
( J( g% _& S, j. f4 W                                             0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};( \  U( A" t# J$ D- d* f0 J4 Q
  Init_NRF24L01();
& w$ ~5 k) T$ X6 j8 M$ s  nRF24L01_TxPacket(TxBuf);
$ m- ]" z$ q' z& D  X  while(1)
7 t/ g8 \- G0 r5 w8 B- W5 F. F9 r  {, E: ~- J4 q* I, A
    nRF24L01_TxPacket(TxBuf);
2 k; Y2 L1 Z! X3 M, ]1 T   sta = SPI_Read(STATUS);9 V2 n9 R/ ^, L  k
   if(sta == 0x2e)                      //查看是否发送成功9 p5 `. {; E+ `$ A& ~/ g2 e: K% C
    {
& P( x5 ]) s5 t( G0 d4 o) J" |       P1 = 0xfe;     
, m/ N. d* m6 z, z}
9 D1 ]) _1 Z! V$ u$ `    SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器
9 R+ C- \/ P- K    Delay(1000); //延时
9 X; n# |3 H& Y0 t: _5 \   }  
3 L+ |( B% l, ?7 M/ T( o) [; a7 g}
( E0 y$ T+ T% C/ x/ v$ v*  w9 j8 w. n) A+ j2 w9 n
! s- {$ g. R5 t3 g6 G* P; K- j  Z2 e
! p" H$ d3 O# f* S4 T

该用户从未签到

2#
发表于 2023-3-7 15:20 | 只看该作者
只能说最后还是只能自力更生,这里程序本身并无问题,主要问题是我自己的电源没有用稳压芯片,用电阻分压的电压不稳定,用个AMS1117-3.3v稳压以后就好了.

该用户从未签到

3#
发表于 2023-3-7 16:00 | 只看该作者
这个程序是接收和发送一样的吗
" c) o4 \: ]7 a9 }4 V程序怎么调试呢?

该用户从未签到

4#
发表于 2023-3-7 16:18 | 只看该作者
本帖最后由 架海梁心 于 2023-3-7 16:19 编辑
. b0 p, b/ [# G6 u( ^+ |" }, G7 E7 F
. E* u3 Z' Z, x- m3 U; W. ~嗯,不论是无线通信还是其它,电源稳定很重要的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-22 02:21 , Processed in 0.171875 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表