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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内.' ]  Q( k: n3 L9 \
     网上看到一个帖子的程序说是将收发两端分开调试  
6 w# s+ A: `; m. _. R3 f单独调试发送,完全抛开接收,配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。
* V9 m( K+ c" b+ d$ }5 I4 S        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                 // 失能通道0自动应答
1 x* S! R6 O$ A: d        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);            // 失能接收通道0: Y- B$ U" p: b0 T
        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发  i/ a1 i+ L6 _3 X4 p0 J
4 u, v/ e$ y; q3 n! {0 t" B% o( Q, t
而后程序如下:2 }1 }. ]* _6 b. U2 ^  x( B7 H6 S7 |
% N$ l3 L: n2 {7 S1 R' s8 J
#include
& J7 w3 \+ \% P" X+ z, S, B" O, A#include2 R3 b6 U0 L1 L2 }
typedef unsigned char uchar;
+ n+ K! [2 a+ O+ ]/ Ptypedef unsigned char uint;
; T/ w, T# d8 z* a+ g- \//****************************************IO端口定义***************************************! u+ A9 j, X/ ^( t+ H9 z2 ?( J
- w) L* u  [" W% n) E- O4 j, {% D
***it         MISO        =P2^0;# V3 r1 n0 p: B5 D" s. ~
***it         MOSI        =P2^4;
. J) L* ?, Y* F***it        SCK            =P2^1;0 o6 R. h, o" X" n6 m. R
***it        CE            =P2^2;
. y* {/ B( e+ \: J***it        CSN                =P3^3;
1 k- Q: A) ^! g& L3 A***it        IRQ                =P2^5;: R* i4 F7 ]( G+ ?
***it LED = P0^0;' S4 `, P5 E. n2 ?! ?: h. e

9 ]& S$ z, k6 I  o//*********************************************NRF24L01*************************************
; Y1 ~; x0 w6 v! c5 N#define TX_ADR_WIDTH    5    // 5 uints TX address width9 @5 E' }! \9 |: `# l7 T
#define RX_ADR_WIDTH    5    // 5 uints RX address width
% s% m8 s- g+ B#define TX_PLOAD_WIDTH  20  // 20 uints TX payload
; X" M: A8 t: a# S#define RX_PLOAD_WIDTH  20   // 20 uints TX payload  s0 T- z  \0 m$ m+ d  `

0 }  ]! E" E7 G- o//***************************************NRF24L01寄存器指令*******************************************************
5 \4 {% N, b( |2 Y7 H( R, p#define READ_REG        0x00   // 读寄存器指令$ c2 e" f. r0 M, W6 [; A# f5 M  Z6 O
#define WRITE_REG       0x20  // 写寄存器指令
. K% S6 c. I% w, i" c0 \: b#define RD_RX_PLOAD     0x61   // 读取接收数据指令  H# x7 C" \4 Z9 `$ j# w+ u$ k- O) f/ {
#define WR_TX_PLOAD     0xA0   // 写待发数据指令$ e7 p* a3 K3 ]
#define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令
- ^; ?2 x! Z2 t6 E- T#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令5 P) v9 g* j0 R/ ?1 R
#define REUSE_TX_PL     0xE3   // 定义重复装载数据指令
/ d4 }% {/ v. _6 E4 q( [#define NOP             0xFF   // 保留" f3 V0 y. `7 _, D
//*************************************SPI(nRF24L01)寄存器地址****************************************************
# W# T. r/ i) Y+ i#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
3 C, ]9 c6 C8 ]#define EN_AA           0x01  // 自动应答功能设置
# u. l/ h- x* X% q( C) y" `#define EN_RXADDR       0x02  // 可用信道设置# k8 B1 f) B1 F; z0 q& Y6 d
#define SETUP_AW        0x03  // 收发地址宽度设置
; v3 C- k+ \- I/ F1 i#define SETUP_RETR      0x04  // 自动重发功能设置( I2 O5 z. B& E0 e: Q
#define RF_CH           0x05  // 工作频率设置# q4 ~5 Y2 J# v4 A) L. ?* f4 o7 Y
#define RF_SETUP        0x06  // 发射速率、功耗功能设置
: R% r* N  T3 k5 G' e#define STATUS          0x07  // 状态寄存器0 }8 }( E/ \3 A- i0 T/ T6 c
#define OBSERVE_TX      0x08  // 发送监测功能
0 ~* P  `% ^6 ?1 j7 U: B  J$ g: T1 t#define CD              0x09  // 地址检测            
  A! @% U# S' _9 E" C0 O#define RX_ADDR_P0      0x0A  // 频道0接收数据地址( I& o$ {! o, U/ v
#define RX_ADDR_P1      0x0B  // 频道1接收数据地址
4 O' b8 X9 P+ v4 ]: V7 Z#define RX_ADDR_P2      0x0C  // 频道2接收数据地址" [5 L6 k! o# c7 @- ], g! ^2 @# S
#define RX_ADDR_P3      0x0D  // 频道3接收数据地址
) \3 Z  F( |* R( S# ~. V3 ]#define RX_ADDR_P4      0x0E  // 频道4接收数据地址. T) l% m' c5 r( [) Y
#define RX_ADDR_P5      0x0F  // 频道5接收数据地址' @8 \9 K* m# p/ V
#define TX_ADDR         0x10  // 发送地址寄存器
# |8 P& d( i) g8 i: h4 d#define RX_PW_P0        0x11  // 接收频道0接收数据长度
- y) C' C: \7 Y#define RX_PW_P1        0x12  // 接收频道0接收数据长度
9 C; u' [# w+ [  I" ?#define RX_PW_P2        0x13  // 接收频道0接收数据长度; a- I, m$ s  b9 w' S4 _9 w0 \
#define RX_PW_P3        0x14  // 接收频道0接收数据长度
' W+ [: o. T* _' H, T2 x! C3 N, R% {#define RX_PW_P4        0x15  // 接收频道0接收数据长度! K" J/ n! }! a( ^+ J8 k" g
#define RX_PW_P5        0x16  // 接收频道0接收数据长度1 C% C. n( v, S9 H, A
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
' Y  b5 J# n0 K" C# o4 k5 o* H//**************************************************************************************
( O! B6 d  v3 X7 ^5 C2 Zvoid Delay(unsigned int x);
) P, R) ?$ _! K1 A  Z6 ]" hvoid InerDelay_us(unsigned char n);
# K% `* ]1 w% w/ @void Init_NRF24L01(void);, r! B8 S4 }/ S
uint SPI_RW(uint uchar);6 B6 ^. v9 s. O
uchar SPI_Read(uchar reg);
8 w4 i1 I+ g, avoid SetRX_Mode(void);8 N0 M) y2 Y  Z# U
uint SPI_RW_Reg(uchar reg, uchar value);
$ U/ m# O& e/ n: `* e' nuint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);2 k. f' Q4 Q( Z5 h4 z
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);) \* z# E8 E/ K: O1 _' ?8 x4 k0 [
unsigned char NRF24L01_RxPacket(unsigned char* rx_buf);  
( J6 E) @& s& U. D- d
3 Y! j' q6 L  o1 X//******************************************************************************************
6 G; d/ }6 c2 q# ]: Q& J( Z& |uint  bdata sta;   //状态标志
8 f2 P' v1 Z8 `5 G) t% {8 X***it RX_DR =sta^6;
0 F! o4 E1 z& v' B***it TX_DS =sta^5;; P: [) Q9 H. r. y  @
***it MAX_RT =sta^4;8 B3 G. W. u! d  B: J, p$ x$ c

