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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内.' L9 A2 b  p, G9 s
     网上看到一个帖子的程序说是将收发两端分开调试  9 h+ H& R, _! R  M! M
单独调试发送,完全抛开接收,配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。2 q% T  G  p7 D: e
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                 // 失能通道0自动应答1 z) P: v9 L# r0 Y( [) T
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);            // 失能接收通道0! a+ H; ^! E' ~$ a& ]2 S; B' t
        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发
( ], D: @0 K# V% K) _  {
! w( |# u0 I7 k$ P而后程序如下:3 Z, V1 o+ g( q

7 c2 J' Q# c3 I5 T, R# [2 _6 q#include$ c7 D/ N' H9 M, L" x
#include8 Q" O! S# u5 U* D9 @
typedef unsigned char uchar;
. `" G5 C4 e( e& f) X  Itypedef unsigned char uint;: o* q  G4 ]* ^0 V( ]" u0 x; r& S& Q
//****************************************IO端口定义***************************************
  X$ J$ f3 l8 `: S& a! k# k+ K$ r7 \- s  {! s/ [0 R, x
***it         MISO        =P2^0;
& p- ^9 a; Z  E5 Y! w% q. Q' ?4 T***it         MOSI        =P2^4;# P" @% U+ Y: K- y
***it        SCK            =P2^1;/ s3 S4 x$ [" q
***it        CE            =P2^2;( z2 }- M: u1 b! g# C
***it        CSN                =P3^3;% I2 v1 }2 m& k' ~
***it        IRQ                =P2^5;
  |  U. C7 C/ G' a9 T  G# ~***it LED = P0^0;" _! ?6 x) q& v1 Z7 N; L

  T* d, k0 e) Q) v) q, _8 U4 T//*********************************************NRF24L01*************************************
* O4 \& C- m" L5 Z#define TX_ADR_WIDTH    5    // 5 uints TX address width
9 v  {+ F6 J: Y8 }8 a$ S#define RX_ADR_WIDTH    5    // 5 uints RX address width1 q* b( V' I8 f% E
#define TX_PLOAD_WIDTH  20  // 20 uints TX payload% E# J$ E3 s0 S$ y! H- G
#define RX_PLOAD_WIDTH  20   // 20 uints TX payload0 m6 V9 Y, g  C  B
$ ]6 f( q- H9 C1 I0 P5 z6 h! S
//***************************************NRF24L01寄存器指令*******************************************************- m' d/ t8 B( B" i
#define READ_REG        0x00   // 读寄存器指令
8 h; F1 h8 Z7 U1 h#define WRITE_REG       0x20  // 写寄存器指令
' A. Y, ~7 g6 g& @3 E0 H#define RD_RX_PLOAD     0x61   // 读取接收数据指令
; P4 f+ }: F- X* d  u/ S+ h" J#define WR_TX_PLOAD     0xA0   // 写待发数据指令
7 E. j: f+ M* ?4 n! ?" r#define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令
0 s# H# a" @* J& N' j; I8 d( f9 d( Z#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令% \- B- e1 s2 m4 r2 Y4 b% [! L
#define REUSE_TX_PL     0xE3   // 定义重复装载数据指令
6 A6 u. W0 l: }# \6 C4 S$ N#define NOP             0xFF   // 保留5 J! l6 p$ i& ]# D5 o4 o0 K: ]
//*************************************SPI(nRF24L01)寄存器地址****************************************************
' D% G) p0 h) w#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
  O% K" ^& W1 V7 [#define EN_AA           0x01  // 自动应答功能设置# F$ a( x; `, b. t1 N  ^) i+ L
