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

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

[复制链接]
  • TA的每日心情

    2019-11-26 15:20
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    本帖最后由 陈先生528 于 2019-11-8 10:06 编辑 " m# e3 T0 j/ g% F/ W  _& ?$ S/ U5 [

    - o; c& y8 [! p5 f8 E. O3 h- ^求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内.
    / T3 l" }+ r7 f% h     网上看到一个帖子的程序说是将收发两端分开调试  
    # p. ~# i& h  O  |, K; k7 ~  m4 s+ D单独调试发送,完全抛开接收,配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。
    + g+ s/ A( u$ Z0 T; _( L3 s8 [        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                 // 失能通道0自动应答4 w3 h. F7 F7 O% W
            SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);            // 失能接收通道0
    ; O1 i, d; w5 S: |5 \        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发( ~9 d3 r/ l- d' z8 F0 Z- }! f
    8 F, O# ~3 x4 C
    而后程序如下:
    ; F- U9 b4 d" b  R6 Z! Q/ p  Q2 I) L8 f& B% Z/ K4 o
    #include <reg52.h>
    & X, D; S8 @! m3 y3 S9 [#include <intrins.h>6 d& U7 j8 R0 c; s
    typedef unsigned char uchar;9 @0 H% K7 `0 L# v* _
    typedef unsigned char uint;! h1 _- d7 [, I0 {
    //****************************************IO端口定义***************************************! H# O' y/ s* b# _

    ) e1 T5 m; e* f: [. {! T7 ssbit         MISO        =P2^0;7 y7 m, P5 G4 g
    sbit         MOSI        =P2^4;
    1 f2 w. ~  O; H4 T  Jsbit        SCK            =P2^1;" Q( [0 `! r2 T. y
    sbit        CE            =P2^2;% ?' v3 J3 V6 t- o
    sbit        CSN                =P3^3;
    : O7 w  m4 C) J  Y! |$ I% d2 usbit        IRQ                =P2^5;
    / R) e8 X' r2 O: `# g$ I; Wsbit LED = P0^0;
    ' H9 Q4 p) p3 a4 }3 h1 P6 j' h2 [# y2 J, d
    //*********************************************NRF24L01*************************************
    # K  D) L  f# f! |#define TX_ADR_WIDTH    5    // 5 uints TX address width& a4 P) f% @, o( Y. f! r
    #define RX_ADR_WIDTH    5    // 5 uints RX address width1 y/ R. q  l4 A: P; z: o
    #define TX_PLOAD_WIDTH  20  // 20 uints TX payload
    0 m2 c$ A( J/ t/ K8 I3 a#define RX_PLOAD_WIDTH  20   // 20 uints TX payload. G1 L, ]6 Q& ~  _
    9 Q; N6 M+ C2 {6 L- v
    //***************************************NRF24L01寄存器指令*******************************************************0 g* M% y& B4 `4 A
    #define READ_REG        0x00   // 读寄存器指令2 _$ L/ }# w4 Z/ U/ t
    #define WRITE_REG       0x20  // 写寄存器指令6 `' W- s: _. v" U% b/ }
    #define RD_RX_PLOAD     0x61   // 读取接收数据指令
    3 [; N' J# c% a+ G( @8 H3 g#define WR_TX_PLOAD     0xA0   // 写待发数据指令
      n# \5 s9 |1 H) Y6 S7 E$ F#define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令
    # G, X- V% H3 j2 p#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令/ ?5 m% g( p1 P# `5 f" D: ?( r& I
    #define REUSE_TX_PL     0xE3   // 定义重复装载数据指令
    / r4 g: y+ V& v  @+ z( x% M+ ^#define NOP             0xFF   // 保留0 w& u' d+ U5 s8 U, a+ S
    //*************************************SPI(nRF24L01)寄存器地址****************************************************- f1 M% G( ^6 g" \" u2 p( ]2 o
    #define CONFIG          0x00  // 配置收发状态,crc校验模式以及收发状态响应方式
    + a, ^. @, z, i2 U2 n( h#define EN_AA           0x01  // 自动应答功能设置
    9 u+ {. W7 ?% K( i- j#define EN_RXADDR       0x02  // 可用信道设置( p# }, K6 q! s0 X0 x4 t7 L8 [5 r
    #define SETUP_AW        0x03  // 收发地址宽度设置! \  T3 E; G! ]+ o; n
    #define SETUP_RETR      0x04  // 自动重发功能设置
    & H# E4 V( F  F% f7 S! P- n#define RF_CH           0x05  // 工作频率设置
    3 I. O- a$ J9 C#define RF_SETUP        0x06  // 发射速率、功耗功能设置1 y/ ]1 o( ]" x7 I* o, Q9 \* K6 h
    #define STATUS          0x07  // 状态寄存器8 _' V. K- Y5 N& S' d4 z& ]
    #define OBSERVE_TX      0x08  // 发送监测功能
    ! T" d5 S. ]+ n; o#define CD              0x09  // 地址检测            ; u2 z5 ], ^' E- ^/ d4 y
    #define RX_ADDR_P0      0x0A  // 频道0接收数据地址
    ) ^) @* u$ v7 ]9 S1 \#define RX_ADDR_P1      0x0B  // 频道1接收数据地址. g+ ?0 A& V: J$ i
    #define RX_ADDR_P2      0x0C  // 频道2接收数据地址/ G/ T7 J+ a2 s) u3 Z2 n+ d
    #define RX_ADDR_P3      0x0D  // 频道3接收数据地址$ m- {, N5 p, Z; r' i( @6 ~# ~
    #define RX_ADDR_P4      0x0E  // 频道4接收数据地址
    * B; A; \8 a* w$ }# Z#define RX_ADDR_P5      0x0F  // 频道5接收数据地址+ ~( V8 G" S+ C: ~" ^; D
    #define TX_ADDR         0x10  // 发送地址寄存器0 l( @/ r* r" V
    #define RX_PW_P0        0x11  // 接收频道0接收数据长度: _1 i- Z1 X- v- P' u
    #define RX_PW_P1        0x12  // 接收频道0接收数据长度
    + S! C0 E  D; |# c#define RX_PW_P2        0x13  // 接收频道0接收数据长度
    " S# \, E, t" G3 L5 ~#define RX_PW_P3        0x14  // 接收频道0接收数据长度5 p- d2 t  m; E1 K6 b. v5 a
    #define RX_PW_P4        0x15  // 接收频道0接收数据长度- C: q1 U& @% m5 {; H
    #define RX_PW_P5        0x16  // 接收频道0接收数据长度
    ' n; ?1 f+ K  V5 d& y#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置* _- Y$ e9 q' ?( r6 a
    //**************************************************************************************7 K" m* f" L5 b- I' |+ C
    void Delay(unsigned int x);
    / Y6 x/ h2 h# d  d$ F% A* yvoid InerDelay_us(unsigned char n);: @" ^7 g* |9 L  I' C
    void Init_NRF24L01(void);( |. L  y/ i+ x5 c
    uint SPI_RW(uint uchar);
    4 \; @# S9 f2 O7 cuchar SPI_Read(uchar reg);
    $ j' U9 N6 U; ^& G1 w! Y' ~void SetRX_Mode(void);: ~+ E( Y1 B! z6 x& v3 F; ?+ o7 I% r
    uint SPI_RW_Reg(uchar reg, uchar value);, F) ~* |, ~) \" K6 I  s! N2 G/ Z
    uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
    8 v0 S7 R' K4 C4 S0 c3 o5 Vuint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);9 g' s% W0 k, h2 o3 P5 M& ?
    unsigned char NRF24L01_RxPacket(unsigned char* rx_buf);  
    # p/ m4 e0 [: ^: Q" \5 Q& T/ y8 E- w& t  u# z4 Q
    //******************************************************************************************
    7 |1 [8 Z8 }1 K! tuint  bdata sta;   //状态标志
    ! @3 y8 d+ J, ?4 x" H; }sbit RX_DR =sta^6;# D! e0 [: w; @9 C
    sbit TX_DS =sta^5;
    ; {, V+ ]5 L, l+ ^! ~2 d+ @! wsbit MAX_RT =sta^4;
    9 x4 k- z4 t) [* n! \+ [& f7 ?' ?# m; x. ], C) G
    uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址  : q- m+ b8 n/ P3 E/ A+ J+ F
    /******************************************************************************************# ~3 \( Z/ `6 ~* M
    /*延时函数
    ' c1 j! R- Z5 w/******************************************************************************************/
    ! h1 s' p! ?$ V9 Y. {' C. \void InerDelay_us(unsigned char n)5 A9 a. P- T/ h/ I/ u
    {
    / Z& `/ `1 g1 r6 h# L  for(;n>0;n--)
    ( f, X  \" r, b; g: t4 ~. e" z  {: M+ s: ?/ m$ l6 p
         _nop_();
    " r& \& d3 J+ r- |4 v  }
    4 }3 |4 q/ v  j' @9 H}  R* o9 A  D3 j8 ?
    4 X; ^3 _$ o; \% g
    //*****************************************长延时*****************************************% ?' k* `. n8 O+ {
    void Delay(unsigned int x)4 y) ^3 `2 w6 L+ k
    {# k* P) a) y2 @, j
      unsigned int i,j;7 W( H* i. a( V5 R# K5 o* S+ t
      for(i=x; i>0; i--)% X; Z+ ?+ E4 ~; \. g8 ]  E* Q
      {' h) z+ M: E2 m- r7 u# _! n
        for(j=110; j>0; j--);  z  Q! K& R  o& ?; `
      }
    * l1 d% i, Y! r, x" t% N3 Z}
    & |: s5 v1 I) T1 o: a) `- Y5 D$ h& }7 R8 J( B6 q
    /****************************************************************************************7 n: t0 E5 R2 A2 q, I
    /*NRF24L01初始化2 F0 R+ w8 m( g; U. H" Z, j6 j
    //***************************************************************************************/
    ( M) t# B; S# x* Q" L. E, Ivoid Init_NRF24L01(void)
    4 E/ ^' R  \: |{/ n% f, i6 q5 C( N
        InerDelay_us(100);7 T* [% @7 X' I  K' `* Y2 Z! y
        CE=0;     7 V/ r( }8 P4 b6 m
        CSN=1;     5 w# b2 C4 ]2 V- J" A& D( C
        SCK=0;   . D5 K- V- `6 F' y( l) [  E- [
        IRQ=1;
    3 S4 e* v  Y+ f    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址  
    , Z. e" A6 o. N    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //  写自动应答频道0地址6 ]2 Y4 z. n" |0 f4 |/ x6 z
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止      16 K! }3 i3 Z; g2 R" N
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  频道0接收禁止         23 V% w2 V  C5 A
        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   //禁止自动重发       3   调试时注意这三点! C! ^9 a& M2 D1 X5 }0 ]1 L9 D
        SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致- U2 e, _8 A, G' R. t) N, S0 v
        SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节) R6 P6 }. K5 S$ ?) V
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB  , w8 T* {; x. R9 O# U9 `' K# ~9 |
    }0 J8 B6 q) d: y% T' |, r6 F
    * z1 I! t4 T3 h
    /****************************************************************************************************
    8 c' p# V1 A8 q# V7 y- y8 p/*函数:uint SPI_RW(uint uchar)
    " R2 S( e5 A9 g5 H6 S8 [/*功能:NRF24L01的SPI写时序
    3 T$ E! x. w* m/****************************************************************************************************/2 Z* H. I9 I0 u' o: C
    uint SPI_RW(uint uuchar)
    + }3 j% d: i' d( l{8 @$ g9 N( |% u% _
        uint bit_ctr;- j+ y% m; M1 i7 @* f4 e
        for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
    , B5 Y6 ~8 Y. f3 A( S    {  B0 O2 Z! o# K8 o! s* L7 c$ O' [# b1 U
          MOSI = (uuchar & 0x80);         // output 'uchar', MSB to MOSI; y0 A9 r& w4 y! Q
          uuchar = (uuchar << 1);           // shift next bit into MSB..3 Z" C& _& b& f, r  C
          SCK = 1;                      // Set SCK high..0 E" K% S% U( _7 I5 ~% i, `
          uuchar |= MISO;           // capture current MISO bit: Z8 J% ]# E6 g$ T8 }+ T" Z
          SCK = 0;                // ..then set SCK low again; _9 I1 K% ^" p
        }
    ' G: ]) e" }' J8 t- ^! z    return(uuchar);               // return read uchar3 {4 l9 m) S( F
    }6 b" J% x+ n  c

    & o6 s% A. q  W/****************************************************************************************************+ N) v/ O! L) v
    /*函数:uchar SPI_Read(uchar reg)
    ( M. }3 y( h/ b% J/*功能:NRF24L01的SPI时序& C( X/ C, `- y& t' e* G
    /****************************************************************************************************/
    # x* M- D; E- e. auchar SPI_Read(uchar reg)
    6 o' U3 E) h& W, [9 B7 p{/ {4 y- K. Z$ D# K
      uchar reg_val;
      P. |4 h1 ~! }3 |  ~# b1 |' N8 P# r; g
      CSN = 0;                // CSN low, initialize SPI communication...3 e7 H5 L$ c: `  c! C' @9 w) ?2 B/ I
      SPI_RW(reg);            // Select register to read from..* \% h6 P8 o7 P: C! s4 U
      reg_val = SPI_RW(0);    // ..then read registervalue5 l4 g! x3 X' E% ]
      CSN = 1;                // CSN high, terminate SPI communication# e* }: o- @, k( f  J* o" ^
    ; e7 M8 d% n, K# l8 w
      return(reg_val);        // return register value
    1 ]" ~/ t) I; ^& d# x4 k0 v. b}
    5 r( T& W9 {: l, q7 W0 Y5 z; a% q- ?2 B- c+ p$ u7 h
    /****************************************************************************************************/
      K: P+ ~9 _0 V2 `/*功能:NRF24L01读写寄存器函数
    ; b6 [* u. w, |5 p) y% R  s; `: Y9 N/****************************************************************************************************/8 k& B* c% H: ~/ s
    uint SPI_RW_Reg(uchar reg, uchar value)
      w5 y  ]" Q/ K2 u0 C+ C) ^# y! ~{  ^) t  \, ]% V9 l3 |
      uint status;8 e! Y' R+ Y! I$ ?" T# y4 b( M# F4 ^

    ! N5 {/ I9 X7 F* e9 |& B1 _4 O  CSN = 0;                   // CSN low, init SPI transaction
    2 P# {# B3 {% Z/ e  status = SPI_RW(reg);      // select register# J+ {* O& [" i' ^- d
      SPI_RW(value);             // ..and write value to it..
    / O" q+ r5 p1 e) R8 r  CSN = 1;                   // CSN high again2 F; D! T, \3 E+ X' ^4 u8 U7 p; V

    " L6 \1 ?1 h* V# Y( U9 Z5 V, M  return(status);            // return nRF24L01 status uchar
    ) E" u- A5 X; w9 ]2 N' {}
    1 b$ e( {3 L; l9 ~5 q. R
    + P: \0 {) r  e/ T' n! K4 i/*********************************************************************************************************% m, A9 g* T7 j+ z% x' |* {
    /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
    2 Q0 z/ ?  }  y# O! z/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
    ' m) b: b8 U, B1 p* Q9 X/*********************************************************************************************************/
    & a) v) l2 B( U9 _uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)1 z. \& s. J* Z0 d# P! H+ U
    {' @* m: B) V- I
      uint status,uchar_ctr;7 p8 h, J1 m* ?) N( b! ?
    ' q7 e+ V+ k$ X) }7 p' Y& C  w
      CSN = 0;            //SPI使能          F/ K  M( c3 x8 ?' m/ h' d
      status = SPI_RW(reg);   
    - N8 h) {$ x+ x, M" K  for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
    ' a) y. y* O# a. f  {3 H# ?: ^& @  K! p: G, Q
        SPI_RW(*pBuf++);
    $ ?/ y7 Z0 c# A' V! P" `, I/ K4 ^$ e  }
    ' ~+ a" j, S! a: R4 E9 @1 n  CSN = 1;           //关闭SPI
    8 t% C" |. `% l  B9 g) \  return(status);    //  1 I+ T* C: p& J$ M1 \
    }; |# Q2 x4 U  s# x  x
    & }# Z( D/ B" _4 Q" g. B
    /***********************************************************************************************************/ \6 j& N5 B: x$ y8 c, Y3 d- Q( U
    /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf). g3 _4 u; [! V6 k/ |, A) P( R7 X3 ?" ^! j
    /*功能:发送 tx_buf中数据
    ; t+ r) h8 y/ t9 P6 |/**********************************************************************************************************/
    6 X. h6 p2 L* m5 d: u8 ovoid nRF24L01_TxPacket(unsigned char * tx_buf)
    0 h/ l; F3 j$ D3 e6 Z1 Y{' p+ Z" H% B5 H7 Y
      CE = 0;   //StandBy I模式   / c; L) y# h: ~7 \2 L7 s  u
      SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据  
    % |! |  [+ ^4 B. a' E5 g% L  SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送1 v" L; V  |/ c5 c4 \5 N8 |
      CE = 1;   //置高CE,激发数据发送
    9 q, d3 P! h' K4 @2 {  InerDelay_us(50);
    . X3 v2 i5 l+ W5 e. d! I1 O3 {+ c% L}, Q% W7 W9 B4 Y8 @4 @% ]
    ; Q  U2 n( q% X7 q' C
    //************************************主函数************************************************************1 s: X; @4 X, _  v8 N+ e: h
    void main()1 g( m" I& v" [8 }2 j
    {     
    3 s& _+ v9 E, k  unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,
    % N; n  T* y" a  B5 ^# n& ~. O2 W+ V                                             0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};/ }2 }' H* Q6 Z1 e- `/ @
      Init_NRF24L01();
    4 D3 P' [  ~# Y2 c2 X3 C  @- F# T  nRF24L01_TxPacket(TxBuf);& e  l6 p. R4 F
      while(1)
    3 b( i2 }! O7 V# D  {
    % U, y& R" ~& v) |3 i( i    nRF24L01_TxPacket(TxBuf);9 a3 R: g' |$ t* G
       sta = SPI_Read(STATUS);
    $ X: Y9 n4 N: a& d- Z$ q& b   if(sta == 0x2e)                      //查看是否发送成功
    + e4 _2 }' S$ n# e( X6 k    {
    4 s- w) [; h5 ?       P1 = 0xfe;     
    # x! W" T7 ^/ G& u}, t' X. e. [5 J& s
        SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器
    7 W. T0 b" N6 S    Delay(1000); //延时
    * C* R) R6 [! v: K" R2 s. u4 A   }  + r% b  N* M3 O8 {  H9 U' I$ Q. _
    }' k0 v4 U9 E" J: K8 w. L, c
    *4 |; |8 ]+ X* h5 Z: `: o
  • TA的每日心情
    开心
    2020-7-28 15:35
  • 签到天数: 2 天

    [LV.1]初来乍到

    2#
    发表于 2019-11-8 17:39 | 只看该作者
    只能说最后还是只能自力更生,这里程序本身并无问题,主要问题是我自己的电源没有用稳压芯片,用电阻分压的电压不稳定,用个AMS1117-3.3v稳压以后就好了.
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-24 20:20 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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