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

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

[复制链接]

该用户从未签到

跳转到指定楼层
#
发表于 2019-11-12 13:47 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

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

x
求教各位,小弟弄了两个星期的nRF24l01无线模块,芯片用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的电源是接了51单片机的VCC端后用电阻分压出来的在1.9V~3.6V以内.
/ j! q  t3 Y" K% h& L# j3 a     网上看到一个帖子的程序说是将收发两端分开调试  
* e5 `1 d* `$ \/ h单独调试发送,完全抛开接收,配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。
4 m8 _4 J. W4 O% D        SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);                 // 失能通道0自动应答
/ T$ }1 Z7 l* u  _( P- b        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);            // 失能接收通道0) |$ V; Z0 o8 A- p' l
        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);          // 失能自动重发
; z) _3 p9 m0 G1 R0 O/ U$ A* A! l: D, a# T: E/ F
而后程序如下:
5 v  W7 A/ V1 F# Y) V$ {( n) E7 l- K6 Q5 I) d, d$ X
#include <reg52.h>
  d5 O1 v4 l; X* B3 u" J0 d#include <intrins.h>
. e/ ?$ m3 ]; Ctypedef unsigned char uchar;
: N% f' Q( K6 p+ N8 Y6 o/ btypedef unsigned char uint;
$ q) p; S" \  D+ n//****************************************IO端口定义***************************************
5 J7 o8 z) [& H/ O, z
& z4 q7 N4 F  ?" [  m# Asbit         MISO        =P2^0;
6 ]8 E1 ?, t% b2 w; qsbit         MOSI        =P2^4;
6 F/ U" V$ W9 d7 h% ^sbit        SCK            =P2^1;
7 ?, R2 d, Z: |( S  Ksbit        CE            =P2^2;
- R. [) O9 L1 `) \sbit        CSN                =P3^3;
. F. H$ T5 X6 Asbit        IRQ                =P2^5;9 ^  ^; I4 z# k) S; B* y
sbit LED = P0^0;7 V9 x% e$ ?6 F4 u4 Q

; ?- v) ]2 e: l$ _" `' |0 g8 Q//*********************************************NRF24L01*************************************
8 p' t4 r/ D$ v2 A  d/ {/ z% r#define TX_ADR_WIDTH    5    // 5 uints TX address width * |! ~- q. E9 N. `9 W- y4 w
#define RX_ADR_WIDTH    5    // 5 uints RX address width 4 B) V& s2 a; N8 d' K5 ?; M9 K
#define TX_PLOAD_WIDTH  20  // 20 uints TX payload 0 c& _. C( K2 r6 v0 Y
#define RX_PLOAD_WIDTH  20   // 20 uints TX payload
& g9 j; C) p( X5 h$ A5 p) Z& t5 e  ^/ B
//***************************************NRF24L01寄存器指令******************************************************* 4 z  j3 q7 Q; s2 T0 P; T# L- S
#define READ_REG        0x00   // 读寄存器指令
$ m( N/ P9 Y$ ]$ `#define WRITE_REG       0x20  // 写寄存器指令
% {8 v0 z$ _+ c#define RD_RX_PLOAD     0x61   // 读取接收数据指令 3 }5 v+ }) S7 x. h# Y+ r1 a
#define WR_TX_PLOAD     0xA0   // 写待发数据指令 . i/ E# W$ q, Q7 r& W/ h, V
#define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令
: \& z/ ]2 _8 a4 ^#define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令
0 o5 a' q8 |- I# W% r/ d#define REUSE_TX_PL     0xE3   // 定义重复装载数据指令
* _* m" l& L9 y- r+ h, R/ X#define NOP             0xFF   // 保留 2 Z$ [* m, e, b- s4 h" @2 q
//*************************************SPI(nRF24L01)寄存器地址****************************************************
, I% f) j0 e& U) [! G3 h: H- u2 l#define CONFIG          0x00  // 配置收发状态,crc校验模式以及收发状态响应方式 2 n  j$ @+ _) G% y
#define EN_AA           0x01  // 自动应答功能设置 0 X6 s' a9 I5 D1 M
#define EN_RXADDR       0x02  // 可用信道设置 " F& h8 g8 C( M: j  b* U
#define SETUP_AW        0x03  // 收发地址宽度设置
% N; n6 t) Q. }' N! ?4 x#define SETUP_RETR      0x04  // 自动重发功能设置 6 b9 \9 U( \7 W5 I% j
#define RF_CH           0x05  // 工作频率设置 ( \9 o3 J8 p( V
#define RF_SETUP        0x06  // 发射速率、功耗功能设置
$ G. D5 d+ I! Z5 ~5 D$ }& s#define STATUS          0x07  // 状态寄存器
$ a* s% K" E% k4 w0 X4 F#define OBSERVE_TX      0x08  // 发送监测功能
2 h4 `3 ^4 S3 `. B! D& [4 K- K, {/ I#define CD              0x09  // 地址检测            , u4 y' \% ~! R
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址
" O5 `2 ]7 T- x. B( X#define RX_ADDR_P1      0x0B  // 频道1接收数据地址
' l1 _6 s* H- j0 Y* c. O' q! J0 _#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
  J% A4 J" W" ^  i#define RX_ADDR_P3      0x0D  // 频道3接收数据地址 - R1 n# _; F# [  w7 I" ]% S
#define RX_ADDR_P4      0x0E  // 频道4接收数据地址 0 B: U8 l* a* V6 U! k
#define RX_ADDR_P5      0x0F  // 频道5接收数据地址
- G7 p/ t% |9 l2 d4 p2 N* A2 Y#define TX_ADDR         0x10  // 发送地址寄存器
0 L8 N- @1 [* e1 w2 z#define RX_PW_P0        0x11  // 接收频道0接收数据长度
! O  x6 A& a. O$ {$ T2 T8 b- d#define RX_PW_P1        0x12  // 接收频道0接收数据长度 8 O& S" L' u: p
#define RX_PW_P2        0x13  // 接收频道0接收数据长度
6 z( j1 i2 _; a- {#define RX_PW_P3        0x14  // 接收频道0接收数据长度 8 R. h: A+ T( F0 `8 k" K
#define RX_PW_P4        0x15  // 接收频道0接收数据长度 * ]0 M- Z8 j* R! T9 U8 U
#define RX_PW_P5        0x16  // 接收频道0接收数据长度 + w% t6 U* i! U9 t  Y$ |' ?8 |
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
7 u$ [* q5 s" S; W% r& C8 \, G0 V. V//**************************************************************************************
9 |1 g; z5 Y1 l( e1 ]- xvoid Delay(unsigned int x);
! p; _4 \3 H9 \' j9 @) cvoid InerDelay_us(unsigned char n); / C: D1 f! y7 u* v) i
void Init_NRF24L01(void); 8 m2 P" p8 R. _! t
uint SPI_RW(uint uchar); 0 J- c4 F% B- Q: ~# B; Y4 M
uchar SPI_Read(uchar reg);
1 m% c* L8 ?" e" {4 A" N4 g/ Gvoid SetRX_Mode(void);
8 a- Q; e: w) ?0 y3 Y: b( yuint SPI_RW_Reg(uchar reg, uchar value);
0 _: Q( F' W& Luint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
# z8 |! n9 a% k3 K& r. kuint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
4 v: ]/ O3 @9 _% S2 B/ }unsigned char NRF24L01_RxPacket(unsigned char* rx_buf);  4 Y* {; C2 C; T$ [4 i( b2 _1 E
8 m+ w, V3 y/ n* |
//****************************************************************************************** % F: B; ^7 j- z1 V
uint  bdata sta;   //状态标志
- ^- \$ d: a5 p: t7 asbit RX_DR =sta^6;
& \2 f6 k* U# Ksbit TX_DS =sta^5;
. ?. a" D6 E5 ?' ]sbit MAX_RT =sta^4;+ L- \& b6 n/ a5 b: e/ h

8 r* T2 Y. d4 g4 [% y1 W7 Luint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址  / L1 p; f* S6 W& @( G" H
/****************************************************************************************** ' z' R: v8 t; s! a; s
/*延时函数
6 D! t  @1 C. W) @5 J0 g/******************************************************************************************/
1 }: z4 c5 t, Ivoid InerDelay_us(unsigned char n)
% r. F" z7 H( y$ `{ & s5 e7 ^/ M6 }6 G/ H
  for(;n>0;n--) , U# G. ]  v( g8 n# F9 W
  {
8 u% K, s8 c) [' x& N     _nop_();
0 g& K5 p: V  _# m( O  }
% T' d4 I9 X; n+ o9 ^/ r/ N}
. L3 Q3 G% H/ H! H7 p  y! F# h$ Q) e: H4 U. O" c
//*****************************************长延时***************************************** 5 M" x( S, O+ K6 b3 L: r$ m
void Delay(unsigned int x) ) V' G. Q+ C) j3 o2 d6 q
{ & m7 w5 p) Y  O4 t
  unsigned int i,j; - C& ~6 T. S7 @, S* [! ]% F
  for(i=x; i>0; i--)
5 I4 ~; }& y$ w  {
# \; {- h8 T9 h4 G" |* L2 `    for(j=110; j>0; j--);; b7 z+ E7 T9 f4 i: e
  }
9 _4 S7 e, X) [}# K) p& K  B* O! @% \7 A

) w9 k# u5 ~) o/**************************************************************************************** 7 g% p& C* ~# G  b6 D  J) z
/*NRF24L01初始化   m" A; `' i6 |. i  J* I5 H
//***************************************************************************************/
% v- F5 `3 m, a" X! p$ s/ o3 m5 Vvoid Init_NRF24L01(void) 0 C, d& n( j/ I' H+ W6 i6 L) L
{
4 [) R$ X7 n, O( N8 H    InerDelay_us(100); / D& U) a! n- |( W6 I+ x
    CE=0;     
5 Y9 W! ~: f$ J# R8 n    CSN=1;     
2 a3 _7 I: B) E  C8 i% K9 M    SCK=0;   . d8 Q& |3 c: Z5 _
    IRQ=1; ' ]* m0 s0 V# L+ c& u! _0 ]
    SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    //  写发送端地址  ! `1 b0 d) a& `6 n5 n
    SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); //  写自动应答频道0地址
" W% [; K( Z( s7 b    SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);      //  频道0自动 ACK应答禁止      1
( e/ ]$ ~9 Y) r. _5 d8 U& S    SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00);  //  频道0接收禁止         2
# o+ j9 `+ R+ c$ Z( q4 d6 v    SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00);   //禁止自动重发       3   调试时注意这三点
, C$ _( A  l- E& t! W    SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
8 p$ F% {0 P* y) |' r$ A& ~# _    SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
: n; }" d  Y. a! X    SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);     //设置发射速率为2MHZ,发射功率为最大值0dB  2 `: U- R" r+ ?( \5 @+ ?0 J
}$ S- F# G% |/ z7 x1 ?, f

3 C- ]9 X) ]4 i$ r; c/**************************************************************************************************** 8 |( I9 U; G! d3 d& H6 ]6 I5 z6 i
/*函数:uint SPI_RW(uint uchar)
2 k+ }! R6 |4 W/*功能:NRF24L01的SPI写时序 ' H) w4 e) M3 i! W
/****************************************************************************************************/ 3 w/ s& q5 R0 W
uint SPI_RW(uint uuchar)
* k- a; n) e# Y; _' s  T6 ~$ N{ 4 x& p; }1 R# F( y8 ]* s8 ~+ E
    uint bit_ctr;
# f( y; X# s7 ]" E9 {+ o" ~" }2 O8 f    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
5 T. `' n6 a$ W' ]    { # n& [5 z3 Y3 a. h4 @
      MOSI = (uuchar & 0x80);         // output 'uchar', MSB to MOSI
8 }$ ^  O* C0 C- A, E7 L% x: n8 W      uuchar = (uuchar << 1);           // shift next bit into MSB..
, P# R& w, W9 P# c2 m' K      SCK = 1;                      // Set SCK high..
# d: A2 o2 I* V' j) T, g! x1 g) z+ @      uuchar |= MISO;           // capture current MISO bit
  v" {- K  O2 W) S3 Y4 a# L      SCK = 0;                // ..then set SCK low again
5 F2 Z  `+ v6 U: _* d0 Q    }
% s' [  r$ V" G: q5 X% |    return(uuchar);               // return read uchar 9 C" ~6 K5 d- l5 a- }" g  r1 w, H
}  k- C; n( a+ N, m

# ^4 w+ o( {0 `  J  V/**************************************************************************************************** $ i) P# _& K6 u" q; Y
/*函数:uchar SPI_Read(uchar reg) * V8 c( W, e0 }) E- Y
/*功能:NRF24L01的SPI时序
5 x& X* P" b+ n' A; G+ M/****************************************************************************************************/
* W$ ]" n# n9 `1 Y7 I9 ~* [0 d, zuchar SPI_Read(uchar reg) # s$ g; T  g. V8 m9 ^8 p# L
{ - Q2 n+ U: P3 S: R3 A
  uchar reg_val; 2 U4 _. B* ?4 W
+ U. y# E2 r( z6 q4 d: y. C
  CSN = 0;                // CSN low, initialize SPI communication... 7 V+ N0 c3 `4 ~* z
  SPI_RW(reg);            // Select register to read from.. 2 O6 T1 |! Y" z
  reg_val = SPI_RW(0);    // ..then read registervalue 9 f% D* V, U6 h& e5 o7 A
  CSN = 1;                // CSN high, terminate SPI communication
& h! _6 ~/ f3 R9 a  d" e  N2 l' X) |
  return(reg_val);        // return register value * g, y  o7 u7 d$ x  L8 L6 [
} - ~1 u( W8 x8 N: D

0 x2 t; G/ |2 z0 \$ r4 e/ b/****************************************************************************************************/ # Q7 w6 Y3 c) a- k4 R. I. \
/*功能:NRF24L01读写寄存器函数
+ G7 ?; n1 I5 q& B6 P/****************************************************************************************************/
; S' W3 U: H8 auint SPI_RW_Reg(uchar reg, uchar value) ' ^! T5 {' W! k7 q0 G0 o
{ , g3 _  P/ V/ i$ D/ N/ b/ r
  uint status; 8 c) l8 k+ X$ a! u
2 n3 J6 M3 L. j6 p' u; G
  CSN = 0;                   // CSN low, init SPI transaction 5 ~) w+ ~0 P2 l& ~% ~0 r5 ~5 x
  status = SPI_RW(reg);      // select register ! I2 A% t2 {& z# Z" K: y
  SPI_RW(value);             // ..and write value to it..
7 b) u' |  l0 K  ~( q/ X2 O  CSN = 1;                   // CSN high again 7 U$ X) X" g+ V/ D

5 _% n6 f5 W$ ?& ^: n; ~  return(status);            // return nRF24L01 status uchar
) |/ C# v% u; z% z5 G' m- K" X}
6 J6 ]0 F/ F0 u% U8 \
/ m5 k6 L$ ?" E; [  x/*********************************************************************************************************
, i1 E5 V4 n1 S# m9 V' w) K$ l/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
" q: {( L( ]% B) @: S  @7 X& A/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数 ( _8 Q/ a! }: L/ E$ `
/*********************************************************************************************************/ 0 ~! A$ v3 I9 O& g  Q3 `: x' g/ x
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) & G8 m* h" @$ S2 ]
{
% G: Q0 _7 Z( B  uint status,uchar_ctr; , ^  }0 ?$ r, x0 m9 R# `

