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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-11-12 13:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内.2 F( P# t  C5 f1 I6 c
     网上看到一个帖子的程序说是将收发两端分开调试  
7 x; D* [2 N. J- _3 u单独调试发送,完全抛开接收,配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。
: m0 |5 L. J0 g' ^( m8 ^        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                 // 失能通道0自动应答
5 ^% O" r5 o3 `) p' D        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);            // 失能接收通道0
  n  x; q6 X7 t, S8 X# ~, y2 t        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发+ g4 I! k1 |/ k6 G: ^+ B0 G
8 m7 G" Y) y, f2 E. `! n4 \/ K
而后程序如下:
# _( b4 B4 ?' p! M2 T7 `( M6 @; ^, k+ a6 ]6 ], m
#include <reg52.h> + n  v  w: @% F+ [" a4 c
#include <intrins.h> $ B$ f0 H6 ~3 ?+ ?
typedef unsigned char uchar;
% P  k- h/ z0 ?$ C4 f) R8 X& h$ Wtypedef unsigned char uint;
7 f- b6 J; D- b4 U3 b//****************************************IO端口定义*************************************** / i. c; t* L% p' U1 t
! v" B& y+ [  F
sbit         MISO        =P2^0;6 ?* G5 ~+ g# k0 a9 V
sbit         MOSI        =P2^4;4 X' m4 k( _/ q
sbit        SCK            =P2^1;0 ]+ X) ~! t1 H( \; e0 x
sbit        CE            =P2^2;
( L# [. {1 c/ @0 i  Qsbit        CSN                =P3^3;
0 m5 \5 Y$ f( S4 g* Y  f' V- Y6 B1 ssbit        IRQ                =P2^5;$ c4 p* F4 t9 H1 S
sbit LED = P0^0;
* z  [1 a3 K5 D. L- a! T0 d7 b( q& p2 q& X) X1 E3 D
//*********************************************NRF24L01*************************************
5 `# }% k- \: [) i#define TX_ADR_WIDTH    5    // 5 uints TX address width
9 S% G- I, Q- H* Q# e4 F% q#define RX_ADR_WIDTH    5    // 5 uints RX address width 3 Q* c! O3 _7 z+ A
#define TX_PLOAD_WIDTH  20  // 20 uints TX payload
, \; W+ M# C8 n4 u#define RX_PLOAD_WIDTH  20   // 20 uints TX payload / F* I+ @3 j2 f4 L( z

( d( _; H) w# c' V//***************************************NRF24L01寄存器指令*******************************************************
2 H0 v5 P6 B# j* g#define READ_REG        0x00   // 读寄存器指令 : D0 t5 I$ v( L1 a
#define WRITE_REG       0x20  // 写寄存器指令
- Z: ^, ^; ]! F3 Y9 \# w5 B* u#define RD_RX_PLOAD     0x61   // 读取接收数据指令
+ l8 e* ^+ t. z) e/ w+ Q2 q" O#define WR_TX_PLOAD     0xA0   // 写待发数据指令 ! u4 S9 h0 [3 G
#define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令
* D5 R& D2 X4 N6 [6 L( K: G#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令 . n: l9 A3 P* m! i- I- ~
#define REUSE_TX_PL     0xE3   // 定义重复装载数据指令 1 [4 ~+ i& ~' e+ Q$ Q' ]  m8 j2 s0 x! w
#define NOP             0xFF   // 保留 4 m6 v1 w, c; w1 B
//*************************************SPI(nRF24L01)寄存器地址****************************************************
# N4 F% |5 n( H' L) k#define CONFIG          0x00  // 配置收发状态,crc校验模式以及收发状态响应方式
. C9 `6 W  E* N/ M2 B#define EN_AA           0x01  // 自动应答功能设置
  h' ~5 E! t/ O# N#define EN_RXADDR       0x02  // 可用信道设置
6 y! z# b) U( U' w4 x" B#define SETUP_AW        0x03  // 收发地址宽度设置
! u% s' {+ X3 w0 |- q* m#define SETUP_RETR      0x04  // 自动重发功能设置
8 ?' }' m# B2 Z1 ]( m; ~#define RF_CH           0x05  // 工作频率设置
3 I! p$ B7 }" }* X- J9 Q% h  f6 A#define RF_SETUP        0x06  // 发射速率、功耗功能设置 2 y/ a0 m! ~  F* U$ f2 ^* C
#define STATUS          0x07  // 状态寄存器 * ^2 {1 I$ B# K' x) ]# }: N
#define OBSERVE_TX      0x08  // 发送监测功能
' A" L8 \8 f# H' Y( `, E. `#define CD              0x09  // 地址检测            ) t+ y" x* V/ Q2 E
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址 3 D& [" y3 r% L( N# N+ ~8 P
#define RX_ADDR_P1      0x0B  // 频道1接收数据地址 ' ~6 `4 G& J: d; B. ~9 _* k
#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
9 q8 L# `& q, y4 Z4 @  [3 x. i% M$ e0 x$ ]#define RX_ADDR_P3      0x0D  // 频道3接收数据地址 $ [# n2 i* M: Z! h3 v1 U
#define RX_ADDR_P4      0x0E  // 频道4接收数据地址 , \# c9 u! v* v! z* P$ S
#define RX_ADDR_P5      0x0F  // 频道5接收数据地址
# B; \: r  l1 t8 \7 j#define TX_ADDR         0x10  // 发送地址寄存器 2 b& o/ {$ \) h: O, k$ h
#define RX_PW_P0        0x11  // 接收频道0接收数据长度 ( `  o% F6 N, S$ g2 M
#define RX_PW_P1        0x12  // 接收频道0接收数据长度
. H) c$ P, x2 C( A( q5 g) d( u, ~#define RX_PW_P2        0x13  // 接收频道0接收数据长度 ! l- F& a  z- w4 X' n9 M: v; N: k
#define RX_PW_P3        0x14  // 接收频道0接收数据长度
3 o) X. r& |# G6 N#define RX_PW_P4        0x15  // 接收频道0接收数据长度
1 [  A2 D- m- @$ x& h0 }! }#define RX_PW_P5        0x16  // 接收频道0接收数据长度 $ o" f5 K8 W7 t
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置 0 ?2 K0 {' W) `( H% m! i
//************************************************************************************** % x( J$ w9 P1 A( r' k* U
void Delay(unsigned int x); & J& J2 G9 Y8 ~2 G: X8 l; I# G
void InerDelay_us(unsigned char n);
1 z/ V; d, B: [% Q$ T/ w+ Zvoid Init_NRF24L01(void); ' b7 f5 I* |' e' L3 z0 B
uint SPI_RW(uint uchar); . p. C5 i  D9 \' N
uchar SPI_Read(uchar reg); " T5 @- z/ o% ]. j0 [0 X0 |* c5 c
void SetRX_Mode(void); % z: R+ `* k" K% ]! V! F
uint SPI_RW_Reg(uchar reg, uchar value); 1 X7 i/ G- r& p/ v$ |" `& N
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); 5 I8 T0 _; R( ?2 o
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); 3 c4 W$ P: h7 y
unsigned char NRF24L01_RxPacket(unsigned char* rx_buf);  
4 ~: F' {, H1 t" `7 J8 V% l
7 {$ p2 a5 K+ |//****************************************************************************************** 2 ]  S' ^' s9 |( @
uint  bdata sta;   //状态标志
. U) J6 r( C1 }1 ?: ~) ksbit RX_DR =sta^6; : p3 l, a, ]$ @
sbit TX_DS =sta^5; . f) x+ m4 ^6 r% f4 r
sbit MAX_RT =sta^4;
  n% u; S, A; b- ~
! ?( \% c4 h) G5 z3 V# d4 x$ Z  Juint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址  
& w. q+ k- u! |/****************************************************************************************** + C! k4 O( x- u) |2 X" e
/*延时函数 3 w  ^9 p- W6 b0 i. q8 Z8 q
/******************************************************************************************/
3 f/ Z% D( Q% W& @$ m% nvoid InerDelay_us(unsigned char n)
& ~  S; V/ G9 u1 J5 i/ p3 P, V9 W{ 9 {5 d: j4 z' w
  for(;n>0;n--)
6 l  t: y& X: p: @0 w2 ~  {' ^* F! X- N2 S: T
     _nop_();
- b) i. e. |$ \5 g. Z  }
# F* w5 n( @% o}
5 k$ O- ^7 U  F: |3 {6 M# C4 k
! N7 a, X' J1 `//*****************************************长延时***************************************** # e: F6 m5 a- {/ o1 k7 j5 ]# Z! X6 z
void Delay(unsigned int x)
  _/ n% A6 j. L! R# v8 i{ ) D- K: x( ?% f6 X  p: @/ ]1 [7 E
  unsigned int i,j;
) ?0 k/ c* ^+ u+ Y. v2 A: G* @8 [- H' D  for(i=x; i>0; i--)( ~/ M# o6 R- _& d5 V+ O% I
  {" R6 d+ G6 W( w% q3 o. j. \
    for(j=110; j>0; j--);' v# i5 G  Q+ b
  }
+ h4 S/ ^2 A/ F+ N5 P: o}
  S  b/ v8 A+ R- F. Q/ i
$ v4 `; X6 Z+ W4 ?6 o/**************************************************************************************** ! \- Z8 t& G7 U3 u$ g- w
/*NRF24L01初始化
4 g1 {6 }" S: s8 z2 K2 N6 w//***************************************************************************************/ 0 Y7 ^8 \/ f. N8 _3 i' }. P
void Init_NRF24L01(void)
6 _' F% ~4 O* \( I{
, F, K! P' h% Q/ p  F6 |6 l    InerDelay_us(100); ) i2 s7 E; J4 A# s) E
    CE=0;       o0 i) a& e, V/ O- l
    CSN=1;     
" t2 F1 Z  V  c4 `) X* t    SCK=0;   
$ _* `6 _5 }7 S3 `6 D) x    IRQ=1;   \& t4 W7 ?) f% S8 N  n
    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址  2 G8 n7 R' [( U$ s( i% {
    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //  写自动应答频道0地址 % ]+ Z# F7 @+ O5 g" s3 x4 q
    SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止      1
3 i5 x! M; B3 p" }    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  频道0接收禁止         2
! \" r2 L$ m! O) r8 n7 g    SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   //禁止自动重发       3   调试时注意这三点2 ?0 `$ z: O( I" K9 h6 q
    SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致 & F& M) c! }1 \0 s3 g
    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