3 d. }! ]8 @, q4 ~# J8 K- ruint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址  + X, y4 }9 @4 n
/******************************************************************************************! m3 M! c, X- x! Z! O3 M- {! w8 V+ I
/*延时函数
  @: G( N( @' `# c/******************************************************************************************/* i! k' \) G# y4 T" p" x
void InerDelay_us(unsigned char n)
+ L) y% \! C* X  z5 y, q{5 U7 e! ^8 p- r; R2 f- P+ o
  for(;n>0;n--)
5 \9 Z+ O6 d/ i  E  v& s  {+ m% Z5 H2 n" I" [+ J; r
     _nop_();
2 u# u( V' G; D0 S$ J  }2 C3 J" R" }$ p% u- L/ m( X. q
}
1 T4 d; I+ o* U) }5 L7 G: L! F0 A) G1 r
//*****************************************长延时*****************************************
, T+ ^8 ~- [& Z, w- U3 U  v& |5 dvoid Delay(unsigned int x)* o" _8 j( K6 G, P. t& o8 k
{/ S' `' N! f6 u( g2 o; g9 a0 y! Z
  unsigned int i,j;
5 p. z- f  ^6 C3 a$ e  for(i=x; i>0; i--)! v+ f- {& Y: i" W
  {' Y% |* g. {8 I# U
    for(j=110; j>0; j--);
, U- i; U$ j0 d: b' F% @; V  }, `1 y8 ~! B* \! n
}2 I) {1 T% [" H6 `7 G2 f7 s2 }

8 k7 g! T- ^# T4 @/****************************************************************************************/ @: b, o5 \! L" ~! P2 c! O
/*NRF24L01初始化
+ V( S+ M' x( G//***************************************************************************************/+ }) r5 n; {6 `) i4 _- {
void Init_NRF24L01(void)- G! N9 G" N7 v2 {! k2 ~! {
{
1 f6 I" N1 ^+ w  p    InerDelay_us(100);6 q& ^! I2 H1 y& q: e5 C, f  g
    CE=0;     6 i. B0 R0 J# a2 Z7 X" m
    CSN=1;     9 ^  P; t' }: a" |1 Q
    SCK=0;   
  `7 o) _$ I- E9 J% Q! ]& x! ^3 N    IRQ=1;
. X! G: ^$ B! v3 A    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址  
  y; m) T3 l' |! ^: K/ k: J    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //  写自动应答频道0地址
# N3 q2 N! ~) R: v    SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止      1( e7 R4 b4 M- d) D
    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  频道0接收禁止         29 K; S0 J2 s1 X+ Z. v2 Q. I
    SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   //禁止自动重发       3   调试时注意这三点5 Q5 w! M5 @! _; o7 J( }
    SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
: z+ I$ O7 [# F# N) h0 c3 q: W    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节9 i0 z& ?( R* |" n% i% O
    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB  $ ?& Y" D: M# E0 l) L
}
# U) [2 Q1 p3 m# d# M! T
& y  ?% T6 Y( d/****************************************************************************************************
1 @3 y0 z0 G9 a: `! e/*函数:uint SPI_RW(uint uchar)  T3 |) M; n, s7 G  p2 C% u
/*功能:NRF24L01的SPI写时序7 z' Z( R. Y; y/ }, L
/****************************************************************************************************/) Y8 {' O% X9 x1 S! x
uint SPI_RW(uint uuchar)
' J- f2 a8 n6 W1 Q4 \' v) H{
( L6 a, m# `, K6 i2 X    uint bit_ctr;
/ T) B1 }; E' |6 {6 t8 r    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
+ c' K2 e" T8 }" W    {
% K5 Q+ A$ ^* o& X8 Z1 y. J# J      MOSI = (uuchar & 0x80);         // output 'uchar', MSB to MOSI- p0 d" O3 X( ^; N$ \. [% _% P
      uuchar = (uuchar << 1);           // shift next bit into MSB..9 D9 z  ~5 {5 M6 U+ c
      SCK = 1;                      // Set SCK high..
0 o% ?$ k4 c5 _1 G% ~- Z' m      uuchar |= MISO;           // capture current MISO bit
- v4 }/ J! k4 \* a9 ?8 y      SCK = 0;                // ..then set SCK low again! ]/ e. z5 k5 r9 ]5 j$ H" f2 n
    }
