找回密码
 注册
关于网站域名变更的通知
查看: 389|回复: 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 编辑 & ~/ ^: J3 r) T% V$ c
    * y# c# m# S( A% J$ B5 [  u6 d
    求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内.
    : `+ J8 g( d! J% O4 i1 E! u     网上看到一个帖子的程序说是将收发两端分开调试  
    " x$ A; {" z& A单独调试发送,完全抛开接收,配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。) H) f9 m$ q0 i7 |) w
            SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                 // 失能通道0自动应答; g/ }8 f7 Y2 g7 a7 N
            SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);            // 失能接收通道0
    & P( L# p( g. I( O/ H0 c" H$ R. U        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发
    & x: T7 \: e7 u# N5 y/ `1 A
    $ |4 P/ R( C( t) w而后程序如下:
    " `' U) s. v6 |( b  o$ g! K: B4 f; z6 m- i( Y
    #include <reg52.h>' G; Z( e) m2 B8 {$ V; O
    #include <intrins.h>
    + h1 J( t, U( Z( E0 m9 u3 Ltypedef unsigned char uchar;
    9 S  c: n; W; Jtypedef unsigned char uint;9 `# L0 S/ h4 J3 e
    //****************************************IO端口定义***************************************
    0 Z- \" l  r4 f/ ~+ f& F* d. H. Z3 ?5 r$ ^* {/ s+ C, H
    sbit         MISO        =P2^0;
    , h2 N0 e7 [4 c: isbit         MOSI        =P2^4;
    ; p: w* Z2 R$ @# B: |& h/ Nsbit        SCK            =P2^1;6 f1 [- U! w3 ^8 p  r* G5 D; c
    sbit        CE            =P2^2;$ ~, ?1 O7 g/ c, }- l5 i3 ~7 T/ Y: `
    sbit        CSN                =P3^3;
    & U4 p2 E8 z" @. V1 Ksbit        IRQ                =P2^5;( P. o: z) O: ~5 r0 Y
    sbit LED = P0^0;
    . ?, H5 m8 I$ a7 U6 b* H, b
    ) A2 `  D8 ]0 Q  Y# O; g//*********************************************NRF24L01*************************************
      N+ i; }. e3 o; ~' ?6 z2 Z/ f#define TX_ADR_WIDTH    5    // 5 uints TX address width
    : o2 W$ B) I# }. D#define RX_ADR_WIDTH    5    // 5 uints RX address width1 _3 E9 f) L8 C8 N
    #define TX_PLOAD_WIDTH  20  // 20 uints TX payload7 I  h7 N- m# ^" Z; K
    #define RX_PLOAD_WIDTH  20   // 20 uints TX payload
    ) l8 F8 q* e: w: I: S, ?6 y6 q) m4 t9 h6 n( M$ g
    //***************************************NRF24L01寄存器指令*******************************************************
    ' W( f7 m' I) \9 ^#define READ_REG        0x00   // 读寄存器指令
    6 [& ?2 ?' n9 k$ t#define WRITE_REG       0x20  // 写寄存器指令
    , N: [2 L( t0 d- I7 q#define RD_RX_PLOAD     0x61   // 读取接收数据指令9 J4 v( o! j, _  J. T+ @& r7 X; t5 N( O
    #define WR_TX_PLOAD     0xA0   // 写待发数据指令, M& }9 l& C8 Z7 I  [8 y7 T
    #define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令
    * l, S. [+ d. K) L: N* ?  f#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令
    9 e" i7 ?' n5 \2 S2 i" ]3 c#define REUSE_TX_PL     0xE3   // 定义重复装载数据指令2 ^) v. X  L: l4 N
    #define NOP             0xFF   // 保留
    " Z) u( z: \% F9 `1 d3 ?& a//*************************************SPI(nRF24L01)寄存器地址****************************************************& c7 I) u) i# j% I; ~# v: s
    #define CONFIG          0x00  // 配置收发状态,crc校验模式以及收发状态响应方式
    ) Z7 a3 b1 U  @. C#define EN_AA           0x01  // 自动应答功能设置) o' g9 c- D! ]+ M- E8 k! w! Q
    #define EN_RXADDR       0x02  // 可用信道设置: `1 q/ y0 j/ c
    #define SETUP_AW        0x03  // 收发地址宽度设置
    ( O" j) h0 A  `/ k#define SETUP_RETR      0x04  // 自动重发功能设置0 E: T2 S4 I: ?+ G2 j
    #define RF_CH           0x05  // 工作频率设置
    ( ]- |& R( a$ X4 K! Q. ~; F; N#define RF_SETUP        0x06  // 发射速率、功耗功能设置
    $ C4 h0 F' \% N, C7 |#define STATUS          0x07  // 状态寄存器# J! M2 N6 m  g9 l& s
    #define OBSERVE_TX      0x08  // 发送监测功能
    / O9 S. |( w: J! O3 R% r#define CD              0x09  // 地址检测            " v  c# b) ~  F) ~3 a3 M3 X0 ]
    #define RX_ADDR_P0      0x0A  // 频道0接收数据地址
    , j# _: ]: q& s% N#define RX_ADDR_P1      0x0B  // 频道1接收数据地址* F# X3 |  s0 J; B/ g1 L
    #define RX_ADDR_P2      0x0C  // 频道2接收数据地址+ g" r1 {+ e, w- M7 o1 ]3 G: U
    #define RX_ADDR_P3      0x0D  // 频道3接收数据地址
    ( o+ o$ M) b' `: M#define RX_ADDR_P4      0x0E  // 频道4接收数据地址0 r' T0 R7 |5 v, c
    #define RX_ADDR_P5      0x0F  // 频道5接收数据地址" [! R; M$ R2 U
    #define TX_ADDR         0x10  // 发送地址寄存器
    ( K1 V, F4 h$ Q! N, d#define RX_PW_P0        0x11  // 接收频道0接收数据长度
    2 V! |# y1 C% |8 q; e4 \#define RX_PW_P1        0x12  // 接收频道0接收数据长度
    6 |/ O" _$ W  b- q: }4 f/ }#define RX_PW_P2        0x13  // 接收频道0接收数据长度
    / y; i- h( T% o! S9 D#define RX_PW_P3        0x14  // 接收频道0接收数据长度9 {: L  q* V) ^) p
    #define RX_PW_P4        0x15  // 接收频道0接收数据长度
    1 L$ h& C, |. T. H, a#define RX_PW_P5        0x16  // 接收频道0接收数据长度
    % Y% x  @9 S- e5 ?#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
    + ^* f! t% l: v2 q2 T//**************************************************************************************
    & O0 N8 y6 z5 b* g8 W% W2 h7 m5 evoid Delay(unsigned int x);' o; i: n9 T& h6 N1 \
    void InerDelay_us(unsigned char n);
    + z* K4 j$ ]5 h% }4 U) V8 W, `/ t9 ovoid Init_NRF24L01(void);3 n7 }. q# Y, ?) L
    uint SPI_RW(uint uchar);) D  ^. o  [1 n) ^7 g
    uchar SPI_Read(uchar reg);+ @5 E4 m+ d; `) m* W( t
    void SetRX_Mode(void);0 V; n7 n5 ]0 K# q; M
    uint SPI_RW_Reg(uchar reg, uchar value);
    9 I* ]. e, K/ ^5 muint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
      J, X# O8 U% P9 N4 O) f  Puint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);6 ?7 X5 j, a0 T- y
    unsigned char NRF24L01_RxPacket(unsigned char* rx_buf);  
    4 u) Q5 G4 p0 e
    , h1 `! ~* _7 M: Z6 X+ v0 L//******************************************************************************************7 e3 M) \" f; V1 g) i8 t
    uint  bdata sta;   //状态标志
    : T# D# `% {; ]. l  [sbit RX_DR =sta^6;
    + ^3 y  t4 ]- b' @- Isbit TX_DS =sta^5;
    8 ]4 r6 a, Y4 J3 Z3 s& Gsbit MAX_RT =sta^4;
    5 l# T, m' ^* b) s8 H2 l" U% c  Z  S( S8 P0 e  a4 e) s& G
    uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址  
    . ]4 B  [* H% U% c3 d7 T# r/******************************************************************************************
    . ]; e- t6 K. s5 o+ n( _/ E/*延时函数& A; E! G9 m2 M7 d$ H) o3 p
    /******************************************************************************************/3 X2 z+ t" S# z6 L4 r: a- y  |
    void InerDelay_us(unsigned char n)" R. L, O% C+ ~
    {+ R# D- e; P6 y3 N5 v1 w
      for(;n>0;n--)6 [& f* R, i4 ~7 r2 U( Y2 y
      {
    6 U$ L7 Z' N' X& q& t$ C     _nop_();' n  u. f! f  `+ y% N; h
      }5 A1 q' t& `, D
    }
    % @/ z3 @3 Q* ~3 L6 h% R
    7 T3 J# h& \; }: A//*****************************************长延时*****************************************: \' P7 j) h! b& F! Y/ j" u' a, D
    void Delay(unsigned int x)
    ( K& A+ Z+ b* W: e. ~* W{2 D1 J1 P# G/ h; U  r' H) z" g: X, v
      unsigned int i,j;& i  [+ e( w! H; q+ }! r0 Y9 y3 J
      for(i=x; i>0; i--)( ?1 q: N: l% d. e$ w
      {1 \6 ?$ N( U% |% H: D1 O
        for(j=110; j>0; j--);
    / ^5 Q( v( c8 V/ x3 C, g7 `- ]  }
    0 \. Q+ t, x& Q5 A7 f4 A2 y}; k! I/ u) x% C+ {4 a

    5 C+ G; h) m7 U+ z/****************************************************************************************
    - f9 R1 [# I( A' I6 B( T" ]/*NRF24L01初始化
    ( S0 M) r! n. L- p# l3 k//***************************************************************************************/: W) W2 k6 s& ?$ Y) O' w: a& H0 E
    void Init_NRF24L01(void)
    1 D2 A* }1 z, B9 B{7 c: [: c, R# V8 Q
        InerDelay_us(100);6 {+ B  T# }9 O% f& S/ r  A
        CE=0;     
    $ Q9 p. c* N( r* N    CSN=1;     % I; S. q8 {' y
        SCK=0;   
    2 y: Z- F4 T1 g  L! u- ]+ |5 e    IRQ=1;
    ( J2 O4 {5 a3 W& p8 D0 H    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址  
    # Q5 q- g; v/ \" R" Q    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //  写自动应答频道0地址5 L, @' u+ V. J+ D3 B6 {4 T
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止      1
    1 }$ b- M" A3 N4 w" F" X/ q* \. A    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  频道0接收禁止         2. a2 v# q8 Z% ~% m. f2 n, \- ~2 S2 O0 R9 P+ R
        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   //禁止自动重发       3   调试时注意这三点: c4 y+ ^6 T- ^2 L5 m; ~4 i( s6 ~
        SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
    7 F1 p+ X: b2 ]% [, O( D    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节) {0 e7 `; f2 S9 c2 z
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB  
    3 P6 Z; U! s6 G6 V8 d}
    6 G( a" x$ y, h. c) P9 T3 b& u8 f( d. h7 X1 l) |; K9 R3 }( u
    /****************************************************************************************************, [$ r# ?2 p# N/ z0 D% n. X( I
    /*函数:uint SPI_RW(uint uchar)0 X3 H" G+ P* B% y1 c$ |0 E$ @
    /*功能:NRF24L01的SPI写时序2 b5 [+ H! h' N9 @
    /****************************************************************************************************/
    , A! R2 Q; t5 Muint SPI_RW(uint uuchar)
    - f; E. e; c# z2 m' P3 O{
    3 a6 }% H  N* K9 z' `( y    uint bit_ctr;# y. o# a0 ~8 @9 x3 f
        for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit" d, Z+ ~% R6 e' o: X+ H2 i
        {
    3 m( ^9 }5 O/ B  H      MOSI = (uuchar & 0x80);         // output 'uchar', MSB to MOSI
    # q! M; a. {6 |3 a/ `" d      uuchar = (uuchar << 1);           // shift next bit into MSB..
    ) h$ d! Y1 R  g9 E  h4 }      SCK = 1;                      // Set SCK high..
    7 s+ {# P3 c: V1 S) l) ~      uuchar |= MISO;           // capture current MISO bit' x5 a/ O, p% p+ w3 ~7 ^4 v
          SCK = 0;                // ..then set SCK low again) _. C% a- Z/ S, w4 [0 u
        }
    * B" z6 A) b3 x4 f8 c: a* j6 q    return(uuchar);               // return read uchar
    " {# H" Q. ?5 ~1 m$ y5 O# W. F}+ w7 R8 B3 n' d* S
    8 q% y+ {$ y/ S' {" o! P' Q% f
    /****************************************************************************************************
    5 U! H' R- ], k# B8 O7 {7 W/*函数:uchar SPI_Read(uchar reg)1 a2 C( t. O0 y" \; d( I. I
    /*功能:NRF24L01的SPI时序
    0 J, J) X0 a/ ~2 B( F1 Z/****************************************************************************************************/: F; g% U. \1 E  o8 x$ g* Y% J5 g% c
    uchar SPI_Read(uchar reg)
    : }0 @4 o; S; B( h/ x{
    5 g7 t# ?0 T$ `  uchar reg_val;
    3 q, [4 M3 E. x
    - D! s) w/ Z. _# O, J  CSN = 0;                // CSN low, initialize SPI communication...
      F5 e1 x6 m$ X9 G1 }; x4 W7 t  SPI_RW(reg);            // Select register to read from..4 w& P8 {$ N! M- Y9 ]3 u
      reg_val = SPI_RW(0);    // ..then read registervalue
    2 d5 ^& o; E# V" S- r+ u  CSN = 1;                // CSN high, terminate SPI communication  w, ]' E0 D3 u4 z

    4 ]* I2 D  b0 O; X  return(reg_val);        // return register value" S( i& K" K$ S4 [2 K
    }, c  N5 ~! }( U
    . a' i# D# e9 Q0 Z8 |6 t
    /****************************************************************************************************/1 y! N8 s2 D2 B  g# X0 X* f, l
    /*功能:NRF24L01读写寄存器函数  `. S5 ~% o! |( Z- l3 f
    /****************************************************************************************************/+ j7 V) p9 x# L; U
    uint SPI_RW_Reg(uchar reg, uchar value)
    * g9 Y+ |: R3 C/ u  H{
    : }6 ~4 z; Q6 Y& ~0 _7 ]4 j' c  uint status;  A) ~- r! F& g4 f/ I6 e7 A
    7 \% H( O" h6 P0 l. Z
      CSN = 0;                   // CSN low, init SPI transaction
    2 x( o0 z+ A8 a$ C( V' k  status = SPI_RW(reg);      // select register
    . y* w# s2 G& {" U' c7 T- ^7 l  SPI_RW(value);             // ..and write value to it..3 r' X6 P* n' c+ u8 p! }
      CSN = 1;                   // CSN high again
    + W+ N7 V4 [% |! D
    $ g* Q  T- `/ t+ }4 \  return(status);            // return nRF24L01 status uchar
    / A1 L$ `7 d$ \6 N7 K' d* a}
    ) T8 Y6 L, v' ?, j# R; z  G
    : P  @$ g1 Y7 m- ?7 j/*********************************************************************************************************7 W: `! i% |- m- A
    /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)' C2 u7 J! a3 K9 G) l+ O
    /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数1 T+ u/ R3 P1 n' b
    /*********************************************************************************************************/5 |& y* q! t/ q+ ?# }8 f- A
    uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/ o3 W4 C  H  F6 U6 L1 ~; A
    {- r' D3 x+ \' C1 v( ]. h1 c3 m
      uint status,uchar_ctr;. ~% T# n/ a. A) d9 t. O" a4 I

    $ O# d3 d& A: r0 m5 b; b  CSN = 0;            //SPI使能        
    0 y/ A2 K& d4 i1 }. `7 J  status = SPI_RW(reg);   
    5 `" T$ M; }$ m* p  |, \% f; n& F% |  for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) /// D* w* r6 G  @" K% i1 H6 i. I
      {9 u* X% Q1 N/ {) i
        SPI_RW(*pBuf++);% b3 W' D# [! ^/ ~2 N- V0 R
      }
    1 r; C5 k0 _  Q  CSN = 1;           //关闭SPI4 P9 b) G& F0 b
      return(status);    //  
    4 w8 b0 a% P  b" a5 m4 f}
    ; \/ q: T/ J( m: a4 m, _' `
      B+ X/ a4 e+ L. y5 A! R- D/***********************************************************************************************************
    & _5 ~$ s. W% Z* H; D; _/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)+ J" c0 j0 w% W/ u; A, u, }. o! X
    /*功能:发送 tx_buf中数据( P; g0 e. R2 ^$ K
    /**********************************************************************************************************/
    ) Z8 ~; d) H/ g' V! Hvoid nRF24L01_TxPacket(unsigned char * tx_buf)
    + @4 e' w$ O( I) f0 ?  B8 p0 E" B/ r{/ \  o  e; G! J. h. a) J
      CE = 0;   //StandBy I模式   
    $ t0 w" Q0 e4 f  SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据  / G6 z& ]2 e3 k; B, A% P8 R
      SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送, v5 P! [5 }8 M1 F7 j7 h
      CE = 1;   //置高CE,激发数据发送
    - ]5 o, P3 J1 ~  InerDelay_us(50);
    , o4 Q8 |) F: |4 L4 Q3 k}
    " l! n' m0 Z+ K) D% J( i1 X5 B0 q7 c* c/ t) e4 `! \
    //************************************主函数************************************************************! t6 a* j1 y/ o# K+ o
    void main()
    0 v7 w# A0 L! J* A* B{     
    " k& V* |1 \) F1 F  unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,3 l+ s0 I% X" V, }, X  E$ Q
                                                 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};5 O1 S- T* Y. B: x0 q
      Init_NRF24L01();0 ]# e. Q& y) |/ w
      nRF24L01_TxPacket(TxBuf);8 ~+ R! D: s7 G4 r* o
      while(1): o' g% `) R0 ]5 h% `# e
      {: m9 {- f$ i2 r1 S6 m" f2 i
        nRF24L01_TxPacket(TxBuf);
    - p0 ]: q8 X* g  ~: A   sta = SPI_Read(STATUS);) N5 a2 y: F& i4 _
       if(sta == 0x2e)                      //查看是否发送成功, P2 ]) f% s) u! \& x
        {  G4 X4 B5 a; t! b7 l. D! |9 O
           P1 = 0xfe;     
    + {- `# [7 T0 S- f}
    1 O2 v- T& T! |    SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器
    . X4 F2 B7 M8 n* k3 N& @    Delay(1000); //延时
    % c, K( X% M" C( r   }  
    * R- w. l& }5 T}
    ; o/ W, v5 ^. D6 l: g*
    1 l8 a1 D! @6 {! h/ Y8 c
  • 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-25 03:58 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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