找回密码
 注册
关于网站域名变更的通知
查看: 409|回复: 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 编辑
    # _! b( v. I1 N" K# h6 `
    . m  r5 F5 y. w7 W( c9 ]4 d6 T3 w求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内.
      u, u9 w& x  i8 D: P$ @     网上看到一个帖子的程序说是将收发两端分开调试  6 V/ i$ t( H& s1 }7 I. y" k  |
    单独调试发送,完全抛开接收,配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。
    : x# o6 Z1 A1 b& h" D        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                 // 失能通道0自动应答
    1 u! [0 |6 c! M! N        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);            // 失能接收通道06 x: H( W# m3 H3 g) ]& `# h+ i
            SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发
    ' Q8 z) @, s/ v/ t$ q$ ~8 X
    9 y/ e7 G1 ]9 n而后程序如下:
    & m! l& ~/ J* q( L# \( b1 E, J* s
    - L* m5 [* T7 T" ~#include <reg52.h>
    , @; l7 `2 I# O4 z7 `; |# P6 X#include <intrins.h>& c* @# c8 S% i. m- z
    typedef unsigned char uchar;  u1 l& T8 L" ]
    typedef unsigned char uint;
    7 w. e  L: x( o9 r2 x//****************************************IO端口定义***************************************
    / Y) \$ Y! h4 x2 a8 o4 ^( W
    % E* v2 Y4 U1 S9 X7 p; }8 ?. rsbit         MISO        =P2^0;
    ; c. y5 p" B  b+ X- Nsbit         MOSI        =P2^4;
    + Z. L9 \$ W) G6 usbit        SCK            =P2^1;% Y, U3 P1 V) D$ i7 w. N6 ~
    sbit        CE            =P2^2;# \" |, L2 A' Q. \+ }
    sbit        CSN                =P3^3;
    . p  A# o4 T3 c7 G5 _4 V- ~7 isbit        IRQ                =P2^5;
    9 k' D! L5 R' k% f6 Hsbit LED = P0^0;7 i' J: l1 x% T: n" a6 j1 u

    / \% i. A( ^) n. r6 M//*********************************************NRF24L01*************************************
    6 _& I  m: ]8 A4 B+ g* d: M#define TX_ADR_WIDTH    5    // 5 uints TX address width! S3 x5 a7 L7 x( U; m2 m
    #define RX_ADR_WIDTH    5    // 5 uints RX address width
    9 V7 ^. C, c8 i9 \' e: A#define TX_PLOAD_WIDTH  20  // 20 uints TX payload% I' G: b9 V5 Z" w
    #define RX_PLOAD_WIDTH  20   // 20 uints TX payload5 v9 O' N& ?  K
    . ~( V* k5 }6 X; Q
    //***************************************NRF24L01寄存器指令*******************************************************1 P0 G5 O3 \" V: Y6 N& ]
    #define READ_REG        0x00   // 读寄存器指令
    ) N6 A: Z1 D6 _+ ~5 f#define WRITE_REG       0x20  // 写寄存器指令- i# H, Q- V5 S# B/ G5 Z9 |. P
    #define RD_RX_PLOAD     0x61   // 读取接收数据指令9 L8 s3 t* r( a
    #define WR_TX_PLOAD     0xA0   // 写待发数据指令2 m% p, Z- N" ]/ l6 [+ E) j8 C
    #define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令
    ( d2 W6 W, ^" z! C#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令+ j3 G8 h9 r- \0 d5 I! U
    #define REUSE_TX_PL     0xE3   // 定义重复装载数据指令
    5 b, r' T" ?) X! G9 @0 m#define NOP             0xFF   // 保留! Z1 o( {: _' p. q0 E
    //*************************************SPI(nRF24L01)寄存器地址****************************************************
    5 T4 u, {) n5 B1 U#define CONFIG          0x00  // 配置收发状态,crc校验模式以及收发状态响应方式
    1 Q( \3 e" Z3 q  ?1 V* ^, m#define EN_AA           0x01  // 自动应答功能设置
    4 [+ ~% k: n, `7 z8 t#define EN_RXADDR       0x02  // 可用信道设置1 L- B( Z. i+ N/ r) K1 K
    #define SETUP_AW        0x03  // 收发地址宽度设置
    8 v2 d, B7 B/ J#define SETUP_RETR      0x04  // 自动重发功能设置7 B% ]: p1 K$ e* _6 x2 F
    #define RF_CH           0x05  // 工作频率设置- a  S' I: }5 U  @4 q8 l: \
    #define RF_SETUP        0x06  // 发射速率、功耗功能设置. w4 D# \- ~5 v( a% ?2 c5 g! O
    #define STATUS          0x07  // 状态寄存器
    $ T, ]* b) z) _# I  u. |#define OBSERVE_TX      0x08  // 发送监测功能8 J2 b) j* z5 K- {
    #define CD              0x09  // 地址检测            " x: U6 n$ w- h& O) A9 n  G% u
    #define RX_ADDR_P0      0x0A  // 频道0接收数据地址$ e# I8 o7 d3 l% O* o; o' p
    #define RX_ADDR_P1      0x0B  // 频道1接收数据地址
    / J0 {; Q6 M2 j" Q#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
    6 u$ p) A/ [. O+ J#define RX_ADDR_P3      0x0D  // 频道3接收数据地址$ O6 c+ d+ _+ A
    #define RX_ADDR_P4      0x0E  // 频道4接收数据地址* i2 c! v, ^+ h
    #define RX_ADDR_P5      0x0F  // 频道5接收数据地址
    0 {* x7 ]" T/ h6 U3 w6 W6 R* m# |#define TX_ADDR         0x10  // 发送地址寄存器
    " Q3 t! C) H- ?$ M#define RX_PW_P0        0x11  // 接收频道0接收数据长度3 q2 y. q% a* I8 K& \2 s+ m9 n
    #define RX_PW_P1        0x12  // 接收频道0接收数据长度' J  ?, u" O- w
    #define RX_PW_P2        0x13  // 接收频道0接收数据长度) [' }  Y7 j6 T' l; t2 p
    #define RX_PW_P3        0x14  // 接收频道0接收数据长度
    : k5 b2 q) B! I* V6 ]4 n, f#define RX_PW_P4        0x15  // 接收频道0接收数据长度
    0 J4 M8 z, w7 G* q8 B; o; K#define RX_PW_P5        0x16  // 接收频道0接收数据长度
    4 O2 d: [: m, l' V' z; O#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
    6 n. Z5 p6 ~; H, R6 j: w+ u//**************************************************************************************, X& u' }$ _/ u. X
    void Delay(unsigned int x);
    3 ]+ U  o- C  A  U, N. ]void InerDelay_us(unsigned char n);
    9 I; x/ Z* X/ Z9 S5 k+ [$ Vvoid Init_NRF24L01(void);
    * W# F# s; l2 N6 L8 [3 g6 Fuint SPI_RW(uint uchar);$ e8 z% m. d" E) x4 }. n4 \
    uchar SPI_Read(uchar reg);
    & S8 Y' h& r- X4 l# G. q' ~$ qvoid SetRX_Mode(void);
    ! q0 z: Z8 Q  `: t" @" Uuint SPI_RW_Reg(uchar reg, uchar value);" ~' y* a. w2 B, L2 K
    uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
    + s: k( F& {# Zuint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
    9 g. n9 l4 J3 Y# m* X- qunsigned char NRF24L01_RxPacket(unsigned char* rx_buf);  : p6 F: T' B6 _' c7 e. v) M

    # j5 `9 N2 T3 t9 u//******************************************************************************************1 M$ g5 Q+ {4 W5 l/ h: D& P& o: R
    uint  bdata sta;   //状态标志
    # o, Y7 _; _" _+ s$ t8 Hsbit RX_DR =sta^6;- U* p1 h. }! R8 D
    sbit TX_DS =sta^5;
    2 }# A& F. w9 n! Vsbit MAX_RT =sta^4;
    : e) y: u% g3 O: a6 U5 L
    ) ^/ D) ?, w- Muint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址  
    & r( @: ]' ^* v% g: B. f& G7 U# E/******************************************************************************************8 e, e( Z. |" d# h' V
    /*延时函数0 B& Y( b3 }& x: y8 \$ j
    /******************************************************************************************/
    - o) `5 f9 B- I4 p1 o; F. U* Qvoid InerDelay_us(unsigned char n)
    6 _# u( `; _/ l6 R0 g& r+ j! c6 F{
    3 @& F. f3 h, t" V  for(;n>0;n--)
      M3 M0 U; P! ?- P0 X! _7 ]% @" U2 {  {2 [: E2 j3 X9 R1 I
         _nop_();5 L1 x, R0 k0 B! v7 Q
      }/ D) i6 L) W+ h3 l: S
    }
    * s% A' F( s" c3 i/ E8 T6 q5 b3 C3 p" X, Q
    //*****************************************长延时*****************************************
    1 `3 x/ F7 n  Q5 g# f% }void Delay(unsigned int x)
    $ k3 |" l; @+ X3 i4 y{: p2 a  B! r0 Z1 N
      unsigned int i,j;$ Y) |. ^, c8 _, |
      for(i=x; i>0; i--)
    : o9 U9 T- {- i( T: Y  {
      C# B( ~: o) d9 e    for(j=110; j>0; j--);
    , j9 x# ~  f. j  }8 {1 M- p) W5 q( R
    }; |! X. ^2 v' p- w: J' s

    9 a" l/ _' t7 H  ^+ }$ ~3 ^1 R# D/****************************************************************************************, u3 Z8 O. k. Q8 v
    /*NRF24L01初始化
    1 p) a! q8 I" c4 i" @& g+ N& e2 Y//***************************************************************************************/( p- t" j, V6 n& s
    void Init_NRF24L01(void)' p7 _" O8 {6 t
    {! ?/ ?, g# G  r+ \0 j# g0 A
        InerDelay_us(100);* X; e$ w# C, V
        CE=0;     % G, F, Y6 E: g7 p$ I$ |7 |0 m
        CSN=1;     2 |4 e3 I+ A8 i  L5 I- w8 b% {
        SCK=0;   
    & ^3 U: d5 E2 [. l: \    IRQ=1;
    / \9 l$ c6 S  k5 X- O( q    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址  . B5 @% f; W/ [. T% a8 x
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //  写自动应答频道0地址
    # B5 }7 h4 L7 J, a" ?! v; O8 i    SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止      1+ ?7 `+ Z. ]' a8 A- ~
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  频道0接收禁止         2* {) g; }: O, M# W: a! v* _
        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   //禁止自动重发       3   调试时注意这三点
    ; B! c( ^4 }' i+ m. z1 e& Q3 E# ~, q7 T    SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
    / l* ?6 `* C/ B8 X* [    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
    ! ~' h3 @" M3 m6 `* |& }9 W8 N    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB  1 ]( e- H7 e6 n) |: K! ?
    }
    ) X  e! n0 G+ g7 z; t
    * R  }7 N! p. F3 E/ |5 T# r0 r! R/****************************************************************************************************5 E0 e! f, {% P
    /*函数:uint SPI_RW(uint uchar)
    * P  _! s4 ?; v4 ]7 n. m  z" C/*功能:NRF24L01的SPI写时序
    ! c% X  }5 N' p* D/****************************************************************************************************/
    ( y2 y1 K, O$ `# Z) T% Z5 o* cuint SPI_RW(uint uuchar)1 c0 S+ w8 \' I/ }; Q. ^  w( i
    {
    8 G: e7 j, a; x4 C6 ^    uint bit_ctr;) y, }  ^% c! i
        for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit% n  \, Y5 J  ?, o& B
        {/ e% z  z  `  ~: r5 B. d
          MOSI = (uuchar & 0x80);         // output 'uchar', MSB to MOSI
    % l8 S2 @; g- {$ }* Z! d      uuchar = (uuchar << 1);           // shift next bit into MSB../ e- b2 Q+ q3 @0 f  V
          SCK = 1;                      // Set SCK high..0 e! \2 l9 X+ U9 q% h
          uuchar |= MISO;           // capture current MISO bit
    " U2 V% l: e2 X1 z3 M      SCK = 0;                // ..then set SCK low again. }( [8 c0 ~' K8 `& }
        }6 j8 ~7 W8 q, L8 Z) ^' k* i
        return(uuchar);               // return read uchar
    / r  n. H+ [* i+ W( y1 c}
    / t% E, J# N# F5 Z5 r9 g# U6 i) v" v* C* Z% o, [, L
    /****************************************************************************************************
    + c5 H  ]! Z7 h. r. Q/*函数:uchar SPI_Read(uchar reg)
    / C* m- x. L( f, _# ^! U/*功能:NRF24L01的SPI时序
    3 a' z5 k6 h4 y0 @/****************************************************************************************************/1 H' G' U1 l! u- I
    uchar SPI_Read(uchar reg)
    , H- {) `+ }% \{3 s5 S- W9 L0 s: b& B& J7 T% k
      uchar reg_val;
    6 T) r1 V1 z# J, Q- S" L# ]4 d
    9 i$ t9 |) I0 P4 G3 v5 V" _/ I  CSN = 0;                // CSN low, initialize SPI communication.... j+ y  j9 g4 J, [% M
      SPI_RW(reg);            // Select register to read from... O+ ?# V; n2 l% ]0 j% P) A
      reg_val = SPI_RW(0);    // ..then read registervalue7 C1 S9 ]5 H7 [& Q5 P
      CSN = 1;                // CSN high, terminate SPI communication9 ]9 s/ p8 h- }& r  j3 V) Z

    . k' r' J  p+ l! X% }/ L0 ]  return(reg_val);        // return register value
    : g" I; i! l/ ]7 P}8 A0 A# c5 ]9 T- c9 H; o

    % ~) h( J9 T& p& \5 N, ?/ Q5 _/****************************************************************************************************/. v) I1 b8 v% ~6 X) K; P
    /*功能:NRF24L01读写寄存器函数
    ; o6 x, y! M# S* I8 ^4 }5 ]/****************************************************************************************************/
    % g/ E" N! |: m, R1 j& muint SPI_RW_Reg(uchar reg, uchar value)
    . L7 J/ m2 W, H6 ~4 O{
    $ P7 T$ ]/ d0 w; K  uint status;, ?* `- C+ t: V* ]4 d6 V

    # s. c. j* t% L& B& K) ]  CSN = 0;                   // CSN low, init SPI transaction
    + _  \0 W6 \: v7 a  status = SPI_RW(reg);      // select register
    9 X  J/ N. a$ V+ d6 {  SPI_RW(value);             // ..and write value to it..
    $ h& Z6 n1 M- J6 `" y' I1 g  CSN = 1;                   // CSN high again) \  y4 u  i) Y/ g
    4 A1 ?. L  w$ N3 w4 g
      return(status);            // return nRF24L01 status uchar
    ) L8 u6 Z. Z/ W4 c- u}
    : O2 t1 Q5 n. I; |$ Y/ c5 ~7 Q8 A
    /*********************************************************************************************************
    / i0 g+ m( w; f/ [: q: c( g( B0 W. \/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
    + c4 t2 J- n9 {/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
    * Q  R& \0 }' G& w+ ~/*********************************************************************************************************/" w8 D# l/ v" `$ T; i
    uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
    3 [) g  K9 N7 l; g, c! l# B0 w8 ~{2 P5 Z. K. n* [! b
      uint status,uchar_ctr;2 K3 S3 K2 k3 J2 E& C
    . E+ c3 d! i$ v& F  W
      CSN = 0;            //SPI使能        , v: U$ r0 Z% ^3 J, }: f2 [1 d0 \3 E
      status = SPI_RW(reg);   4 l+ R) r3 g1 B
      for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
    8 v5 m0 D" N' h9 g/ i5 H) e% Q  {
    & v% m6 ~2 I% |0 u" {( a    SPI_RW(*pBuf++);
    5 x1 W  u$ U" C! u& Z$ q  }6 X9 E, i% b" {( l& v- c4 R. p
      CSN = 1;           //关闭SPI
    : }1 a7 v6 W: Q& C* d  return(status);    //  
    7 f; y7 U4 n8 H+ s  y9 d}
    4 ]+ s3 ~/ k+ p: f4 w3 w; Y
    ) Q6 ~+ d2 c4 F/***********************************************************************************************************
    4 P- ~, L9 s, a$ U8 I. r3 Z/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)/ f  L& ]; `2 d. v: D# S$ E4 [6 a( S
    /*功能:发送 tx_buf中数据
    ( D" N' ~1 V7 U/ j* r5 r0 w+ c& H/**********************************************************************************************************/7 o- T  {3 j/ K
    void nRF24L01_TxPacket(unsigned char * tx_buf)1 L! Q! f# g, e$ z* o; T$ L# X) o
    {. c, @3 N4 m4 F1 s2 Y
      CE = 0;   //StandBy I模式   
    ! d$ Z# ?/ m8 i1 E4 L# V  SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据  : L% [0 \2 m, o6 r5 E  c9 S5 F
      SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送
    : S9 i8 |: O" O! M, H  CE = 1;   //置高CE,激发数据发送9 b4 l' a, b* \; W+ B5 V
      InerDelay_us(50);
    : S$ l) t" b* M2 P5 M2 N}
    4 K) }+ c1 c% T9 E+ \* R9 A& T2 m2 ~: M& b) w* ^
    //************************************主函数************************************************************
    ) l/ R" D# L& {4 l0 Ovoid main()
    / O5 c% p/ q6 O& _; N{     
    ) y- F( f( q6 Z+ p  d, c  unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,' K( ~3 S* K, j7 ?- Z5 i
                                                 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};
    8 u/ i; l+ |# |/ n+ H3 V0 o6 F8 V  Init_NRF24L01();. [' L/ o% z" i# w  J8 ?4 s$ S7 @; z
      nRF24L01_TxPacket(TxBuf);
    ' T' x8 _; q9 J3 G: m; [  while(1)
    ! `9 M/ p& V/ M0 c  {
    ; u4 R8 F- M( _1 m& A    nRF24L01_TxPacket(TxBuf);
    2 f  F( G9 N: U$ I0 E0 |   sta = SPI_Read(STATUS);
    4 O# |  n; S4 ?" j4 k   if(sta == 0x2e)                      //查看是否发送成功% b* }. e1 C) e; N& K
        {
    + X, w3 Z: L3 j, S4 A       P1 = 0xfe;     
    $ \6 H2 `; ^2 d4 d1 R}
    ) ~' H" l" e+ ~" o$ E$ w    SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器) f* i2 {2 o+ T+ m
        Delay(1000); //延时
    2 A% |& x6 D$ K8 c: d   }    o: w/ D# G+ f
    }% V) @, Q9 ?1 h7 }2 }
    *, h9 I- V  ]  Y$ T, f# J
  • 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-10-31 15:19 , Processed in 0.265625 second(s), 23 queries , Gzip On.

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

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

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