2 t, q, V0 b* {7 Q1 W4 J    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB  ) `* x' {5 l8 t% F
}: p( z' Z3 o* a. d

4 ~( Q% [/ f1 H2 v2 D  W" N/**************************************************************************************************** ' j$ T; n( u3 A0 t% N# Y7 m" R
/*函数:uint SPI_RW(uint uchar)
+ ]& M$ H9 m; V, L8 b, }- O6 L/*功能:NRF24L01的SPI写时序 + m& a" {! e  \2 g  x7 A% g/ K
/****************************************************************************************************/
0 j2 Y. t/ o; |6 z9 G7 C+ I: muint SPI_RW(uint uuchar)
- r+ Y* ~( ?6 }' W+ }; i" C6 \{
' X) Z- N2 o1 W$ V" L. w2 R& ]    uint bit_ctr;   Y$ K7 c: r8 V# C
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit 7 n. u! o5 n$ [! _0 ^
    {
; v0 x( E* Y' o6 S      MOSI = (uuchar & 0x80);         // output 'uchar', MSB to MOSI
5 g# G0 |! r1 U. {! S; g- ]- U      uuchar = (uuchar << 1);           // shift next bit into MSB..
3 b0 S% G! Z2 u* Z( u      SCK = 1;                      // Set SCK high..
+ j+ s/ @0 M, S* U6 b8 d      uuchar |= MISO;           // capture current MISO bit
  S1 @: j/ ^: Z% c- R4 m0 O3 H      SCK = 0;                // ..then set SCK low again ! e4 B5 e. i  G+ j
    } & E: |" k+ r9 s& C# U
    return(uuchar);               // return read uchar
6 R# A3 ?& a6 ~4 z* k* l}
: G/ L  p$ s& _9 E) v) A) n& V
) I" z: ~0 t9 K! c0 J$ E6 j1 Q/****************************************************************************************************
3 b) b0 t7 T- V* F# \; z/*函数:uchar SPI_Read(uchar reg) + N! }* [0 X& ~; Q$ Y6 Y  w
/*功能:NRF24L01的SPI时序 # U2 b* P, c( R2 O
/****************************************************************************************************/
' l6 W$ a& v; }6 cuchar SPI_Read(uchar reg) 9 u9 P3 _; _3 f! x  _9 i
{
. b# o/ C5 [/ U' ^1 O  uchar reg_val;
# f. l( Y+ [. p% _
2 l% a% G" D0 b1 a$ x/ x, W  CSN = 0;                // CSN low, initialize SPI communication...
5 o. j( G/ X! N& A$ _2 ]  SPI_RW(reg);            // Select register to read from..
! s/ u- B* k: u  reg_val = SPI_RW(0);    // ..then read registervalue : ?: l! p7 Z6 R. q) }+ G
  CSN = 1;                // CSN high, terminate SPI communication 6 z2 K, Q2 Y$ P# ]% v' L7 w% A1 H
, |; s. B, r/ K; ~/ }  D
  return(reg_val);        // return register value
0 e; \& J$ b% j+ l7 h} * d& K7 J, f7 \) u3 o7 l

2 K5 L4 U& e" e  f- Z! }! h/****************************************************************************************************/
! o5 o7 J  d2 k; t3 M/*功能:NRF24L01读写寄存器函数 / H* F& D  c8 Z7 H, z0 t/ Z& z2 W
/****************************************************************************************************/
# b( J! k- V+ I/ F* c1 |uint SPI_RW_Reg(uchar reg, uchar value) # R1 U0 g8 f" v! K- ~
{ + r- u/ t% ?( `) X. A* U/ j
  uint status;
