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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内.
' 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

该用户从未签到

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

该用户从未签到

3#
发表于 2023-3-7 16:00 | 只看该作者
这个程序是接收和发送一样的吗) Y9 k' u7 ~$ q. g# g
程序怎么调试呢?

该用户从未签到

4#
发表于 2023-3-7 16:18 | 只看该作者
本帖最后由 架海梁心 于 2023-3-7 16:19 编辑 " x! v+ C+ `! z. X
2 F* ~9 O8 `* x: p/ y) y: t
嗯,不论是无线通信还是其它,电源稳定很重要的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-1 01:21 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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