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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内." [- q/ U& M$ t, P- e$ y
     网上看到一个帖子的程序说是将收发两端分开调试  ; y* a3 q- M7 R. Z" Z! Y
单独调试发送,完全抛开接收,配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。' s. }& W2 L  [$ l9 Z$ {9 G4 h1 h
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                 // 失能通道0自动应答) n# _4 Z2 ]' L$ o: F
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);            // 失能接收通道0
; [% d& a3 S9 W$ M        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发- A/ X0 h' }, p( K0 o

+ ^! Q* C' l/ A' q% \. f而后程序如下:
, v) c& B, A. Y& P8 ^! m0 T7 [* d& K$ R. t: i1 \/ X( b
#include
7 n: m" _* L2 [+ k; g9 E8 E( i7 z#include, |* N, f4 O5 i3 `; W9 l
typedef unsigned char uchar;9 {& B% b/ k$ R' q
typedef unsigned char uint;5 f. D- ^; c( l# }) [/ `+ x3 I
//****************************************IO端口定义***************************************
% j4 J( K  p3 Z6 H+ \8 |/ c, T9 x) d$ s: {* o- B5 O6 x2 H2 j
***it         MISO        =P2^0;
$ V, z2 F5 G: D% ]5 g***it         MOSI        =P2^4;" @; [4 R+ @' L+ B& A: c" i7 c
***it        SCK            =P2^1;& x  H1 }: V: o9 Y9 D: r
***it        CE            =P2^2;! [8 |0 W0 ]! j, W: F, q( N
***it        CSN                =P3^3;3 b4 w4 F$ f5 _# M" v$ P# t
***it        IRQ                =P2^5;, e5 \: c$ N, N: m; [+ y& j
***it LED = P0^0;
  ^3 i7 t: x4 J
& Z; i+ p  i" Q5 J0 G//*********************************************NRF24L01*************************************1 p8 o6 b. ^. C) X
#define TX_ADR_WIDTH    5    // 5 uints TX address width
0 w2 X1 p( F  J$ R# F" j8 Y#define RX_ADR_WIDTH    5    // 5 uints RX address width' B  B( Q+ o" t6 K
#define TX_PLOAD_WIDTH  20  // 20 uints TX payload
1 x# p6 t& P, O( N3 L4 p* C+ ?#define RX_PLOAD_WIDTH  20   // 20 uints TX payload
/ P- U( D4 y9 ?5 P' w. q1 k3 `4 w' a- h$ H7 b( i( u1 t9 f1 j
//***************************************NRF24L01寄存器指令*******************************************************7 ~9 _# Y. a' d& l0 P, C+ d' k. A# }
#define READ_REG        0x00   // 读寄存器指令7 g: E5 M' y/ U
#define WRITE_REG       0x20  // 写寄存器指令
  z, y( x: a7 \; m+ |" ~#define RD_RX_PLOAD     0x61   // 读取接收数据指令3 W) y4 m& ~; B, J3 R
#define WR_TX_PLOAD     0xA0   // 写待发数据指令
( z; [, t8 X$ g3 Y1 n3 q#define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令
2 b2 W5 E5 ~; x#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令
4 W  j+ }' z% i7 ]" @8 A9 L3 D#define REUSE_TX_PL     0xE3   // 定义重复装载数据指令  r& z3 V/ E" u0 v
#define NOP             0xFF   // 保留
, h/ S: ~' ~5 e7 Z. U//*************************************SPI(nRF24L01)寄存器地址****************************************************
. }/ [7 R7 ?' c3 m# p4 ?5 P#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式8 {/ g! {3 d. {$ _# H3 J
#define EN_AA           0x01  // 自动应答功能设置
1 F6 d9 T! `, s% S5 M7 I% W#define EN_RXADDR       0x02  // 可用信道设置
+ \" G: f8 |9 ?; u( s6 G/ A7 r#define SETUP_AW        0x03  // 收发地址宽度设置6 S2 c) p7 s' U; V3 A
#define SETUP_RETR      0x04  // 自动重发功能设置1 I5 Z3 G# q; x; W- q  R( U& ]! L
#define RF_CH           0x05  // 工作频率设置
& N) X( e- z$ V5 N! P7 g" ^" |#define RF_SETUP        0x06  // 发射速率、功耗功能设置
( E6 J0 n6 p8 h+ v. T. i6 f#define STATUS          0x07  // 状态寄存器8 S% \3 E  |* W2 X& w* ^) H3 I- d
#define OBSERVE_TX      0x08  // 发送监测功能
5 m1 [1 B* c1 Y3 ~#define CD              0x09  // 地址检测            * `$ a5 ~2 x, w' T6 h  S
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址
) z3 X, U$ K1 f6 {#define RX_ADDR_P1      0x0B  // 频道1接收数据地址0 y0 A" r) X, ^* T4 {, H* e/ E& ~; B
#define RX_ADDR_P2      0x0C  // 频道2接收数据地址6 u  D- T" Z* ^7 N
#define RX_ADDR_P3      0x0D  // 频道3接收数据地址! V+ }  ]0 o! |, M- x2 f# X9 A
#define RX_ADDR_P4      0x0E  // 频道4接收数据地址
2 ~; c& z* p# [1 V6 v#define RX_ADDR_P5      0x0F  // 频道5接收数据地址6 Y$ ?' Q2 ?3 U  y$ `
#define TX_ADDR         0x10  // 发送地址寄存器
5 x' T1 F  ?2 b9 u5 j5 g0 M0 ^9 l#define RX_PW_P0        0x11  // 接收频道0接收数据长度
) M! a' J- D& j) e5 ]9 n# I#define RX_PW_P1        0x12  // 接收频道0接收数据长度
$ t2 g; w0 e. |#define RX_PW_P2        0x13  // 接收频道0接收数据长度- O- \. T: }4 z: ?0 L. e
#define RX_PW_P3        0x14  // 接收频道0接收数据长度
8 m7 b* w# O& K/ |#define RX_PW_P4        0x15  // 接收频道0接收数据长度$ [" w! X/ i8 x# W* `
#define RX_PW_P5        0x16  // 接收频道0接收数据长度+ r  ?$ W' I2 K5 K, o& {/ c- k
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置# f* Q3 N7 u+ a0 m
//**************************************************************************************6 L1 _/ k4 O( I+ g; g- G( h
void Delay(unsigned int x);* n. c4 }0 i0 m/ B
void InerDelay_us(unsigned char n);
( @9 K' H1 F9 p' Ovoid Init_NRF24L01(void);. M4 Y5 ]8 x1 ^1 s5 ]
uint SPI_RW(uint uchar);9 o  P) ^  A# r, G* R
uchar SPI_Read(uchar reg);: h! m( V9 b" N9 [8 k' U- S. p6 j
void SetRX_Mode(void);) h& J3 }% X& A/ y
uint SPI_RW_Reg(uchar reg, uchar value);
; f- H) k0 M4 C6 wuint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);) v+ }% S0 w' }  t: `
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);! S! Z; I* n  W7 q' l
unsigned char NRF24L01_RxPacket(unsigned char* rx_buf);  ) M  e( D( F- F" ^' m! V  ~8 E

1 ]2 q, x7 `+ b//******************************************************************************************
2 c/ t' {; ~8 w3 P3 i5 s# Duint  bdata sta;   //状态标志
* P( n5 s5 {/ l& y***it RX_DR =sta^6;' Y9 l/ s3 }+ A0 V* t7 G
***it TX_DS =sta^5;5 j% T6 J: j/ I. ?- q, U+ @
***it MAX_RT =sta^4;
1 ~4 o5 Y! L9 m; k! n8 x* A' \5 e+ A3 ]/ o. L
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址  
. Y1 H( P. m- J. b3 X5 m$ C/******************************************************************************************
; b1 S' I, u6 \2 s/*延时函数$ K8 W/ r# P# R. h5 [
/******************************************************************************************/
9 c# u5 I5 |" Q3 mvoid InerDelay_us(unsigned char n)1 E+ ?5 l# t9 D( ?
{2 Z( P% U, D: |. ^5 v
  for(;n>0;n--)5 U" A8 j( B0 g" `% h7 ], H# K
  {. O, ]- Q& B2 Z- r9 W. W
     _nop_();/ k* v# ?/ |5 q' O
  }
  b1 z4 ?7 {1 y8 a( Z5 q" G}
0 I6 h9 o$ z3 ?1 a1 W) r* P" _) }. J/ C
//*****************************************长延时*****************************************
; [# v* {3 X, C$ I: }void Delay(unsigned int x)
$ j! p& @. u1 V$ e{2 p5 G) B, \1 e' G# u7 k
  unsigned int i,j;
# V2 @2 u% t4 ~1 p! Y4 P/ w  for(i=x; i>0; i--)
2 Q% D& g7 |" Q0 [  {
- M' m; D2 J$ Q8 }& q! z1 @" d    for(j=110; j>0; j--);1 _0 f) ?. O; F. \
  }
& r5 c+ _! {! g: e( j; C, z}. F6 w  ^( ^! N# U5 C. v: Y

  I) j% C1 R- G3 B0 k/****************************************************************************************
9 w/ k; O& t9 E: o1 `# M7 ~/*NRF24L01初始化4 l) v6 ^6 P3 I$ s
//***************************************************************************************/  _0 H% h/ _, ~" j; B& O" A5 U1 |6 m
void Init_NRF24L01(void)
6 d* {' F2 g/ {. Z1 i7 Y{( p- w! V( R( O/ W
    InerDelay_us(100);
1 E# ^" A! D' ^3 O0 K4 b    CE=0;     
. u" ^9 P7 T4 k2 \# ^    CSN=1;     
- r3 Q; p; J1 o! K- B( |4 q& I! e& q    SCK=0;   
% O- L* c, D4 t( {( Z) U    IRQ=1;
4 ]7 y) c1 ~. N8 Y* ]! `, N    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址  
: r: A( G, R2 \2 l, w7 v    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //  写自动应答频道0地址
* D! |' P  s# v8 L    SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止      11 X5 t/ \* N) C( W2 Q
    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  频道0接收禁止         2
+ `& |: x& j3 n    SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   //禁止自动重发       3   调试时注意这三点' B  O! l( W& @" v* w% \6 P
    SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致. {  P$ c4 d1 z( Z3 K
    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节6 o; M7 i" I( {( `
    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB  
7 O: D+ L5 \, H1 d) p+ W}9 T$ T: B2 ~. p6 D2 e
) F3 b6 f4 w1 G# U5 v6 m: c
/****************************************************************************************************
3 {& @- E  [0 Y  Y* ~2 J% h/*函数:uint SPI_RW(uint uchar)% l; T% ?$ @. m5 h, R2 v
/*功能:NRF24L01的SPI写时序
9 _# t; I6 P# ^9 o. t. B/****************************************************************************************************/3 n7 j# H- O# H! }7 B- `( w5 V
uint SPI_RW(uint uuchar)0 ]# j' B2 T% S+ W* v5 `9 P$ b' l
{' k6 U$ d/ N. i1 q
    uint bit_ctr;5 |' r: `- x7 t& x6 v
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
6 M# y/ V0 l! }/ e% _    {
9 r! m6 b. G9 i$ m$ q      MOSI = (uuchar & 0x80);         // output 'uchar', MSB to MOSI6 M9 i! a# I+ i
      uuchar = (uuchar << 1);           // shift next bit into MSB..  n( ?0 r8 z1 N4 [
      SCK = 1;                      // Set SCK high..
! v. }% P# K( h0 @! e3 ~! n# l      uuchar |= MISO;           // capture current MISO bit
4 q+ o" d/ @" u6 X2 s7 h      SCK = 0;                // ..then set SCK low again  K1 X8 A, x! e* i4 T% O* T, F
    }: n3 _0 ^% k$ F" A) r3 u
    return(uuchar);               // return read uchar8 r" W$ o$ S( }' Y3 I( i
}, S/ X+ D) [6 r0 [1 c4 Y% D

7 C/ o6 g6 W# S1 ?/****************************************************************************************************' W% l! I' Q# h
/*函数:uchar SPI_Read(uchar reg)
% Q  ?4 u% ~% f+ y/*功能:NRF24L01的SPI时序- z; Q' V9 ?6 q7 R4 {7 m! w
/****************************************************************************************************/
+ W/ R$ _2 f' V8 ~. Zuchar SPI_Read(uchar reg)4 |/ _+ b+ f0 X% `& n5 \$ [
{5 u2 N2 Y3 B( G9 ]# m/ D
  uchar reg_val;; i% c/ {! T! d
9 @& P/ P& j- Q8 \8 `; Q& A
  CSN = 0;                // CSN low, initialize SPI communication...) h0 K4 `: d3 j1 s: R* O' x
  SPI_RW(reg);            // Select register to read from..  s) m5 F6 M- M" Q
  reg_val = SPI_RW(0);    // ..then read registervalue
7 A& W/ T0 p6 p) h$ T% Z& w  CSN = 1;                // CSN high, terminate SPI communication
, `$ I/ N# \6 j9 |8 @  E3 o: o' ?7 N% n6 t  S: Z7 [' W
  return(reg_val);        // return register value
2 _$ Q7 i  c$ [7 _+ d/ D# e}
0 m* {3 [: k6 s: L( x4 _8 k; G' W9 _7 p; g" w
/****************************************************************************************************/4 D  `) i" Y/ a1 h/ d5 n
/*功能:NRF24L01读写寄存器函数" L0 m/ r' q2 o  n
/****************************************************************************************************/
0 @4 b! K: f8 v! w, j: quint SPI_RW_Reg(uchar reg, uchar value)8 h( x- D. u% B7 w# G1 p' v2 _
{. E. f" e+ c8 w3 b& ^# H
  uint status;
  t1 @- Q, V& h7 U# W% C. W# V. A  {* P
  CSN = 0;                   // CSN low, init SPI transaction1 ]# R( f/ h  M5 u
  status = SPI_RW(reg);      // select register. Y$ T. z  B2 }+ t/ e, l& u
  SPI_RW(value);             // ..and write value to it..
/ |/ k& r0 C0 }" y  CSN = 1;                   // CSN high again: f& z* Q- U# x+ H) |1 a! ~
# L; v1 S( J4 \; z3 O8 V
  return(status);            // return nRF24L01 status uchar
0 Y' O/ y3 D4 }6 d% i}
0 m7 ^7 {. p1 ~$ _. k
* B6 @) u" j% ]2 A' W  ^8 J. d/*********************************************************************************************************
5 [+ h6 G" U4 g; d) R/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
6 O' E( G& G  Z! U/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数% C; G0 S3 j, j) h3 U
/*********************************************************************************************************/
; B7 w; @( V/ w5 auint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)1 F* m2 v+ b3 V: h* {& I/ [' A
{( N9 \& i& n% M6 S& G
  uint status,uchar_ctr;! X7 S2 a+ @- \- E+ ~' E0 l
  n& e4 F0 j; d3 y" }! _( K
  CSN = 0;            //SPI使能        " Z! P1 X5 O  U& J. D
  status = SPI_RW(reg);   7 ?  B5 @. n$ Q+ j  ?* V/ J3 T
  for(uchar_ctr=0; uchar_ctr   {) X1 S8 ?+ U9 \
    SPI_RW(*pBuf++);- k4 N6 y# \8 Z+ {! a/ a
  }2 Q5 d( c; T7 D+ i' Y% y: z  S
  CSN = 1;           //关闭SPI
* g& K; h) s' E. n! D; \" K  return(status);    //  
9 c+ T( `, w  c$ `}
5 ~: Z/ j" D$ f/ B7 F2 e7 n
+ t1 `6 B. @: k2 k/***********************************************************************************************************
' ~1 e5 s; k4 I/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)* t0 X7 z6 \& I5 ?! ?
/*功能:发送 tx_buf中数据
) M8 d, `* b, T. T' _2 w: H/**********************************************************************************************************/4 P2 Y7 z# v. o* h& {
void nRF24L01_TxPacket(unsigned char * tx_buf)( N- r) P7 U: j0 {+ ^' @* v7 n
{
- l1 h0 G& S0 k# J% l  CE = 0;   //StandBy I模式   % ]! x- u0 f8 y. j
  SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据  
  s; b) a* u- z$ K3 Q  SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送
5 Q  |- H( [2 f: L6 ?( _  CE = 1;   //置高CE,激发数据发送, T. b5 b* x* L1 R) P0 N3 j& d
  InerDelay_us(50);* [# \8 y' p) x1 O( e
}
* x3 y/ ?! }5 Z4 F! Z
4 N9 }7 q& g9 G; c//************************************主函数************************************************************
) g4 A" g; v9 p  e; B4 e8 V& ivoid main()
" T' X9 X/ O2 z{     . O& F  d5 y$ U
  unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,* h7 d* G1 g+ \
                                             0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};
7 A0 R  u! A% ?2 H. [  Init_NRF24L01();* Z# L1 ]+ A; |4 B$ A9 N
  nRF24L01_TxPacket(TxBuf);, E0 g+ a4 T& _4 S( h- Z& F, [
  while(1)* D4 Q$ D2 ]+ |
  {
8 Y7 g, d3 G8 K( h1 p    nRF24L01_TxPacket(TxBuf);0 M- ?& a+ [6 B2 n' X; r
   sta = SPI_Read(STATUS);
. D. R, d# j* o/ @+ c- y   if(sta == 0x2e)                      //查看是否发送成功
/ \0 j0 }$ c4 K! ~    {
- |" q2 s4 _! a! B; C       P1 = 0xfe;     
; _$ ]; k8 h5 y: a  ~* s# `+ T$ y}! p3 C" ?$ O3 S; P4 b& q
    SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器
1 p% @1 k  H, v/ y/ k0 d0 ?+ ~    Delay(1000); //延时
7 Y, i: f' E# t  n   }  
0 J, c- y% c' n9 {8 ?! G5 C}* H, q( z" z( n3 s; i
*
4 z# E( j4 Q# P3 p- {& D6 Q3 s7 U2 |5 e! B; A; `& ^2 J: ~' r, Q
! o0 ^6 u0 W2 X) V: k' u$ c# C

该用户从未签到

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

该用户从未签到

3#
发表于 2023-3-7 16:00 | 只看该作者
这个程序是接收和发送一样的吗( R. [9 a& ~- ^
程序怎么调试呢?

该用户从未签到

4#
发表于 2023-3-7 16:18 | 只看该作者
本帖最后由 架海梁心 于 2023-3-7 16:19 编辑
; w! z( m" {+ `9 A4 F' H0 ?
# j$ |- w9 k1 I9 I3 |* X5 H$ }嗯,不论是无线通信还是其它,电源稳定很重要的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-30 03:07 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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