2 x* @3 K- P7 P; e  CSN = 0;            //SPI使能        
3 i# q# r5 B2 C7 S0 I4 F: @: \  status = SPI_RW(reg);   
( J. J+ K: J4 z6 d- b  for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
1 C% G& l* w+ f& `) h  {/ a+ m3 C0 A2 @
    SPI_RW(*pBuf++);2 V) W/ t- Q* m2 t5 J
  } . S% M! e) d5 C/ R+ f$ h
  CSN = 1;           //关闭SPI
3 |# {" o& {; z% k& L* S  return(status);    //  + l4 o/ C- C+ ^* M4 D8 H% j  W: }3 W
} & r+ o$ G/ B" k
1 i4 I) y* N& |; M8 I
/*********************************************************************************************************** 5 T5 Z: h- H  k
/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
/ \  o$ l' x0 f" a/*功能:发送 tx_buf中数据 5 |" s' U- q4 u) w8 D
/**********************************************************************************************************/
, P/ S4 ]& d8 m( G5 Nvoid nRF24L01_TxPacket(unsigned char * tx_buf) 2 J4 z4 U- C8 n9 V6 h2 C) w
{
; v$ g! Q% ^6 U( i& Q  CE = 0;   //StandBy I模式   % B& M3 n' X0 S
  SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据  
2 I3 y9 r7 y/ ^  SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送
+ Z: J& ~$ z7 S; f2 r  CE = 1;   //置高CE,激发数据发送   n" q% b! B  h2 z6 s
  InerDelay_us(50);
' B2 y9 b4 x* L4 H0 b' u* F}) Q0 p2 ^8 e0 ?& M1 B

" M* u" u6 V9 N  X4 `//************************************主函数************************************************************ ( t/ j( K0 N+ T4 V& V8 `
void main()
3 H3 h1 X* y+ _8 E1 U5 i, D{     , _: s* k3 [- l$ `7 _& a
  unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,8 p) _6 ^. F3 Z
                                             0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};
7 \3 P% T7 K% ^4 |- o7 C  F0 i# x  Init_NRF24L01(); ; U; H" F3 \  b0 v# P. p- V" c# [
  nRF24L01_TxPacket(TxBuf);
+ F# M3 J9 g6 C* e" y# c  while(1)
! |) {3 D, e8 g$ c* f  {
' k& [9 P4 g: I5 n  y( H, I" k' v    nRF24L01_TxPacket(TxBuf);
" |7 C, l& l% l; e' P0 O   sta = SPI_Read(STATUS);& V1 [  U: [7 V( {( h7 L7 ~* `
   if(sta == 0x2e)                      //查看是否发送成功8 L3 H$ j, z! `  s' q
    {
+ f1 K- Q# o! O6 k/ a( ?- e: h  `- U       P1 = 0xfe;     
2 O9 J' \/ E: n/ T* {}$ b: G3 y/ z; O6 I
    SPI_RW_Reg(WRITE_REG+STATUS,0XFF);   //清状态寄存器
: f5 S5 j) C8 u$ g$ l( G    Delay(1000); //延时 $ \9 C$ X$ e* ?0 q9 ?3 T
   }  
6 U$ d0 a2 F1 a  r. [6 Q6 w' f# C}
  j3 {" u* l) q/ O+ ~  u*- l$ q% C% C  b. B8 X' A

; i- R9 h* X. ?. u

该用户从未签到

4#
发表于 2019-11-16 23:02 | 只看该作者
搞个仪器先确认硬件吧!

“来自电巢APP”

该用户从未签到

3#
发表于 2019-11-13 08:24 | 只看该作者
:hug::hug::hug:
头像被屏蔽
  • TA的每日心情
    开心
    2025-1-23 15:05
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    2#
    发表于 2019-11-12 15:29 | 只看该作者
    提示: 作者被禁止或删除 内容自动屏蔽
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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