EDA365电子论坛网
标题:
nrf24l01调不通,不明白硬件还是程序出问题?
[打印本页]
作者:
hope123
时间:
2019-11-12 13:47
标题:
nrf24l01调不通,不明白硬件还是程序出问题?
求教各位,小弟弄了两个星期的n
RF24l01无线
模块,
芯片
用的是stc89c52,可是几乎毫无进展,在网上搜到了很多的程序,函数定义部分基本上大同小异,我做了两个最小系统,用流水灯来显示结果,nrf24l01的
电源
是接了51
单片机
的VCC端后用电阻分压出来的在1.9V~3.6V以内.
5 v* f! S. F/ P! c: F# Y
网上看到一个帖子的程序说是将收发两端分开调试
5 H3 [+ e: i+ \
单独调试发送,完全抛开接收,
配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。
7 \* Q& G1 A# Y! t1 N9 N
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); // 失能通道0自动应答
: f I" P8 s8 y: W9 {' ]
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00); // 失能接收通道0
1 V6 F+ M" |8 \8 s& N Q+ I4 d: R
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00); // 失能自动重发
; ^6 G! G3 q( M9 b9 v
/ q7 b, {) R: o: ]9 ]4 k9 g
而后程序如下:
/ t! y' n0 g' ^
1 e+ d. l/ T* C! ^5 D# v1 B' V# T% d
#include <reg52.h>
; b2 A: ~$ c. \# F2 ^
#include <intrins.h>
% L* D2 v5 f. |
typedef unsigned char uchar;
1 R1 T& f0 G( W3 |' C: W' M. O2 p
typedef unsigned char uint;
8 g6 F! \2 ^) O! L; D3 O) @
//****************************************IO端口定义***************************************
5 [" b, R: u4 ^
; G m# d9 ^' ^6 w4 z
sbit MISO =P2^0;
6 ~# l R$ E* o
sbit MOSI =P2^4;
: o2 g; ~" N, a6 u& B+ ?9 C' {( H8 l
sbit SCK =P2^1;
! v: l$ Q8 k% o X, z' V% F' S
sbit CE =P2^2;
! ?( _# a& S* ^3 \% b6 g. E3 b% h
sbit CSN =P3^3;
0 i+ u6 z9 S9 n Q9 c8 K1 K. y7 L
sbit IRQ =P2^5;
& X5 r! f# i9 j( H% t# R& N
sbit
LED
= P0^0;
4 X/ a5 u1 v: p0 z* x
3 V* T: K) z" o8 v% @6 j+ {
//*********************************************NRF24L01*************************************
J/ |: o- t" K. f8 s
#define TX_ADR_WIDTH 5 // 5 uints TX address width
; N1 W8 v p# `& e- c2 _ g& b
#define RX_ADR_WIDTH 5 // 5 uints RX address width
! ~1 p. v; V' u% w
#define TX_PLOAD_WIDTH 20 // 20 uints TX payload
# x* l0 `6 u1 I4 y' C5 p- `
#define RX_PLOAD_WIDTH 20 // 20 uints TX payload
' V: U, N. C# i* Q. \. ^
& |* }/ O8 i8 v+ S
//***************************************NRF24L01寄存器
指令
*******************************************************
6 r7 D" b3 A0 h, r# S( a: c
#define READ_REG 0x00 // 读寄存器指令
( a" T/ b3 d+ D7 r3 x5 O& t/ p) s0 x" [
#define WRITE_REG 0x20 // 写寄存器指令
6 T0 `- t/ e/ p1 C. }
#define RD_RX_PLOAD 0x61 // 读取接收数据指令
8 F- l) h5 `# @
#define WR_TX_PLOAD 0xA0 // 写待发数据指令
9 p- l/ A# W5 U9 i* \
#define FLUSH_TX 0xE1 // 冲洗发送 F
IF
O指令
# \; Y2 ~3 V* m% U
#define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令
1 J$ {& {6 b+ S$ }) B/ i- ~
#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令
8 @. S v) C" M
#define NOP 0xFF // 保留
1 t: S9 P& H5 t, }9 i7 P8 j1 o
//*************************************SPI(nRF24L01)寄存器地址****************************************************
+ [3 ]3 W# T6 d% H3 |% B& d7 K8 V
#define CONFIG 0x00 // 配置收发状态,
crc校验
模式以及收发状态响应方式
5 h! ~, g+ Q+ r% C; v Q& b1 E
#define EN_AA 0x01 // 自动应答功能设置
; h8 e% y# r% `& I5 Y
#define EN_RXADDR 0x02 // 可用信道设置
8 A f3 l* v- g5 }1 |8 d; F0 a
#define SETUP_AW 0x03 // 收发地址宽度设置
( l& c) P b ]+ W' W
#define SETUP_RETR 0x04 // 自动重发功能设置
& K$ T: ~7 W4 K# z
#define RF_CH 0x05 // 工作
频率
设置
% o: q. k% ]2 I( l
#define RF_SETUP 0x06 // 发射速率、功耗功能设置
( D* z& [! \1 ^5 x
#define STATUS 0x07 // 状态寄存器
' r+ u6 k1 ^; G {# R- I
#define OBSERVE_TX 0x08 // 发送监测功能
! V' ]! h1 }+ W+ Y7 C
#define CD 0x09 // 地址检测
9 ?; [2 I8 W' f7 k8 K2 C; P
#define RX_ADDR_P0 0x0A // 频道0接收数据地址
% [, D0 b* Y# C) @
#define RX_ADDR_P1 0x0B // 频道1接收数据地址
: X# K+ w8 W8 P
#define RX_ADDR_P2 0x0C // 频道2接收数据地址
- ?/ H# q, V/ j1 s4 K6 _0 g0 v4 ]
#define RX_ADDR_P3 0x0D // 频道3接收数据地址
; s) G) J) z' Y4 {! Y+ r
#define RX_ADDR_P4 0x0E // 频道4接收数据地址
& y/ x& a- p0 F6 N( O
#define RX_ADDR_P5 0x0F // 频道5接收数据地址
) F8 d# l, w5 n5 z* f) k) D' ^% V4 U( W k
#define TX_ADDR 0x10 // 发送地址寄存器
2 u" s/ U, u" F7 m
#define RX_PW_P0 0x11 // 接收频道0接收数据长度
# @ `/ F g& \" A0 X. M
#define RX_PW_P1 0x12 // 接收频道0接收数据长度
5 B O% a3 p1 S
#define RX_PW_P2 0x13 // 接收频道0接收数据长度
+ f8 h$ T/ [ |) \
#define RX_PW_P3 0x14 // 接收频道0接收数据长度
9 v" w c- h% Y& U
#define RX_PW_P4 0x15 // 接收频道0接收数据长度
; ^% E, o4 ^- c7 M
#define RX_PW_P5 0x16 // 接收频道0接收数据长度
_( P$ G: h& l/ i! T
#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置
( d4 K3 v M! S8 e2 w: t
//**************************************************************************************
1 @9 Y: r- D. X* q0 c/ y' ?5 @
void Delay(unsigned int x);
8 \7 Q, K& a1 Y- e5 ]: B7 D8 I9 `1 U, J
void InerDelay_us(unsigned char n);
/ e( R' O, Y$ f: A
void Init_NRF24L01(void);
. f; V p* r! c8 _; e, \1 S. W" y0 M
uint SPI_RW(uint uchar);
0 c, M) m! T6 H+ R
uchar SPI_Read(uchar reg);
1 {8 n" k+ U) ]8 e( ^7 M9 h
void SetRX_Mode(void);
- Q/ w- E+ b! y6 _8 u6 q* T e
uint SPI_RW_Reg(uchar reg, uchar value);
! ?# h. j! f: ?# U9 C. U
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
9 A" D! A! V" P; F' j" _
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
8 b$ j7 j5 Z0 a+ Q T; ?
unsigned char NRF24L01_RxPacket(unsigned char* rx_buf);
, }: ~/ Y6 l$ W+ a
' k9 a6 U8 R$ J( P
//******************************************************************************************
+ e" q9 u$ o0 Q; b% `6 Q" q
uint bdata sta; //状态标志
, d; O: S# o C- \' t
sbit RX_DR =sta^6;
" V7 h" V1 F, X
sbit TX_DS =sta^5;
, I! G1 \6 i+ z) X! r- F
sbit MAX_RT =sta^4;
' k. g# B( S7 \+ n' t
( T* U0 H. l) W% t/ t8 z6 \% @2 q2 W
uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //发送出去的地址
. n. M# p; i* U$ t
/******************************************************************************************
0 d9 e; {: j$ V/ j4 R
/*延时函数
, _% W0 V8 K4 G4 n3 F& d' D
/******************************************************************************************/
8 R, A4 `8 B V* \9 Q& T# O9 p
void InerDelay_us(unsigned char n)
& }! l+ P0 O O C. g* F! I
{
3 Y# Q4 r+ c# @. p7 c+ ^
for(;n>0;n--)
" \/ x+ K7 {" p5 o
{
- L6 M5 I7 P& l+ ?% B
_nop_();
1 ~: N( u. J& ~" r
}
" d0 t, s4 j# Y
}
2 q1 _" w; P7 j) ]; @" ^$ q! b
9 p6 D& N3 f- p/ ^) F
//*****************************************长延时*****************************************
4 {: S7 }, Q( f2 p
void Delay(unsigned int x)
3 R% Y7 T/ a9 G2 Q/ X
{
1 x; t# o) n8 S. r
unsigned int i,j;
1 ]" Y* V+ |1 m. f: m( J; w+ s5 c# G \
for(i=x; i>0; i--)
- [! y) v3 i4 V
{
' p# [: z5 f; W; n" {) l4 H3 \9 a
for(j=110; j>0; j--);
# q2 X3 a; N* Y
}
1 O g% w, c) s& \* n
}
}3 H& c2 N4 |% s
! T I6 k# i0 P* `4 q6 a6 v
/****************************************************************************************
# d3 Y$ G T* O2 @
/*NRF24L01初始化
, ]. h) b- a( } h% ]
//***************************************************************************************/
" h0 q5 s |$ ~ i
void Init_NRF24L01(void)
o0 Y! j& I2 w
{
% E* ?& E5 y! k A) c; T' ]; g
InerDelay_us(100);
# D( E4 n* I0 h+ m7 s$ ^8 c2 `% A
CE=0;
; u* Y0 V1 k8 f, M
CSN=1;
: R: k9 M# d, X/ w( U
SCK=0;
4 I0 l# y# G# q
IRQ=1;
# x% n( O3 F* a" w
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写发送端地址
( S8 k/ w1 _( a- `+ Y
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); // 写自动应答频道0地址
6 h9 b1 r! z. A0 j
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); // 频道0自动 ACK应答禁止 1
0 v; y: z, r4 T& k0 z2 Y) r, O5 f
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00); // 频道0接收禁止 2
3 M# A% k5 M' R( i/ X" B; w% F
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00); //禁止自动重发 3 调试时注意这三点
4 i9 F5 ?0 Q2 C+ a: l7 x) K9 c
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致
+ ]) i" Q& Y1 E- U" s
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
0 O+ a/ s. o1 U* p; ^
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为2MHZ,发射功率为最大值0dB
2 f4 a2 c! ~+ n
}
6 t! o9 ?- j4 g
! P# D3 ? }' ~! t& l" y. a! x
/****************************************************************************************************
. @- i! ] u& n8 M1 h( D
/*函数:uint SPI_RW(uint uchar)
- ]2 q" S3 f: l& |, P
/*功能:NRF24L01的SPI写时序
& c8 f0 s7 R. F% {2 B4 Y! Y
/****************************************************************************************************/
2 D* B8 S+ }, Z: ^2 U5 j
uint SPI_RW(uint uuchar)
^2 F# F3 f/ i, ?: ^
{
+ p# J# ]) s$ h: S8 n
uint bit_ctr;
% A1 c4 m' o, [
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
% W. E; l: G; ]& {/ ^( b
{
' m+ {: _) M/ }5 ^ ~, s
MOSI = (uuchar & 0x80); // output 'uchar', MSB to MOSI
) |! g. N0 z( ?, o2 Q
uuchar = (uuchar << 1); // shift next bit into MSB..
0 v6 a5 g$ ^+ ^& Z3 ~# {
SCK = 1; // Set SCK high..
: u) g0 \$ ]& `4 D; H6 u: a
uuchar |= MISO; // capture current MISO bit
% `! _% x6 F+ z- b# R. Z% X! c
SCK = 0; // ..then set SCK low again
; A( m2 X0 X6 c# p
}
* ^ D. k# h0 l/ D
return(uuchar); // return read uchar
! k4 ?9 v- N v0 V# A# e' [
}
. H; M2 D* L- u: N
; I g' S: [5 d8 A, ~+ j3 Y
/****************************************************************************************************
9 v" W; D% f7 r/ o
/*函数:uchar SPI_Read(uchar reg)
9 r5 W! D% T. T' r- V3 P4 f: n* C
/*功能:NRF24L01的SPI时序
8 [( K" h: K; A8 X) L2 P/ S
/****************************************************************************************************/
8 @4 @: G6 K, s
uchar SPI_Read(uchar reg)
& l& B0 \0 f+ o- D& v( @4 K- L
{
4 x% l8 t. c0 h- g+ S
uchar reg_val;
/ A$ }( Z' b3 t$ }$ T
" K0 ^* D% I* D8 [& R; ~
CSN = 0; // CSN low, ini
ti
alize SPI communication...
9 h( `; S0 q1 m% r( b! Q
SPI_RW(reg); // Select register to read from..
4 e7 T" _% U! e& K& J6 I
reg_val = SPI_RW(0); // ..then read registervalue
3 m0 [( w( ]$ H- ^( J
CSN = 1; // CSN high, terminate SPI communication
) N/ X" ^. P( B' ~
, t1 O0 ~" P- u' r7 |# X# v
return(reg_val); // return register value
. g: b) G1 Y* [
}
. x F- M2 [7 @
" w8 F3 D. {. `5 G, e! w0 u
/****************************************************************************************************/
* f! g8 n" ?1 b
/*功能:NRF24L01读写寄存器函数
2 ]" E$ t9 @% @5 g% h/ U/ S
/****************************************************************************************************/
. v' M. g- [- p3 P5 E. e. ~: W
uint SPI_RW_Reg(uchar reg, uchar value)
, |5 c0 h' ?& s3 h6 e" v4 \
{
- Z2 W( [6 V$ U' l' ~: `% k7 X# }
uint status;
) p- ]6 W% U% V# N: v% p8 o
, {# O3 y( }- w0 d5 h/ d
CSN = 0; // CSN low, init SPI t
ransac
tion
k6 Y/ o9 s' z
status = SPI_RW(reg); // select register
1 C( V ^$ W9 m
SPI_RW(value); // ..and write value to it..
# T Y5 {4 t) [# e4 s7 U
CSN = 1; // CSN high again
( u7 ]( u& s; H: n$ E/ h. D
# p9 Z+ f+ Q. y& |2 V
return(status); // return nRF24L01 status uchar
0 }" ?$ x) r. O3 d. v
}
4 \% J2 s" @, p( e s o$ {
. ]6 g0 T: C; o [4 P5 Z
/*********************************************************************************************************
+ G5 C6 R. l f% u5 Y- v
/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
1 w3 e+ y: E0 p2 \# o2 E
/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
3 X; D% B& F/ I, _
/*********************************************************************************************************/
4 k& d' C! K* S" d o5 [
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
& R0 w' B( r+ D m
{
. c9 M$ T* L& S
uint status,uchar_ctr;
9 o" A. V! ]8 ]7 v
, a: G/ O3 }' b7 E$ k0 o& b
CSN = 0; //SPI使能
' W- r3 @: J+ J0 n* U
status = SPI_RW(reg);
8 V% }6 {5 k% J
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
$ T2 o/ Y% `5 G/ _5 t
{
' [% V! { E" a$ a% ? S
SPI_RW(*pBuf++);
1 M0 ?, l. P; i+ I3 O7 F0 v
}
2 s' z4 T9 d p0 A; ?: d4 h1 o0 t1 w
CSN = 1; //关闭SPI
1 \" S9 Z+ X3 Z: a) M
return(status); //
/ i2 Y9 f6 Y5 t3 v
}
5 a! u9 w( x" [
& y5 i" h0 T2 z4 v! ~$ |
/***********************************************************************************************************
4 e7 }7 Z, v' Z8 K7 t- o
/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
6 w- w f; J$ S
/*功能:发送 tx_buf中数据
5 ^. k% L6 A4 [% |% W4 Y0 y
/**********************************************************************************************************/
, U0 _& G6 j! a/ a4 j( E4 y
void nRF24L01_TxPacket(unsigned char * tx_buf)
/ Y7 _, f+ |4 B8 L& x) ^! D9 @7 @) d
{
- i% w1 a3 e7 J# H0 F0 G
CE = 0; //StandBy I模式
. w$ A% E( l% v3 G) L2 ~9 W4 b
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据
7 j/ Q0 k! Y! |9 u
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送
" s* N, U: s0 l: Y0 t
CE = 1; //置高CE,激发数据发送
. X+ u9 R& I k( _5 Z1 u
InerDelay_us(50);
4 y8 m6 _0 O; E
}
3 d( w4 T6 _' p5 i+ U, m# U7 L
+ ^6 n" b" |/ Z* r- @
//************************************主函数************************************************************
6 L" y9 w6 g/ ]- k
void main()
/ l2 c$ D/ z$ v/ Y
{
: J9 {9 a8 e7 G+ `! l+ u
unsigned char TxBuf[20]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,
, u9 l0 ]3 s, R& O% S/ w4 n
0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20};
[) _ T5 ?* g; A5 d
Init_NRF24L01();
! ^- A7 i& h( `& ~2 H
nRF24L01_TxPacket(TxBuf);
2 D: n2 M2 H7 s8 S" |# e
while(1)
9 a. X. o0 c2 y4 a3 P) I$ k, W8 q/ k: Y
{
$ s# t9 E2 Y+ O( }
nRF24L01_TxPacket(TxBuf);
) l( ?* a* i3 t3 z6 G0 U, A; ~
sta = SPI_Read(STATUS);
7 z- `& ^4 Z1 {- c) }: r
if(sta == 0x2e) //查看是否发送成功
9 {3 J( o, M4 ?" K' [! ^2 J/ m
{
6 J& v2 x: h7 `& f) U; T( D
P1 = 0xfe;
, N4 y' n% @4 V# G+ i' j+ D' v
}
& T- K: m3 h- a2 d8 u
SPI_RW_Reg(WRITE_REG+STATUS,0XFF); //清状态寄存器
/ y6 e0 u; g8 _# h% R+ T+ k& A
Delay(1000); //延时
c5 W) b8 T) j- ~) k
}
% q; W! i, q' k. |4 O1 O
}
, H$ C! X3 S0 {, L! ?
*
* m Q( r4 C. ^% U8 @4 [% V
, }! h; B* W9 T/ `" G
作者:
aarom
时间:
2019-11-12 15:29
提示:
作者被禁止或删除 内容自动屏蔽
作者:
hyz12888
时间:
2019-11-13 08:24
:hug::hug::hug:
作者:
无聊搞飞机
时间:
2019-11-16 23:02
搞个仪器先确认硬件吧!
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2