找回密码
 注册
关于网站域名变更的通知
查看: 394|回复: 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 编辑
    $ W& S: x# J4 C6 G* P  X! B3 V( m, L4 C
    求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内.
    ) L  g1 ^  j+ c% ~) q/ }     网上看到一个帖子的程序说是将收发两端分开调试  , E- b* z3 F" @0 D% F, s2 ]
    单独调试发送,完全抛开接收,配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。* r) a( ~3 o& H: E9 e2 M6 W- }
            SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                 // 失能通道0自动应答
    + D  Q+ K" L' [- |7 E+ a9 k4 o        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);            // 失能接收通道0% @7 f9 v2 n7 n, [) ~* u+ c
            SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发
    $ N  z0 A: r- i) w7 F" V. P
    " I# K6 t6 ]0 d+ I" i而后程序如下:
    # b6 U* [" ~' J& z0 T1 j) J$ g& m' o, a
    #include <reg52.h>
    0 q0 X3 X. N5 x* H# G; J#include <intrins.h>- @; w1 J0 b5 V$ p/ x, y6 {/ K
    typedef unsigned char uchar;/ Q" }- E) y+ O0 q% b/ r7 B
    typedef unsigned char uint;! m) G1 o$ g" _$ K
    //****************************************IO端口定义***************************************
    : a5 z2 N7 `4 z0 U. Q1 _9 b( a
      b; D$ e. E7 e) p) N' r2 vsbit         MISO        =P2^0;
    6 y. x( l( T+ @0 {% ?* c9 vsbit         MOSI        =P2^4;# R6 [4 p6 B+ T3 ^8 J
    sbit        SCK            =P2^1;  g4 _  L, _% V  H
    sbit        CE            =P2^2;
    . l$ S, s! I) ]' ysbit        CSN                =P3^3;  s. \8 [; s3 W5 C4 {
    sbit        IRQ                =P2^5;
    5 a% m3 r, \! V7 u! a! Zsbit LED = P0^0;
    - C8 g6 K& V: x( L
    , ^# u0 \; c+ A" E/ e//*********************************************NRF24L01*************************************; `  f  n& S! O
    #define TX_ADR_WIDTH    5    // 5 uints TX address width
    7 q+ y* c0 e6 E#define RX_ADR_WIDTH    5    // 5 uints RX address width
    7 I- n0 S- q% w3 Z  z: A#define TX_PLOAD_WIDTH  20  // 20 uints TX payload( k, k% L' ]4 k4 j+ C
    #define RX_PLOAD_WIDTH  20   // 20 uints TX payload
    $ s0 }: n6 q: _: Y. I& A  b' ]( Y  l; P4 R) A' c
    //***************************************NRF24L01寄存器指令*******************************************************' r4 n( K& X- H9 I, |+ W* N5 \
    #define READ_REG        0x00   // 读寄存器指令
    6 Y& v9 g# Y0 Y% }# z# |( c5 u& u#define WRITE_REG       0x20  // 写寄存器指令
    , B* ]2 d3 z6 t#define RD_RX_PLOAD     0x61   // 读取接收数据指令; s% k: O1 `2 t* }4 B- a7 @
    #define WR_TX_PLOAD     0xA0   // 写待发数据指令4 S  j7 R$ C- f. d: C% l& r& O6 q
    #define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令
    8 P( P  S) i  T# G$ Q#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令% t: r/ ~5 O: F  i
    #define REUSE_TX_PL     0xE3   // 定义重复装载数据指令
    3 k$ W+ ?8 |' h, x9 o#define NOP             0xFF   // 保留
    " [8 D4 y4 C3 R/ ]//*************************************SPI(nRF24L01)寄存器地址****************************************************
    ( a  ]6 F" H* r8 E5 X& @( o#define CONFIG          0x00  // 配置收发状态,crc校验模式以及收发状态响应方式
    ! ^4 Q/ k/ V  ~* V) Y6 M#define EN_AA           0x01  // 自动应答功能设置  T6 I7 G, Y% B; A$ y# M1 s+ s3 B- m
    #define EN_RXADDR       0x02  // 可用信道设置, @8 T- M# i0 e2 M1 F! w3 ^
    #define SETUP_AW        0x03  // 收发地址宽度设置
    1 ~! g9 z$ F' d4 t$ l1 a; Y& G- `#define SETUP_RETR      0x04  // 自动重发功能设置- y9 n" [3 u0 j* y' R! [: J& X& {
    #define RF_CH           0x05  // 工作频率设置# Z6 w2 j, N8 x9 f
    #define RF_SETUP        0x06  // 发射速率、功耗功能设置  f- r5 r0 N* u# r+ a7 H! G5 ^
    #define STATUS          0x07  // 状态寄存器
    6 f; S# l, R& m* `2 C% l#define OBSERVE_TX      0x08  // 发送监测功能
    $ c# u7 ^6 _. o7 n. H#define CD              0x09  // 地址检测            
    $ \; v3 P7 {* C; u& B+ Z#define RX_ADDR_P0      0x0A  // 频道0接收数据地址0 [7 ~9 ?, @" ~/ p! d$ y' F
    #define RX_ADDR_P1      0x0B  // 频道1接收数据地址7 [! ^1 o5 ]+ ~+ c
    #define RX_ADDR_P2      0x0C  // 频道2接收数据地址
    7 F8 D' m( j) o& r" Y9 c) D#define RX_ADDR_P3      0x0D  // 频道3接收数据地址$ u$ L6 O3 D- e, s5 Z5 }! `* e
    #define RX_ADDR_P4      0x0E  // 频道4接收数据地址! D1 H) }, b: B2 P  r
    #define RX_ADDR_P5      0x0F  // 频道5接收数据地址
    8 u, E; j+ g5 Q#define TX_ADDR         0x10  // 发送地址寄存器
    + q+ I% G* c! B$ S+ D, `# T2 j#define RX_PW_P0        0x11  // 接收频道0接收数据长度% V& B* W( y1 f* Y& n8 Y
    #define RX_PW_P1        0x12  // 接收频道0接收数据长度
    8 B- l8 z4 d+ v) ?7 G#define RX_PW_P2        0x13  // 接收频道0接收数据长度
    . r, v; K/ @9 ^; {. ?0 ]#define RX_PW_P3        0x14  // 接收频道0接收数据长度
    9 Z5 l9 `  C% u, \#define RX_PW_P4        0x15  // 接收频道0接收数据长度
    1 `: \, r- o8 R+ G; u#define RX_PW_P5        0x16  // 接收频道0接收数据长度
    # Z8 l5 ?7 N. u# ~; |& o#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
    - j  g# R9 P& d  L" @/ E//**************************************************************************************
    + k/ T  q6 O6 E% _void Delay(unsigned int x);
      Q% L9 i. p; E( p3 G4 |void InerDelay_us(unsigned char n);
    ) T$ S8 N# S* p; a' D, }) |' Rvoid Init_NRF24L01(void);1 e) ?, G5 O- m9 G- a/ Q. t3 v, c
    uint SPI_RW(uint uchar);& D8 {. }* O' B6 h- g
    uchar SPI_Read(uchar reg);* W7 z" Z$ C# f; G! P6 N- d3 X
    void SetRX_Mode(void);
    % i! z; d2 J. Z% auint SPI_RW_Reg(uchar reg, uchar value);
    - r6 W& J1 _4 y7 kuint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
    & ^  S' s4 h0 W; K- {uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);, H/ ~9 g0 _( u$ S- Z9 i8 C# D
    unsigned char NRF24L01_RxPacket(unsigned char* rx_buf);  
    : K( u& v3 ?: Y, I; `
    ! {/ K, y8 `$ U3 j/ p8 }) M" Z. c' e//******************************************************************************************/ R" Q% c2 x6 l8 ~: E; h
    uint  bdata sta;   //状态标志2 {+ @/ x0 q1 [/ f$ s* m
    sbit RX_DR =sta^6;7 i3 u5 p- V/ d
    sbit TX_DS =sta^5;# D5 Y0 R2 g3 u* G
    sbit MAX_RT =sta^4;# J+ r1 A" w4 }. C, ~4 H" Y; m# f

    + q' T: I3 |0 G% g/ T. J1 K1 M7 Guint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址  / V9 p. F/ j, L$ {" j4 k
    /******************************************************************************************
    - B, x( [1 @. W- I4 @/*延时函数
    ; a! {& _$ m. Y. X$ t' E6 s/******************************************************************************************/$ _6 X, ]8 r, P; K
    void InerDelay_us(unsigned char n)
    4 m6 {& G9 Q2 F" @" g# \5 u{
    0 x" Y6 t  R0 C% L' z/ F  U8 G/ y  for(;n>0;n--)
    , {6 w3 q$ E& V' w% Q  {! e* J- M5 L5 w( O6 w, m
         _nop_();* m9 `" v/ J+ l# M" F
      }
    8 A- `: V: {* M; b$ v" O: v2 Z% G}
    , ?/ @% G; E+ {: r- q
    1 I7 w) L1 @0 k) V//*****************************************长延时*****************************************8 [1 D( ?% s, y+ D2 @) j* Z: S2 Y
    void Delay(unsigned int x); v! v" E2 @* m6 H8 }/ z# D8 f+ ^
    {: t$ ~& }' m6 E2 V2 u; o; z
      unsigned int i,j;% G7 ^, R. z/ w1 q
      for(i=x; i>0; i--)
    * `( g0 K+ d5 ^9 ^  N5 I/ \6 e8 U  {
    & U9 S2 ~0 f% g" x0 h# ^  t    for(j=110; j>0; j--);
    : A3 b! t3 C! \6 \  }+ k6 y- z( ^/ Q9 {2 L
    }
    * v& f! t' J8 o; i3 J0 k7 M5 l" {- J. m' z" S
    /****************************************************************************************% v! s6 P! N2 d9 t" ]9 P
    /*NRF24L01初始化0 L4 G: J) W# w+ O$ B( Z8 |
    //***************************************************************************************/8 A1 N2 ]+ B$ g% Z2 x3 s$ L
    void Init_NRF24L01(void)9 y8 O. y0 v, ?* w0 e
    {
    7 w) M2 ~% |5 e    InerDelay_us(100);6 p" W8 L9 y8 V
        CE=0;     0 {& T( I0 b& p7 T
        CSN=1;     
    % S' }0 U+ z9 Z1 J' J8 Q    SCK=0;   " f6 Z: ^0 R; w% p/ i( J" n
        IRQ=1;% G; S" E: P- [
        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址  3 k2 P6 i7 a9 F, P( n7 t
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //  写自动应答频道0地址# N  ?. U# U) N6 @6 e1 e* g
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止      1
    6 H4 `# k$ A8 z    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  频道0接收禁止         2' g6 ~2 ^, E8 {
        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   //禁止自动重发       3   调试时注意这三点' r; m) k8 n/ ?0 \" y- @& B
        SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
    $ p1 k5 A2 f0 q/ x& b5 P    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节5 J. ~6 P% M8 p+ t* K
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB  
    " t+ y. e7 F  l7 _- H}& J7 p. ]1 H3 ^2 b

    3 p# ?2 Q; O7 M/****************************************************************************************************  [1 Y) N1 V2 }, O: f6 p* |8 x$ h
    /*函数:uint SPI_RW(uint uchar)
    ( ]! X) s9 i1 [. _0 A7 u7 c7 T7 |/*功能:NRF24L01的SPI写时序- C+ m; o2 D; g4 j# y) t. M
    /****************************************************************************************************/0 I8 w3 R" P5 c0 w
    uint SPI_RW(uint uuchar)  w: x9 E' S5 I
    {% q  C2 l$ Y8 I: @2 V, [
        uint bit_ctr;
    . p: ~9 J" t, x5 T1 v: k    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit: g; G. `# s* U& m* U4 B
        {
    0 K# ?" n- j) }/ L6 a" V2 \, n1 {      MOSI = (uuchar & 0x80);         // output 'uchar', MSB to MOSI
    7 T/ X- W: e: H! w% n9 k      uuchar = (uuchar << 1);           // shift next bit into MSB..7 s2 ^: r) {; m( P7 c! G
          SCK = 1;                      // Set SCK high..
    * Z% N1 }6 N3 V% v: h* e      uuchar |= MISO;           // capture current MISO bit
    7 d8 \. |4 m3 M" W2 n- s) \2 @$ h  \      SCK = 0;                // ..then set SCK low again
    . T6 m$ g+ P; {( ~    }
    ' b& J5 w8 g* d7 x: w( f    return(uuchar);               // return read uchar
    / z3 m1 U" J6 \8 l( S}) t2 d3 Y8 M8 y- P2 O9 L7 Q
    9 J0 j' ^9 l: Y) S
    /****************************************************************************************************8 P: V- Y9 u8 N- S
    /*函数:uchar SPI_Read(uchar reg)( X, o3 u2 b, n% T' T) k
    /*功能:NRF24L01的SPI时序  i5 u% R7 p' g5 {( _( V( d
    /****************************************************************************************************/7 y* G0 V! [1 e, Y: d9 s, ]
    uchar SPI_Read(uchar reg)1 y- Y& G1 V1 |. N
    {
    " a" k- S, _7 H( [! G0 O  s# v  uchar reg_val;
    + t" s. J% D3 @: q* e: @6 q/ N& L
      CSN = 0;                // CSN low, initialize SPI communication...
    5 j' l' N; [* Y, l  SPI_RW(reg);            // Select register to read from..
    # w" U% }( j& O0 {  reg_val = SPI_RW(0);    // ..then read registervalue& u8 e5 ~# Z) C* L8 G2 I
      CSN = 1;                // CSN high, terminate SPI communication) J2 g; ]: U, y1 ^& x

    : n3 ]0 c& d& _- F. J, I3 m6 E  return(reg_val);        // return register value
    8 o% s% I2 y- l6 z}* ^3 T0 i) \6 K0 C" Y9 s

    ( _3 D8 D$ Z" u5 k/****************************************************************************************************/
    $ b5 r, v9 b  U% I0 [  Q5 e/*功能:NRF24L01读写寄存器函数
    0 e% P6 Y# g6 R8 {( i" f/****************************************************************************************************/
    " r9 N: a4 E% k4 xuint SPI_RW_Reg(uchar reg, uchar value)
    : K) C9 r. I4 f9 g1 P+ O3 G% u{
    % w2 r. I- x* O  uint status;, V& c7 Y* f# E0 p' V% g
    ) h# _. Y! ^# U3 c) D# ]+ T
      CSN = 0;                   // CSN low, init SPI transaction2 I) V: `: S. y. e
      status = SPI_RW(reg);      // select register, t6 q* z0 k, ]
      SPI_RW(value);             // ..and write value to it..
    . \1 J0 x# r$ r% f  CSN = 1;                   // CSN high again
    5 I1 v' L4 R! Y0 `$ H6 |% R4 i: P8 [. U- c3 k, l
      return(status);            // return nRF24L01 status uchar' ]& n0 B, p* L9 f# M( d
    }
    + y% ]0 y& L; u7 _5 }  V7 J8 w; b
    /*********************************************************************************************************. `6 u; E8 D' p- m! P2 \
    /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
      l. I; h: ]0 r! A/ E/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数2 ]5 q" r+ }% q( d& q5 ], H
    /*********************************************************************************************************/, @5 L2 j6 N- h( l. K: G! B8 q
    uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)  k# ^* r2 t9 D6 Z
    {# f; ?$ ?% h/ c, O+ r. T
      uint status,uchar_ctr;
    + e- m" Q% ~( R* w
    6 h( g5 B& A5 a" J3 V  CSN = 0;            //SPI使能        
    2 o0 ^) B% b+ B, B- @, C& [  status = SPI_RW(reg);   0 l8 N4 d& F1 \
      for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //: K! e6 T' t; D" @5 M" `: h
      {& F" H! l1 X0 d
        SPI_RW(*pBuf++);" }7 c' i+ [3 `5 [
      }
    " r" e: z' f9 t$ u  CSN = 1;           //关闭SPI
    $ a4 S8 T0 Q* i3 z" w  return(status);    //  & o- `/ N- t" V# _
    }
    6 ^& [0 d7 c2 J/ W
    # I3 v  l' P" ^/***********************************************************************************************************
    1 u( d+ [0 O, \' b" l: ]/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
    * ], e# n2 T) @4 H8 ?/*功能:发送 tx_buf中数据
    " h% v6 t7 v. T2 S3 J2 ^) H/**********************************************************************************************************/7 L& U2 r" O  S2 J6 @& z
    void nRF24L01_TxPacket(unsigned char * tx_buf). U4 s% W- ^! X, D
    {
    7 C: \; A- d0 C& o1 K  CE = 0;   //StandBy I模式   1 }. I) v. P5 M7 k; K
      SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据  - s. ^) h& I; A" o" u
      SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送
    , B( F; e4 W3 Y5 l  CE = 1;   //置高CE,激发数据发送) b+ v4 V6 o1 q, C' j8 ]) w
      InerDelay_us(50);
    2 t- ]* H7 s- b8 r}
    & a/ h- z' t' I/ B: a7 w. ?/ ?% P
    ' D* p0 i+ k! A5 [# m+ H( [//************************************主函数************************************************************( [( ~! p' N' q4 d7 |+ M8 {! A1 m( Z
    void main()/ `3 \! E' V! S' @% b4 |, j
    {     
    * x# O% f8 L( ^  unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,
    - N; k1 \. h3 D0 w. \                                             0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};( S; w1 N" Z* j0 d8 T
      Init_NRF24L01();% W5 |* W" W8 h, u+ j
      nRF24L01_TxPacket(TxBuf);5 x1 k2 L8 j. G
      while(1)
    ' f& x( s( a4 L1 x, Z7 K  {
    6 y/ G- A' C6 A. Z, x5 l# Z    nRF24L01_TxPacket(TxBuf);# x6 H- x8 y: U
       sta = SPI_Read(STATUS);. y. T0 |" z+ [8 N5 _8 ]
       if(sta == 0x2e)                      //查看是否发送成功
    ; A: |( h/ g, Y( Q  E    {" N! |2 S/ Q0 Z$ p7 M& U
           P1 = 0xfe;     
    # ~6 ?7 H# u) D, F}2 P) c/ D( P0 \) H
        SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器
    : t. F$ v& \8 M) y3 C' M, K% Y8 U! {    Delay(1000); //延时3 h3 |% O& Y) a( J
       }  
    9 l7 u: \5 f, U5 F' ^}
    " m4 k, n4 r7 z" F8 I2 k*- z$ ]  _2 M$ [' p- @+ h. A$ d
  • 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-8-21 11:26 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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