7 S- ]' F1 W% T7 e    return(uuchar);               // return read uchar0 C: F$ P) a( V$ I
}3 l# W  M6 A- m  I, L* m# b# e
0 j0 a9 ]+ }9 j, u, ^, N9 L- {# J
/****************************************************************************************************' z/ A( G: {. S) i( m
/*函数:uchar SPI_Read(uchar reg)
9 F4 L* f8 w, M1 j/*功能:NRF24L01的SPI时序' {. Y" `: s* C  H
/****************************************************************************************************/3 f) L9 C! V; X" t. c
uchar SPI_Read(uchar reg)
& M  f7 V, u( o5 x0 t{
+ J: n9 A. U" G6 V! O! A% R  uchar reg_val;
1 K3 f% N5 Y( V: ]  y% ~6 O% H$ Y! x
  CSN = 0;                // CSN low, initialize SPI communication...* n" e: `' h) n% [" D
  SPI_RW(reg);            // Select register to read from..
# D5 j) Z# b/ s  reg_val = SPI_RW(0);    // ..then read registervalue
* `" O8 L  }8 j) G2 @9 d3 l  CSN = 1;                // CSN high, terminate SPI communication& k- M+ c/ p4 N

* P" `2 K+ T* {1 ?: T7 Q% K* c  return(reg_val);        // return register value
+ U1 T# u6 u0 |# S( `: g9 X7 {& k: o}4 @! q' a/ R" |

  J. J( }; T2 T2 k8 c/****************************************************************************************************/
  }; w5 U4 k! @: n( r7 {/*功能:NRF24L01读写寄存器函数
7 R" Q7 ^  B6 y3 c+ n7 Y% h- u/****************************************************************************************************/0 C, F, N6 K; Y" Z& ^- _
uint SPI_RW_Reg(uchar reg, uchar value)
$ U$ b2 @. h# ^{
. ?+ b. ~: \% G6 J$ c4 k  uint status;, y5 Y7 l' u$ K/ K; ~! E: l2 h+ Q% T

& P; L2 G" h# `+ b  CSN = 0;                   // CSN low, init SPI transaction
  a: {8 T. ]  l  z9 I2 B% p( _; h  status = SPI_RW(reg);      // select register
0 {0 S/ @# T. j. X& H5 b  SPI_RW(value);             // ..and write value to it..5 P# J. C4 X( `4 u
  CSN = 1;                   // CSN high again
6 \# F9 w* C# {: y# O3 i, R& H: |/ L
  return(status);            // return nRF24L01 status uchar
7 F% x5 ]: z4 p; M8 T' _}3 B* o4 F6 h# B' t' M

1 j8 J1 X% k* V- V$ ~7 b/*********************************************************************************************************9 I0 _" z5 F9 g0 M
/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars): e3 m/ {! P( i" S) n: i  D
/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数( D5 Z' h1 i0 Y. _- _. k
/*********************************************************************************************************/) ^% F4 g2 I8 `4 Z% U
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
4 g  R; G" p) j  E* c' |4 {{; h4 p; y: Q6 L( d; n) F& x5 z
  uint status,uchar_ctr;, X/ m. T9 ]# d; p
4 a; h9 n" P. N/ \. K: c; Y" ?4 g
  CSN = 0;            //SPI使能        0 \/ n  x( Q4 U
  status = SPI_RW(reg);   
9 K# y6 l3 g4 x4 x, O  for(uchar_ctr=0; uchar_ctr   {
# ~- n5 T; ~+ M/ {6 m% A    SPI_RW(*pBuf++);+ \  q& k0 C9 ?2 i& X
  }" [& c- I, a4 m- C- T$ \
  CSN = 1;           //关闭SPI$ o, f$ ~8 C1 c; ]- t- P
  return(status);    //  0 z: r# w, i9 g& s1 E# ~$ v8 T
}
2 Y" ~; I0 @3 s: }+ J7 t4 C1 A: F/ z- Z, a: _/ s3 }. Z; V: \2 V
/***********************************************************************************************************
7 g, x+ Z! X8 \9 h( g* S  u& v: [/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)' W2 n) i* t/ b" `, C9 e
/*功能:发送 tx_buf中数据
* X3 W0 v) a% t- R/**********************************************************************************************************/( g9 u9 v, J) ?: K  [
void nRF24L01_TxPacket(unsigned char * tx_buf)) n  |2 g) r( M+ c4 U8 @, J' a
{9 f/ h) ~3 }  F& V0 i2 {1 t( W
  CE = 0;   //StandBy I模式   
* M( \5 m- V! C  l6 F  SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据    @# B. K* \  @+ m. D9 B
  SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送: W% |$ o: h# X; U4 [
  CE = 1;   //置高CE,激发数据发送1 k0 Z2 B2 r# x+ |( A1 z
  InerDelay_us(50);: @* b9 x# n9 F+ v
}% A) L  D6 x- |2 y8 n; c; p8 |4 A
* M0 v* p* e+ G/ r
//************************************主函数************************************************************! G6 K4 w& o. s7 U8 Z
void main()
1 l" h6 T1 a: [4 U. l( k: g5 U{     
; m' u! _. Q7 B$ x& {  unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,; f* G. Z# B% p; {5 D$ _$ f% |
                                             0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};9 q% f7 U+ D) }9 s" B& w( \% j
  Init_NRF24L01();
8 s9 _1 D5 z( o2 S- z  nRF24L01_TxPacket(TxBuf);7 _  x# U3 s) b5 `' ~, o
  while(1)
* o& y, h$ |; h& q% D9 q+ j  {4 ^0 m- Y/ J- Z7 D* m) w) H" U. \% n
    nRF24L01_TxPacket(TxBuf);! C8 V1 d; r" @$ R! b, T. [
   sta = SPI_Read(STATUS);  @, E1 H9 h/ q- G: ~
   if(sta == 0x2e)                      //查看是否发送成功& b+ v3 T/ P; X& _
    {- K/ D. O8 O+ ~5 l! g& ?
       P1 = 0xfe;     ( W' H# J! g& x1 a% e$ o
}% y/ g9 B, k# Q5 d4 A& @' b
    SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器, R6 H" N5 V) h
    Delay(1000); //延时2 @& u$ m3 S9 H  t) U
   }  
- e3 S8 r& H% h$ E4 R+ d+ e7 e}
% x+ h4 j* I3 f*
" R/ [/ d; k6 _$ r
# s) f" S/ ?: \$ p* f: y/ [4 _
6 B4 y- T; ^; s7 {

该用户从未签到

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

该用户从未签到

3#
发表于 2023-3-7 16:00 | 只看该作者
这个程序是接收和发送一样的吗. E7 L, D5 C0 w  a
程序怎么调试呢?

该用户从未签到

4#
发表于 2023-3-7 16:18 | 只看该作者
本帖最后由 架海梁心 于 2023-3-7 16:19 编辑 / V! L- G1 P9 p, \1 `# v1 b; ]+ B: F
' D% r, z3 M8 i& O
嗯,不论是无线通信还是其它,电源稳定很重要的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-22 01:50 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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