8 G7 |* k+ m# D8 l2 f( N$ z" @- p" E5 ~1 e: s5 D
  CSN = 0;                   // CSN low, init SPI transaction
: p& V" @3 H/ A: q5 w7 V  status = SPI_RW(reg);      // select register 4 x- g, u" z& q
  SPI_RW(value);             // ..and write value to it.. : q) y7 ?& \! V3 J
  CSN = 1;                   // CSN high again
. y# t- \: |: n) V# J4 |" ^
: ~" {4 q9 ?3 y. r% g  return(status);            // return nRF24L01 status uchar
- L' w- N; d, W1 z. x! R}
! y  p- o$ g( }% _8 ]$ g3 n% L9 P8 u. z
/********************************************************************************************************* * ?/ l- s8 V4 S9 Y4 m# K
/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
9 s  V7 H) |5 g, n5 o. e/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数 ( S. A4 U3 i7 X* e5 Q: t
/*********************************************************************************************************/ / O. y# r; ~8 X, P: e9 ]; u
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
) E" _8 }1 x! E4 E# H9 C{ . y" j6 Y3 B8 n& `$ ]: P
  uint status,uchar_ctr;
* H! h/ j4 `. Q7 C: l* _7 t7 u6 `
& o0 q( s$ f0 L5 G  CSN = 0;            //SPI使能        + d9 W% S) J" j1 w& }
  status = SPI_RW(reg);    0 }3 ]4 q1 [/ f3 H/ V
  for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
. l2 c2 N! I$ S+ a5 U$ }0 R$ [: u  {
5 G1 a0 C3 s3 H, J& J: s    SPI_RW(*pBuf++);7 s5 v7 s/ l- x$ B; e0 Y8 m
  }
* {9 ^( l' S4 s% z0 j9 G  CSN = 1;           //关闭SPI / C  p) L; E" t5 t# O
  return(status);    //  5 x  C1 Y8 n: ^! T, k
} 5 J6 H$ Z0 K; }& x% }( W" c$ Q7 W; u2 T2 N
% s7 }$ D0 r, }' B2 g
/*********************************************************************************************************** , D3 Q  C: Q0 Q2 X" ?6 l8 z7 C
/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf) 4 s0 L* x4 a0 g" Z: x7 T
/*功能:发送 tx_buf中数据
3 B( d- j- ]0 y4 L$ Z5 h/**********************************************************************************************************/ 0 W( `  N0 z' k
void nRF24L01_TxPacket(unsigned char * tx_buf)
" g: q' i; z; f' ^{
0 U, N9 j6 Z% ?6 Q9 I4 M9 J  CE = 0;   //StandBy I模式   2 S$ ~  W) d! m& ?+ z
  SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据  
