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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内.8 H) O# D4 E5 F' D0 ^
     网上看到一个帖子的程序说是将收发两端分开调试  
; e0 C% k% a% c9 T单独调试发送,完全抛开接收,配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。% ?* b, G! H. s- Z, X
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                 // 失能通道0自动应答
: R* K) u5 _+ ]7 W9 C! E        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);            // 失能接收通道0
: s/ ^4 [; p. k0 U        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发/ E7 n6 k# h1 x5 y& s+ J- |

. q$ Y) H! ]# j# P7 k而后程序如下:
$ f9 t( m, X( [0 Y$ S! d! T( d5 B
#include
8 s( Z) }2 X2 h, n+ L- X% L#include
3 {+ D- D. M$ l1 A. W+ Ttypedef unsigned char uchar;
* l) A! N" b$ l' ^9 z4 ytypedef unsigned char uint;( m" {1 H" j+ @- y' e
//****************************************IO端口定义***************************************
- i1 ^7 H1 l1 j0 |( D- r4 W
9 B2 W7 u* G6 k3 s9 S" h$ ]2 l; `***it         MISO        =P2^0;1 H' `% y  J" Q
***it         MOSI        =P2^4;$ u. [( Z# d% K* m; q
***it        SCK            =P2^1;* ?1 r; u; V! S+ {( e, c, \
***it        CE            =P2^2;
. j( l2 \1 k' I, n4 e***it        CSN                =P3^3;! C' M+ P5 S+ ]" u. U% x
***it        IRQ                =P2^5;
. u" E* h8 }/ l. Y9 I. @***it LED = P0^0;
1 ^1 D6 i4 ~# f& [
; |% Z6 t; ]. H6 m7 i//*********************************************NRF24L01************************************** V) I2 U& A  Y
#define TX_ADR_WIDTH    5    // 5 uints TX address width
- Y/ }6 ~$ d# z+ ~! A#define RX_ADR_WIDTH    5    // 5 uints RX address width5 o; p% F4 U" m. i1 l2 A2 ~# E( a
#define TX_PLOAD_WIDTH  20  // 20 uints TX payload
6 P" U$ j& u0 n) D  t#define RX_PLOAD_WIDTH  20   // 20 uints TX payload
3 P) A7 ?4 C6 Q- {& s7 v0 C7 @1 c& m' [# w
//***************************************NRF24L01寄存器指令*******************************************************
+ U1 s1 F1 r& y# Q#define READ_REG        0x00   // 读寄存器指令. T# ]' `) A" Q' Z7 E% Y
#define WRITE_REG       0x20  // 写寄存器指令
3 P8 P2 S. b& U  I; I4 u#define RD_RX_PLOAD     0x61   // 读取接收数据指令
/ K7 i9 j* ^) b1 v#define WR_TX_PLOAD     0xA0   // 写待发数据指令$ c# t( r% y" ~2 Z* ?
#define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令3 z7 U. b$ ~! P9 |. O
#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令1 j+ {: X' n2 {, C/ H) u! v
#define REUSE_TX_PL     0xE3   // 定义重复装载数据指令
( L$ D& I* k3 M4 \#define NOP             0xFF   // 保留
, O: i0 Q: P* c8 g//*************************************SPI(nRF24L01)寄存器地址****************************************************
$ X7 n% d; W  Y7 C2 L+ Z. _#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
$ j% t) h: f- h, g  D#define EN_AA           0x01  // 自动应答功能设置$ c) U# ^3 }8 o2 [' H
#define EN_RXADDR       0x02  // 可用信道设置! h) Q2 T5 m2 ]4 R. r. o
#define SETUP_AW        0x03  // 收发地址宽度设置& ^4 X9 u+ m; i3 `7 q8 {% R) K
#define SETUP_RETR      0x04  // 自动重发功能设置
! ~, d- R+ v& p' F7 p+ t5 m#define RF_CH           0x05  // 工作频率设置" l0 Y7 c7 |, b  w! e' I
#define RF_SETUP        0x06  // 发射速率、功耗功能设置
7 I) b" T# Y& g" E#define STATUS          0x07  // 状态寄存器
* k7 C9 B" j! c. C5 i* m% w#define OBSERVE_TX      0x08  // 发送监测功能' C. O: W; v+ }( I% i0 k& D
#define CD              0x09  // 地址检测            + ~( A, c6 H0 X: @5 H6 F6 Y6 ^
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址
; g- x& {7 U! C7 x#define RX_ADDR_P1      0x0B  // 频道1接收数据地址
$ H/ q# K0 a$ _3 r3 |/ @#define RX_ADDR_P2      0x0C  // 频道2接收数据地址# ^+ ]+ m: N, u4 @4 H; H) v, \1 `
#define RX_ADDR_P3      0x0D  // 频道3接收数据地址
' W! z8 O) D0 C. J  ^2 d. Z#define RX_ADDR_P4      0x0E  // 频道4接收数据地址
9 Q. V4 F, B- G- S2 l. i#define RX_ADDR_P5      0x0F  // 频道5接收数据地址% k& w( i4 y, j) _7 R# n3 ^6 Z2 V- s
#define TX_ADDR         0x10  // 发送地址寄存器; L# M; M- c+ Z% V7 M: S
#define RX_PW_P0        0x11  // 接收频道0接收数据长度6 z0 n9 A% M% Y, {
#define RX_PW_P1        0x12  // 接收频道0接收数据长度
5 P$ u' r- i+ w+ {+ B& ?* v: \#define RX_PW_P2        0x13  // 接收频道0接收数据长度* S6 q: ~: |( z8 D6 E, W7 ?
#define RX_PW_P3        0x14  // 接收频道0接收数据长度% }, C2 }4 l: E. s  W4 O
#define RX_PW_P4        0x15  // 接收频道0接收数据长度0 t1 s. A" A- ~  f5 b
#define RX_PW_P5        0x16  // 接收频道0接收数据长度1 @6 I7 V2 S4 s9 j/ E6 c
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置5 a, k) ^* G4 G5 x0 J( X/ \
//**************************************************************************************/ S3 G' S: c8 V3 L- J0 T2 g
void Delay(unsigned int x);8 n2 W- Q% Z! U  ~5 O# N
void InerDelay_us(unsigned char n);) K' j6 Q$ ?* ?- a# j& |4 {3 y' {0 ?2 u
void Init_NRF24L01(void);' X/ {1 W( @/ C( k- E
uint SPI_RW(uint uchar);: _- c, V6 i9 K7 ~4 A7 e6 O
uchar SPI_Read(uchar reg);% n2 s0 ]% A; w. f
void SetRX_Mode(void);$ q2 M- T9 d* t+ e
uint SPI_RW_Reg(uchar reg, uchar value);; t1 f' Y! g' [1 g
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
& N- _' s3 e( juint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
$ {, J8 T% {- l8 `3 qunsigned char NRF24L01_RxPacket(unsigned char* rx_buf);  ; g) @, F' N1 ^6 l5 ~% P$ z

# j4 z- X1 Q) D# u//******************************************************************************************# d- b0 C/ s7 V% ^5 z2 r
uint  bdata sta;   //状态标志
. f: I% a8 x: N) F& g/ A***it RX_DR =sta^6;  F' w% w( Q2 {9 |8 g
***it TX_DS =sta^5;/ \7 O, X+ c# Z
***it MAX_RT =sta^4;
" V* b# x" _4 n9 v$ q( L% W
4 s' ^' z5 O0 N! iuint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址  
9 W& }* h; q0 y2 X/******************************************************************************************. T$ ?3 ?# V* S( Z, n6 g
/*延时函数% n5 e6 G5 s5 b9 ^5 W( ^# V; \
/******************************************************************************************/
& L& `+ [5 x! V2 {: X& Yvoid InerDelay_us(unsigned char n)$ u( t/ A8 b- v$ |2 R  L+ j# @5 N- r
{6 s6 m( P5 u. n
  for(;n>0;n--)7 [% B2 [8 [  z
  {6 ?7 ~6 N1 d3 Z8 c2 N0 q3 P
     _nop_();
* j4 v) \# P) f; _# S  }
& f8 _: m! O* u$ C- I' H: ^}
1 I" ~8 p7 N' ?6 x" ^9 v9 F
2 i* M3 }# E' r! S//*****************************************长延时*****************************************' T5 e8 l! Y& ]: v* }$ z: g
void Delay(unsigned int x)* E+ I! f9 N) J1 W
{
; P1 i3 `2 U1 T- E5 k  unsigned int i,j;% P4 `& U$ ]1 }5 _! V6 c2 G
  for(i=x; i>0; i--)
4 s  @$ _% ]9 U  d1 t  ^  {
) P$ s0 B( L' r6 g    for(j=110; j>0; j--);
4 m# f4 m& u0 c& B* d' [  }. e$ u3 ~8 c" z/ v
}
# \) y) V9 r9 t/ \7 e5 m" n) S- ?, D8 m% p- P/ H' Q) a1 O) C
/****************************************************************************************% T  z6 C$ B1 v  e( L
/*NRF24L01初始化4 x5 a# w* Z% e/ j9 D6 h' q0 L9 u& }
//***************************************************************************************/) F) g  p# E% s& t3 z6 Y  B! b* E
void Init_NRF24L01(void)
3 V7 O+ P/ j/ L" |3 _% W{
  [( b: ~/ P  k* S( u8 t8 |3 N2 i    InerDelay_us(100);
2 Z8 t$ Z- a& B- j    CE=0;     
3 m' m6 C3 W$ r1 h" e8 h    CSN=1;     
9 S+ H; m5 ?& D/ k) k% p! a3 i    SCK=0;   
7 N( e( h8 u4 h* I7 _    IRQ=1;
# j* m& ~( ]  C# H- `    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址  
) O% }- g/ J' o    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //  写自动应答频道0地址/ M" O; U. X5 k5 C4 R9 O8 X
    SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止      1
0 ~( I9 x) f" ^3 M) }* N    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  频道0接收禁止         2
& A$ V: i7 j9 c/ P, `8 k    SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   //禁止自动重发       3   调试时注意这三点
8 x6 S/ O# r" }7 f/ [% \    SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
! }# }! M9 `* B. b6 ?    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节9 p( m' w0 b/ V# s
    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB  - r! @7 X8 t4 U2 g' R' T7 b8 i
}
: {! _3 L/ D1 B' \5 r! h! V: X
$ J/ Q# ]! @0 b! N! W6 {/****************************************************************************************************
: L% h: Z+ d( ?# x6 r7 h5 W/*函数:uint SPI_RW(uint uchar)+ y* \+ |2 I# X/ K
/*功能:NRF24L01的SPI写时序  X( d7 T! A( C# N$ r+ z7 B; l
/****************************************************************************************************/
. q8 h& T8 j+ X" z! ~uint SPI_RW(uint uuchar)
* L! J4 {1 {& _$ h! h  M{
& F( y4 ^- Q. Z/ N7 H" t8 t    uint bit_ctr;5 F/ a/ L) ?5 n
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit4 H/ S, l9 }. X
    {
) k. |, b6 p3 }      MOSI = (uuchar & 0x80);         // output 'uchar', MSB to MOSI7 b! ?0 v9 R% o) z* U% n
      uuchar = (uuchar << 1);           // shift next bit into MSB..8 U4 W- j6 ^$ g* e
      SCK = 1;                      // Set SCK high..
6 r) x, D% b- i3 P3 m% \: y* y      uuchar |= MISO;           // capture current MISO bit: u: ?6 _% y6 h# J
      SCK = 0;                // ..then set SCK low again
- g* s7 U9 X& u    }& s% V7 w  d% Z5 h$ X2 s# B
    return(uuchar);               // return read uchar8 X3 }; Z/ v/ |# K0 k* g) a1 M
}' j$ g8 x- V& o0 b/ X' l
4 L% ?4 h4 I* O
/****************************************************************************************************
2 b) l! j. `) A/*函数:uchar SPI_Read(uchar reg)* A8 i" g0 p+ I/ J% Q. p
/*功能:NRF24L01的SPI时序
! v  V  F) |# v6 d* O/****************************************************************************************************/
: j& ~$ N" j$ a- G8 o; Cuchar SPI_Read(uchar reg)
& Q" L% T0 t9 E0 X% l; W{
% v: D5 Y& z: l" A/ t+ ^  uchar reg_val;
0 ]8 V+ R+ h" q$ k7 I7 i
& D" t% B. n% f$ Q5 C7 j  CSN = 0;                // CSN low, initialize SPI communication...
; @9 a, i5 r& ~& g6 W! q# |, Y, b, }  SPI_RW(reg);            // Select register to read from..
. }) A; n/ M4 Y$ |  reg_val = SPI_RW(0);    // ..then read registervalue; U1 e7 i% E" a
  CSN = 1;                // CSN high, terminate SPI communication
  m( k' ?; {/ a1 V" E* r$ `
6 o) _) P7 S+ s0 a$ {  return(reg_val);        // return register value& `4 W! L* Q9 s! B; X
}
7 ~& m8 }7 E- U0 y* C3 Y, Q' }9 k3 Z. y- ]
/****************************************************************************************************/. G0 I# j7 Y0 Q5 s  E/ @4 b
/*功能:NRF24L01读写寄存器函数3 f; h2 M& q7 O' \2 i/ P
/****************************************************************************************************/
# c5 C1 P* r# G) {$ Cuint SPI_RW_Reg(uchar reg, uchar value)
/ l, y, v, [0 ]1 A2 h8 M. c{7 ^8 p7 `% R! X8 i* Q
  uint status;
3 N4 v0 D* T# }5 X/ P. U& Q2 U
  CSN = 0;                   // CSN low, init SPI transaction
5 \4 H+ ]5 ?% I4 T$ t  status = SPI_RW(reg);      // select register, `5 G, H# j% Q2 M7 c
  SPI_RW(value);             // ..and write value to it..
7 @# J+ E/ I5 B: Z  CSN = 1;                   // CSN high again# G; Z# f  I' n
- _! p! Z, L4 }% a
  return(status);            // return nRF24L01 status uchar
/ ~0 r; t$ A' q) j; y/ F& w( X}
' l! w+ x- k  S2 Z) x$ ]2 H6 ]( _4 A2 q2 g. V
/*********************************************************************************************************
+ W# K  `3 g) A, C2 k/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)* s1 A4 [0 \$ |$ S
/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数7 c# f( E6 R1 ?4 `& S) s7 w
/*********************************************************************************************************/  J6 a7 n; J0 h7 o9 f) u4 R
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
, S9 c3 z/ r$ c{
) \: j9 ~. T. L  uint status,uchar_ctr;
. i+ e& W# P# c1 S2 k. E4 V0 q- ^, L, v: h$ F
  CSN = 0;            //SPI使能        
. N6 n9 N; \! u3 D6 z/ F  status = SPI_RW(reg);   : D% t. l" k  |( j
  for(uchar_ctr=0; uchar_ctr   {
# U0 O& f% J6 f. ]5 [    SPI_RW(*pBuf++);
9 n( l+ f+ n% |$ \5 M  }7 V7 S. {! J( W# p! ]2 y
  CSN = 1;           //关闭SPI
6 M; `: q8 h1 d$ L( X  return(status);    //  ! E4 Z% @% x1 w
}
) }0 ^* ?+ S" x  O+ T- ~. }8 F9 H5 h) H# O4 V+ p( x* s7 Z9 R, b
/***********************************************************************************************************
9 A+ G; R9 x+ @0 F2 e/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
9 q* e. o9 i; n  U/*功能:发送 tx_buf中数据* q# |2 m: k0 r: q# B& r
/**********************************************************************************************************/$ h% O# o* p, ~& V: Q% B+ i
void nRF24L01_TxPacket(unsigned char * tx_buf)
  g  v: ~0 L1 T( t{6 y+ ^1 j' a% l  K; g" F6 y" K6 n% r
  CE = 0;   //StandBy I模式   0 q  c/ @% X# P/ k
  SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据  + \0 c4 g/ l+ l/ W  y9 R. B  k
  SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送( g; g& o9 i* s- y5 h6 r0 \
  CE = 1;   //置高CE,激发数据发送7 J( R8 I9 j- ]
  InerDelay_us(50);
2 B/ y5 g  M' f% s5 J- T( |}& r. v0 j/ H# g" c; C; w

1 P2 l2 n$ Z% w//************************************主函数************************************************************1 H* R, V! u; @6 w+ q
void main()
) U$ X, w, M' V! w{     
: s& t3 ^; c' [  unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,
* V/ F# C7 S' q' E: L3 j& o& m5 p                                             0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};
7 w0 E* [( T  c5 @  Init_NRF24L01();
8 }2 S2 d2 m: I2 I+ O- ~  nRF24L01_TxPacket(TxBuf);
" h1 |. f9 m8 u0 Z  while(1): B3 s$ G" W$ m! a: z% a
  {1 \2 e  g$ d/ ]* X  D. w8 G, @
    nRF24L01_TxPacket(TxBuf);! A  G( n. T2 [4 N' a+ v
   sta = SPI_Read(STATUS);
5 H1 f* [. Y& P7 S   if(sta == 0x2e)                      //查看是否发送成功
  E) V- a  R/ L    {+ i! ~* [7 e/ o- l
       P1 = 0xfe;     8 C- K6 A3 V( z* U% H8 `
}9 e5 f; }) Z7 O8 Z
    SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器3 P6 ^! N1 M& x% y, [
    Delay(1000); //延时9 X3 V9 j7 {0 W: m5 R& z
   }  
4 K( c8 I7 o. U& r# p7 s}8 b6 r9 o6 h6 |9 b, Y) W
*4 x  X9 u& E7 N! C" @

, F3 w7 b1 b4 Z, S7 [
8 c! Y6 X8 W. S% ~

该用户从未签到

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

该用户从未签到

3#
发表于 2023-3-7 16:00 | 只看该作者
这个程序是接收和发送一样的吗
; w3 V7 m6 I5 l1 B程序怎么调试呢?

该用户从未签到

4#
发表于 2023-3-7 16:18 | 只看该作者
本帖最后由 架海梁心 于 2023-3-7 16:19 编辑
2 a" W% x8 |! J% v" b% l8 M& L8 }) E! A6 p4 j/ Z/ N3 P
嗯,不论是无线通信还是其它,电源稳定很重要的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-26 16:23 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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