本人剛剛學(xué)nrf24l01想弄一個(gè)簡(jiǎn)單的程序試一下,程序的功能是按下一塊開(kāi)放板的按鍵另一塊開(kāi)放板的蜂鳴器就響,可是就是不成功,已經(jīng)調(diào)試了兩周了,就是找不出問(wèn)題所在,求大神指教!
程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
//*********************************************NRF24L01*************************************
#define TX_ADR_WIDTH 5
#define RX_ADR_WIDTH 5
#define TX_PLOAD_WIDTH 20
#define RX_PLOAD_WIDTH 20
uchar const TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};
uchar rx_buf[TX_PLOAD_WIDTH];
uchar tx_buf[RX_PLOAD_WIDTH];
//****************************************IO端口定義***************************************
sbit IRQ=P1^3;
sbit CE=P1^4;
sbit MOSI=P1^5;
sbit SCK=P1^6;
sbit MISO=P1^7;
sbit CSN=P3^3;
sbit k1=P3^4;
sbit k2=P3^5;
sbit beep=P2^3;
//***************************************NRF24L01寄存器指令*******************************************************
#define READ_REG 0x00
#define WRITE_REG 0x20
#define RD_RX_PLOAD 0x61
#define WR_TX_PLOAD 0xa0
#define FLUSH_TX 0xe1
#define FLUSH_RX 0xe2
#define REUSE_TX_PL 0xe3
#define NOP 0Xff
//*************************************SPI(nRF24L01)寄存器地址****************************************************
#define CONFIG 0x00
#define EN_AA 0x01
#define EN_RXADDR 0x02
#define SETUP_AW 0x03
#define SETUP_RETR 0x04
#define RF_CH 0x05
#define RF_SETUP 0x06
#define STATUS 0x07
#define OBSERVE_TX 0x08
#define CD 0x09
#define RX_ADDR_P0 0x0a
#define RX_ADDR_P1 0x0b
#define RX_ADDR_P2 0x0c
#define RX_ADDR_P3 0x0d
#define RX_ADDR_P4 0x0e
#define RX_ADDR_P5 0x0f
#define TX_ADDR 0x10
#define RX_RW_P0 0x11
#define RX_RW_P1 0x12
#define RX_RW_P2 0x13
#define RX_RW_P3 0x14
#define RX_RW_P4 0x15
#define RX_RW_P5 0x16
#define FIFO_STASTUS 0x17
//******************************************************************************************
uchar bdata sta ;
sbit RX_DR=sta^6;
sbit TX_DS=sta^5;
sbit MAX_RT=sta^4;
/******************************************************************************************
/*延時(shí)函數(shù)
/******************************************************************************************/
void inerDelay_us(uchar n)
{
for(;n>0;n--)
_nop_();
}
void delay()
{
uchar i,j;
for(j=20;j>0;j--)
for(i=248;i>0;i--);
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
void init_io(void)
{
inerDelay_us(100);
CE=0;
CSN=1;
SCK=0;
}
/****************************************************************************************************
/*函數(shù):uint SPI_RW(uchar byte)
/*功能:NRF24L01的SPI寫(xiě)時(shí)序
/****************************************************************************************************/
uchar SPI_RW(uchar byte)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI=(byte&0x80);
byte=(byte<<1);
SCK=1;
byte|=MISO;
SCK=0;
}
return(byte);
}
/****************************************************************************************************/
/*功能:NRF24L01讀寫(xiě)寄存器函數(shù)
/****************************************************************************************************/
uchar SPI_RW_Reg(uchar reg,uchar value)
{
uchar status;
CSN=0;
status=SPI_RW(reg);
SPI_RW(value);
CSN=1;
return(status);
}
/****************************************************************************************************
/*函數(shù):uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI時(shí)序
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN=0;
SPI_RW(reg);
reg_val=SPI_RW(0);
CSN=1;
return(reg_val);
}
/****************************************************************************************************/
/*函數(shù):uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
/*功能: 用于讀數(shù)據(jù),reg:為寄存器地址,pBuf:為待讀出數(shù)據(jù)地址,bytes:讀出數(shù)據(jù)的個(gè)數(shù)
/****************************************************************************************************/
uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes)
{
uchar status, i;
CSN = 0; // CSN置低,開(kāi)始傳輸數(shù)據(jù)
status = SPI_RW(reg); // 選擇寄存器,同時(shí)返回狀態(tài)字
for(i=0; i<bytes; i++)
pBuf = SPI_RW(0); // 逐個(gè)字節(jié)從nRF24L01讀出
CSN = 1; // CSN拉高,結(jié)束數(shù)據(jù)傳輸
return(status); // 返回狀態(tài)寄存器
}
/*********************************************************************************************************
/*函數(shù):uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于寫(xiě)數(shù)據(jù):為寄存器地址,pBuf:為待寫(xiě)入數(shù)據(jù)地址,uchars:寫(xiě)入數(shù)據(jù)的個(gè)數(shù)
/*********************************************************************************************************/
uchar SPI_Write_Buf(uchar reg,uchar *pBuf,uchar uchars)
{
uchar status,uchar_ctr;
CSN=0;
status=SPI_RW(reg);
for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
SPI_RW(*pBuf++);
CSN=1;
return(status);
}
/****************************************************************************************************/
/*函數(shù):void RX_Mode(void)
/*功能:數(shù)據(jù)接收配置
/****************************************************************************************************/
void RX_Mode(void)
{
CE=0;
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
SPI_RW_Reg(WRITE_REG+EN_AA,0x01);
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
SPI_RW_Reg(WRITE_REG+RF_CH,0x40);
SPI_RW_Reg(WRITE_REG+RX_RW_P0,TX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);
CE=1;
inerDelay_us(130);
}
/***********************************************************************************************************
/*函數(shù):void nRF24L01_TxPacket(uchar * tx_buf)
/*功能:發(fā)送 tx_buf中數(shù)據(jù)
/**********************************************************************************************************/
/*
void nRF24L01_TxPacket(uchar *tx_buf)
{
CE=0;
SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+EN_AA,0x01);
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x1a);
SPI_RW_Reg(WRITE_REG+RF_CH,0x40);
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);
CE=1;
inerDelay_us(10);
sta=SPI_Read(STATUS);
SPI_RW_Reg(WRITE_REG+STATUS,sta);
}
/******************************************************************************************************/
/*函數(shù):unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:數(shù)據(jù)讀取后放如rx_buf接收緩沖區(qū)中
/******************************************************************************************************/
uchar nRF24L01_RxPacket(uchar *rx_buf)
{
uchar revale=0;
sta=SPI_Read(STATUS);
if(RX_DR)
{
CE=0;
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
revale=1;
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);
return revale;
}
//************************************主函數(shù)************************************************************
main()
{
init_io();
RX_Mode();
while(1)
{
if(k1==0)
{
delay();
if(k1==0)
{
tx_buf[0]=1;
nRF24L01_TxPacket(tx_buf);
}}
nRF24L01_RxPacket(rx_buf);
if(rx_buf[0]==1)
beep=0;
if(k2==0)
{
delay();
if(k2==0)
{
rx_buf[0]=0;
beep=1;
}}
}
}
|