#define EN_RXADDR       0x02  // 可用信道设置9 n, V5 o- P1 P2 ?' Z" M$ {
#define SETUP_AW        0x03  // 收发地址宽度设置( r3 V) X# j/ R, m7 R
#define SETUP_RETR      0x04  // 自动重发功能设置+ K/ X: p5 L7 G- B- O
#define RF_CH           0x05  // 工作频率设置+ Z! _8 ]" y' e7 x  p) T) C  T! T/ b
#define RF_SETUP        0x06  // 发射速率、功耗功能设置
$ Q8 C' p, w* U#define STATUS          0x07  // 状态寄存器
' o+ b; c7 M+ ?3 T* p#define OBSERVE_TX      0x08  // 发送监测功能- X9 Z: |' E4 N, e2 O0 C
#define CD              0x09  // 地址检测            
9 n( \6 w: \7 h$ `, w#define RX_ADDR_P0      0x0A  // 频道0接收数据地址
) B  H  {; O5 _4 Y' `#define RX_ADDR_P1      0x0B  // 频道1接收数据地址+ B& k7 Y+ t* @; B5 M
#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
6 b. \: Q% \' _) P1 A#define RX_ADDR_P3      0x0D  // 频道3接收数据地址' G; x  c  ?6 v& E% J9 t' \) C% j
#define RX_ADDR_P4      0x0E  // 频道4接收数据地址+ E; G# V0 T: y/ A6 q9 g
#define RX_ADDR_P5      0x0F  // 频道5接收数据地址  H; j0 R2 z8 T- X: d$ |( Z. V8 X8 c
#define TX_ADDR         0x10  // 发送地址寄存器, o5 G* c' A' ]" z0 G
#define RX_PW_P0        0x11  // 接收频道0接收数据长度9 S  I/ V$ d; ?% H3 x# @5 z
#define RX_PW_P1        0x12  // 接收频道0接收数据长度
  b7 g3 `! \/ g0 t$ i7 r! x#define RX_PW_P2        0x13  // 接收频道0接收数据长度% h- _( c0 g' x, C1 U4 R6 [
#define RX_PW_P3        0x14  // 接收频道0接收数据长度
, k; s* D9 }# L( ]& F2 ]; z#define RX_PW_P4        0x15  // 接收频道0接收数据长度
7 w( F" h* l0 G# C* S+ r. i#define RX_PW_P5        0x16  // 接收频道0接收数据长度
6 P$ P# s- B: u#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
" H! i/ w) O" d4 M& L+ Q" h" ?//**************************************************************************************
8 f5 ~5 I$ l8 Gvoid Delay(unsigned int x);% U; r3 e( z8 p( i
void InerDelay_us(unsigned char n);
- e7 v" {* v: E  tvoid Init_NRF24L01(void);' u7 z! L7 V9 |9 u% C# k
uint SPI_RW(uint uchar);; u8 a& Q5 q/ K6 l: b
uchar SPI_Read(uchar reg);  j9 Z  g" \* e6 D
void SetRX_Mode(void);
" c- p, y* s1 y" Vuint SPI_RW_Reg(uchar reg, uchar value);
9 q7 n9 H7 s4 e$ W7 @7 Nuint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);0 D8 [8 D5 ?# |4 q, v
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);7 Y0 Q2 w, p7 H" H! N% @6 w
unsigned char NRF24L01_RxPacket(unsigned char* rx_buf);  - S* b5 J) @/ u; T2 @" K" e

9 K8 J5 x2 U; S- i% Q1 j//******************************************************************************************
; v& _6 U/ Q& i- N1 zuint  bdata sta;   //状态标志
3 P" A2 O) S: \; m# V0 P+ @" {! K0 B. W***it RX_DR =sta^6;
  _7 d1 Q. F, r# v***it TX_DS =sta^5;
' V; @% T" D- a! ?/ K; ?***it MAX_RT =sta^4;
, y4 J( A4 M3 g& i/ C2 @
9 K4 L1 W) T. v3 e# xuint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址  
1 M( W, B( u; r  B5 X! O* S/******************************************************************************************
$ v6 ^1 w9 z' ^2 J" x* O/*延时函数
6 u+ f5 p. D5 O1 [/ c- j( x. S7 \/******************************************************************************************/
/ A. M3 Q- `3 b* X8 R; Uvoid InerDelay_us(unsigned char n)
' }7 N( Z9 v& r( Y3 P{0 p7 n  `* |! B0 ]. V( V' s+ w
  for(;n>0;n--)
# M3 f' M- o" e3 L1 t/ V  {
; N4 V$ l7 }. I7 O/ T$ f0 O8 |' e     _nop_();
8 n% j, u$ ^4 n& n1 q3 I' I& {/ d$ W& `  }
4 T% z1 W* i& v# c}! f! x8 y2 d; k
% g$ J, Y8 m6 z, n' u
//*****************************************长延时*****************************************
9 H1 w. A$ x6 _void Delay(unsigned int x): ?3 J% d  j. T1 G! G3 |3 ^; W
{% P4 N' d. I9 l4 L% D" k7 _- Q6 u5 M
  unsigned int i,j;
: w8 Q4 Q2 J, s0 p! D  for(i=x; i>0; i--)
  R+ q) ]% ]2 w$ V, N2 c  {
, ^, Y  y+ x( T) d+ D1 G  f$ |    for(j=110; j>0; j--);
) W1 h0 G% v% T* \/ Z9 A  }% ^) |9 _1 h5 \0 S4 h
}
( J- b" Z' ^9 V( i- r8 n, K  |( a! \" r2 p, U
/****************************************************************************************
0 O# \& }3 c- M' W& I' h/*NRF24L01初始化  E* h/ Q9 N7 j; Z
//***************************************************************************************/) S+ Q. i) {: n( q
void Init_NRF24L01(void)
4 q4 p  \4 I+ U{) \$ H/ R' m. Q: i9 A; \: v* ?
    InerDelay_us(100);
# g9 w/ x3 `! x. Z0 Y% k& n, K3 [6 `& z    CE=0;     
4 @, m, `/ D, {4 Y! D1 X2 e    CSN=1;     
1 }8 e3 e9 o+ V    SCK=0;   ! K8 g) }: H9 x& X! d# e8 ~  K& v; V
    IRQ=1;/ J2 S3 I& ^7 }4 b+ \* O! R. _6 j4 f" U
    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址  ' }0 x4 w  ?- L( M' _7 ~' t
    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //  写自动应答频道0地址
0 G: c, U$ b3 J* I/ V, Q    SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止      1+ B6 H6 P1 a; z8 Q8 `* W9 u
    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  频道0接收禁止         26 }5 l3 d- U# B  W. X
    SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   //禁止自动重发       3   调试时注意这三点: n, p; G( ~) \! p* W
    SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
0 m; z) f, x- a    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
# s$ d8 G" L" k$ M    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB  
! K. M/ X' ]) R3 V: c}% \# p) }6 i; C: F) _: Z
: v/ K9 M9 q, O7 Y( ]$ G/ m- _2 F$ T
/****************************************************************************************************$ V3 i$ S, |. V  w# u
/*函数:uint SPI_RW(uint uchar)
1 C5 Y6 Z; d' }- |: B0 X# L9 a) ~/*功能:NRF24L01的SPI写时序! t. O3 R% C/ W6 M
/****************************************************************************************************/
9 r+ y0 Z5 |3 ]# R1 D5 A- n& e( auint SPI_RW(uint uuchar)
. {) A. B+ ]5 h& F6 l$ \! G7 N{, S! U; J2 {7 ?7 J7 e6 `+ u0 W$ g) c, n
    uint bit_ctr;
  D) W/ b- [8 h& g6 N    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit" H0 N6 B7 g4 j0 d6 f3 I
    {
: r$ m6 }! H: O' |/ L, O+ H; J5 ]      MOSI = (uuchar & 0x80);         // output 'uchar', MSB to MOSI
+ W* C" d( Z4 i/ N- s; n      uuchar = (uuchar << 1);           // shift next bit into MSB..
# P7 R2 h  L% _, v1 I/ ^/ d5 r& T      SCK = 1;                      // Set SCK high..
1 @/ I: n. D6 C& ?      uuchar |= MISO;           // capture current MISO bit: Q* ~* q# x. p7 j( o& r
      SCK = 0;                // ..then set SCK low again/ j) n; [- u2 x% [% @
    }
" A" o: Z; l9 A: K# \' ?9 f    return(uuchar);               // return read uchar2 D! }1 R+ V0 `. F  P* g4 g& `
}7 ]2 A7 u/ `6 V2 y4 u0 F

7 ]. J. b9 |9 _7 j, F/ @- H/****************************************************************************************************
6 `2 g2 ^% d; F) h! J/*函数:uchar SPI_Read(uchar reg)
2 f! [! y& I( B! K/*功能:NRF24L01的SPI时序7 t! q' F3 }6 y
/****************************************************************************************************/
0 e  ?+ u/ o% Guchar SPI_Read(uchar reg)3 Q4 ?6 x& Y: P# B
{( o! [6 W* X! ~9 i
  uchar reg_val;
# V# x+ q" D0 Z9 S9 b& B
* I2 o4 }& X/ }5 I6 h/ t5 B  CSN = 0;                // CSN low, initialize SPI communication...
8 s' h$ C2 P9 `  SPI_RW(reg);            // Select register to read from.." D5 X2 |- d% Y' I  E- @4 @; u' Q
  reg_val = SPI_RW(0);    // ..then read registervalue! B" C9 M: `* A  I. ]
  CSN = 1;                // CSN high, terminate SPI communication; |6 g2 l5 P/ [0 k; h# K
: d8 Z; x1 p2 [( h2 z
  return(reg_val);        // return register value
' Y. |/ i# J# f4 d}
( m4 _! G9 ?4 V/ v9 k5 o5 E1 x4 z5 b+ d, d, T: W# y# }  S
/****************************************************************************************************/
+ @2 E4 j- e2 h. u% U$ A) |* v/*功能:NRF24L01读写寄存器函数, x9 r/ {9 Q$ b" j# x) b
/****************************************************************************************************/2 c4 R' p5 g! L
uint SPI_RW_Reg(uchar reg, uchar value)
& `. u7 B* h2 T$ Q{
" S/ o+ h2 f. g  uint status;
0 M& u2 h. O2 W6 S# @& x  y' I/ R& z
  CSN = 0;                   // CSN low, init SPI transaction) K8 K+ {8 I5 k! Z! x
  status = SPI_RW(reg);      // select register- e1 ]8 _4 F' G. k; x1 q  n. L; O
  SPI_RW(value);             // ..and write value to it..
: k2 p6 [5 Z0 x4 N: v4 |# ~% W5 C2 i8 E  CSN = 1;                   // CSN high again( [9 E) y! c5 Y! {
( @$ p( X5 c* D- Z! R
  return(status);            // return nRF24L01 status uchar3 |) I) H2 e( j
}* I' e' W7 C, h# k
* O7 J7 J: W6 A
/*********************************************************************************************************
# L3 N! r! ^; n6 s/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  t7 o* V+ S+ M8 |0 D# g" W4 g* M- {% y/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
5 f. @2 O* c3 n+ u/ {: _. p! N/*********************************************************************************************************/' c5 Q+ g2 Q# `9 Q: m' `
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/ z) w# y' G3 o* b/ ~; f1 i{
0 K9 B8 H# [4 M4 Y7 N8 I  uint status,uchar_ctr;
, s4 Y' g; `+ S, I( K+ J4 j- ?. w, K' x2 B. F& p7 ]+ S
  CSN = 0;            //SPI使能        
  p+ a. w' e+ [. a# X8 D9 J  status = SPI_RW(reg);   
4 s8 e0 z5 w( w, [  M- ?3 \' x  for(uchar_ctr=0; uchar_ctr   {. m4 P/ U) f: d# Y
    SPI_RW(*pBuf++);5 I0 r! q; K3 i1 J( u
  }5 E5 _+ ?- ~# B; }( |
  CSN = 1;           //关闭SPI9 j  y3 n- f! k6 W" E5 d9 ^2 M  ~
  return(status);    //  
4 q7 f8 `8 E( f}* x$ Z  N6 n" c- I  B$ B0 j& ~

4 G& ?1 p9 j9 ]  M* Q/***********************************************************************************************************
: p8 V. j8 U/ L$ f$ K- S9 E/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)7 w6 X" {  d/ K! Z. P  O$ F. |. \
/*功能:发送 tx_buf中数据0 N. G1 D, b4 l" _- D2 c' A4 k
/**********************************************************************************************************/
, i0 s- T) w! M9 B& e' |void nRF24L01_TxPacket(unsigned char * tx_buf)
: }4 m' B6 n, Y4 Q{
  f( a2 H  R2 W$ Y4 x! j2 c  CE = 0;   //StandBy I模式   
2 c3 a, f* }; v+ a/ B1 ^6 v1 F  SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据  6 k! v% |8 m8 z* b8 z9 Z
  SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送
' v  b3 R3 x7 E) a* R. w  CE = 1;   //置高CE,激发数据发送% g6 C3 d& n2 |- f. a  @9 |- E
  InerDelay_us(50);* Y1 q$ n, C+ c; y3 O
}& d$ }4 z8 ^5 Z1 i
: i7 E9 X2 l+ Y# m. {4 H
//************************************主函数************************************************************
5 `7 b4 ~4 J! L! V0 G: lvoid main()% }! m& Y/ I( [( }' f8 {
{     - Y* H: |8 k5 e+ K6 _
  unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,
2 A1 l+ b  o! r4 A" o3 [# h" T8 o5 a: \                                             0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};
7 ~+ I9 o! o4 E" {: `' {  Init_NRF24L01();! @* x2 i) e1 w2 {
  nRF24L01_TxPacket(TxBuf);
. Z7 e1 @. g7 f6 A7 ]" w  while(1)
; \: y+ c1 S% h' f9 O# d2 f- o2 A  {/ v5 u, }+ L; K9 r2 Y; T* i0 {* ^
    nRF24L01_TxPacket(TxBuf);& D- z5 a8 a' C
   sta = SPI_Read(STATUS);
( D6 p( h/ l) ~( k4 ]/ z6 f0 u   if(sta == 0x2e)                      //查看是否发送成功1 \4 d$ r. g% o) f7 ?& v6 c0 y
    {2 j: T8 x7 K' X# d7 |( t& e
       P1 = 0xfe;     
" q% o( D, s0 v5 m6 g}
, T4 ]& h/ F! ?" ?/ y    SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器* x- \# Z! Z; e9 h
    Delay(1000); //延时( P. }, g! X; A* }6 }9 I
   }  
+ G% e% o- k5 o4 C$ x. h4 _# g}$ l4 d! o* ~5 h: P7 _
*; V( c5 X# t" q* T- Y! _( H) j+ ~

9 K/ a0 I' Y( d* b* p( l9 V1 L* M3 ?( G7 F8 v+ f

该用户从未签到

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

该用户从未签到

3#
发表于 2023-3-7 16:00 | 只看该作者
这个程序是接收和发送一样的吗
  @" T. q  s4 @1 h+ G程序怎么调试呢?

该用户从未签到

4#
发表于 2023-3-7 16:18 | 只看该作者
本帖最后由 架海梁心 于 2023-3-7 16:19 编辑 , S  {! s2 Y( w
; l4 f% a" `4 G
嗯,不论是无线通信还是其它,电源稳定很重要的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-20 13:31 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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