; R7 i6 L. H/ X2 F+ A8 n# h& t  SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送 $ j, q2 W8 `$ L* ~2 i6 ]5 p
  CE = 1;   //置高CE,激发数据发送
, u. P8 H4 F7 c0 i; f  InerDelay_us(50);
( }) T+ o2 |  i& Y; c* a}
2 _6 M  t- f9 J, r$ f
* b; ^7 ~( N, L% Z//************************************主函数************************************************************ ( U' Z7 A* E, m/ b
void main()
, I8 C6 g/ K- a1 {3 D6 @: u. n{     
" a1 i7 j8 a3 h  m/ L  unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,7 y% P) R7 \5 J0 X9 m6 s; `
                                             0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};
3 }; u0 c- d3 L- R# y/ D# ]  Init_NRF24L01(); 2 }: W. Z+ Z, U9 ?
  nRF24L01_TxPacket(TxBuf);
, h" Q% Q5 }+ ~2 G) i5 z4 S: i: n. _  while(1)
4 ]% ?) Y" ^1 _& J# [$ j) `  {
; f$ W; S4 L9 o8 H. C$ {    nRF24L01_TxPacket(TxBuf);
+ f0 F  V/ l  P: C3 m$ E; i6 W- L   sta = SPI_Read(STATUS);
- V0 f3 A* \5 U: z) a   if(sta == 0x2e)                      //查看是否发送成功6 Q3 O9 d  P& D2 w; M1 P7 r
    {
. z0 B6 r% C* j7 W, r' w; M) R       P1 = 0xfe;     
7 Z5 V. C1 F/ Q/ j}  {) t& k" v5 f  V7 D# _
    SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器 # d. X5 @5 y5 T* p( m# r
    Delay(1000); //延时 0 L) w' a# B, s$ G! L2 z% b
   }  % ]7 _3 o' u! e3 o8 _
}
: K  {  f% l, i# _* D2 N1 A# z*
' s2 S) p* T. o5 t( ]
: f$ W( H" n5 x* r" L) m$ L
头像被屏蔽
  • TA的每日心情
    开心
    2025-1-23 15:05
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    2#
    发表于 2019-11-12 15:29 | 只看该作者
    提示: 作者被禁止或删除 内容自动屏蔽

    该用户从未签到

    3#
    发表于 2019-11-13 08:24 | 只看该作者
    :hug::hug::hug:

    该用户从未签到

    4#
    发表于 2019-11-16 23:02 | 只看该作者
    搞个仪器先确认硬件吧!

    “来自电巢APP”

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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