标题:
关于nrf24l01的入门级简单应用,求教
[打印本页]
作者:
Julia123
时间:
2020-4-21 16:06
标题:
关于nrf24l01的入门级简单应用,求教
因本人还是小白,想用简单的按键来实现nrf24l01通信。按下按键1发送0x01后led闪烁,按下按键2发送0x02后led闪烁,我在板子上运行了,只有发射方的灯会闪烁,接收方的灯没反应,想求教一下。
发送方:
<div>#include<reg52.h></div><div>#define uint unsigned int
</div>#define uchar unsigned char
sbit S1 =P1^0; //????1
sbit S2 =P1^1; //????2
sbit LED=P1^6; //??????????????
uchar Tx_Buf[32];
sbit CE =P2^0;
sbit CSN =P2^1;
sbit SCK =P2^2;
sbit MOSI =P2^3;
sbit MISO =P2^4;
sbit IRQ =P2^5;
#define TX_ADR_WIDTH 5 // 5 uints TX address width
#define RX_ADR_WIDTH 5 // 5 uints RX address width
#define TX_PLOAD_WIDTH 32 // 32 uints TX payload
#define RX_PLOAD_WIDTH 32 // 32 uints TX payload
uchar TX_ADDRESS[TX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7}; //??????
uchar RX_ADDRESS[RX_ADR_WIDTH]= {0xE7,0xE7,0xE7,0xE7,0xE7}; //??????
///***************************************NRF24L01????????*******************************************************
#define READ_REG 0x00 // ??????????
#define WRITE_REG 0x20 // д????????
#define RD_RX_PLOAD 0x61 // ??????????????
#define WR_TX_PLOAD 0xA0 // д???????????
#define FLUSH_TX 0xE1 // ??????? FIFO???
#define FLUSH_RX 0xE2 // ??????? FIFO???
#define REUSE_TX_PL 0xE3 // ?????????????????
#define NOP 0xFF // ????
///*************************************SPI(nRF24L01)????????****************************************************
#define CONFIG 0x00 // ???????????CRCУ??????????????????
#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 NRFRegSTATUS 0x07 // ???????
#define OBSERVE_TX 0x08 // ????????
#define CD 0x09 // ??????
#define RX_ADDR_P0 0x0A // ???0??????????
#define RX_ADDR_P1 0x0B // ???1??????????
#define RX_ADDR_P2 0x0C // ???2??????????
#define RX_ADDR_P3 0x0D // ???3??????????
#define RX_ADDR_P4 0x0E // ???4??????????
#define RX_ADDR_P5 0x0F // ???5??????????
#define TX_ADDR 0x10 // ???????????
#define RX_PW_P0 0x11 // ???????0???????????
#define RX_PW_P1 0x12 // ???????1???????????
#define RX_PW_P2 0x13 // ???????2???????????
#define RX_PW_P3 0x14 // ???????3???????????
#define RX_PW_P4 0x15 // ???????4???????????
#define RX_PW_P5 0x16 // ???????5???????????
#define FIFO_STATUS 0x17 // FIFO?????????????????
///*****************************???????*********************************************************
uchar NRF24SPI_Send_Byte(uchar dat);
uchar SPI_WR_Reg(uchar reg, uchar value);
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len);
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len);
uchar nRF24L01_RxPacket(unsigned char* rx_buf);
void nRF24L01_TxPacket(unsigned char * tx_buf);
uchar SPI_RD_Reg(uchar reg);
void init_NRF24L01(void);
void TX_Mode(void);
void RX_Mode(void);
void NRF_Send(void);
//----------------------------------------------
//????????[MOSI??MISO???????]
//----------------------------------------------
uchar NRF24SPI_Send_Byte(uchar dat)
{
uchar i;
for (i = 0; i < 8; i++) //output 8-bit
{
//д??1λ????
MOSI=(dat & 0x80); //output 'uchar', MSB to MOSI
dat<<= 1; // shift next bit into MSB..
//???1λ????
SCK = 1; // Set SCK high..
if (MISO){
dat|= 1;
}else{ // capture current MISO bit
dat &= 0xFE;
}
SCK = 0; // ..then set SCK low again
}
return(dat); // return read uchar
}
//----------------------------------------------
//???n??10us
//----------------------------------------------
void Delay_n10us(uint n)
{
for(;n>0;n--)
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
}
//----------------------------------------------
//NRF24L01?????
//----------------------------------------------
void init_NRF24L01(void)
{
Delay_n10us(10);
CE = 0; // chip enable
CSN= 1; // Spi disable
SCK=0; //??????????д
IRQ=1; //?ж??λ
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // д??????
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // д???????
SPI_WR_Reg(WRITE_REG + EN_AA, 0x01); // ???0??? ACK???????
SPI_WR_Reg(WRITE_REG + EN_RXADDR, 0x01); // ???????????????0?????????????????ο?Page21
SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0x1a); // ???????????????????500us + 86us, 10 retrans...
SPI_WR_Reg(WRITE_REG + RF_CH, 22); // ????????????2.4GHZ????????????
SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //???y????????????????????32???
SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x07); //???÷????????1MHZ?????书???????0dB
// SPI_RD_Reg(WRITE_REG + EN_AA);
// SPI_RD_Reg(WRITE_REG + EN_RXADDR);
// SPI_RD_Reg(WRITE_REG + RF_CH);
// SPI_RD_Reg(WRITE_REG + RX_PW_P0);
// SPI_RD_Reg(WRITE_REG + RF_SETUP);
}
//----------------------------------------------
//??????uchar SPI_Read(uchar reg)
//?????NRF24L01??SPI???,?????????????????
//----------------------------------------------
uchar SPI_RD_Reg(uchar reg)
{
uchar reg_val;
CSN = 0; // CSN low, initialize SPI communication...
NRF24SPI_Send_Byte(reg); // Select register to read from..
reg_val = NRF24SPI_Send_Byte(0); // ..then read registervalue
CSN = 1; // CSN high, terminate SPI communication
return(reg_val); // return register value
}
//----------------------------------------------
//??????uchar SPI_Write(uchar reg)
//?????NRF24L01??SPI???,д????????????????
//----------------------------------------------
uchar SPI_WR_Reg(uchar reg, uchar value)
{
uchar status;
CSN = 0; // CSN low, init SPI transaction
status = NRF24SPI_Send_Byte(reg); // select register
NRF24SPI_Send_Byte(value); // ..and write value to it..
CSN = 1; // CSN high again
return(status); // return nRF24L01 status uchar
}
//----------------------------------------------
//??????uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len)
//????: ?????????
//??????reg???????????
// pBuf???????????????
// uchars??????????????
//----------------------------------------------
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar Len)
{
uint status,i;
CSN = 0; // Set CSN low, init SPI tranaction
status = NRF24SPI_Send_Byte(reg); // Select register to write to and read status uchar
for(i=0;i<Len;i++){
pBuf[i] = NRF24SPI_Send_Byte(0);
}
CSN = 1;
return(status); // return nRF24L01 status uchar
}
//----------------------------------------------
//??????uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len)
//????: ????д????
//??????reg:?????????
// pBuf?????д????????
// uchars??д??????????
//----------------------------------------------
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar Len)
{
uint status,i;
CSN = 0; //SPI???
status = NRF24SPI_Send_Byte(reg);
for(i=0; i<Len; i++){
NRF24SPI_Send_Byte(*pBuf);
pBuf ++;
}
CSN = 1; //???SPI
return(status);
}
//----------------------------------------------
//??????void SetRX_Mode(void)
//????????????????
//----------------------------------------------
void RX_Mode(void)
{
CE = 0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // д??????
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // д???????
SPI_WR_Reg(WRITE_REG + EN_AA, 0x01); //???0??? ACK???????
SPI_WR_Reg(WRITE_REG + EN_RXADDR,0x01); //???????????????0?????????????????ο?Page21
SPI_WR_Reg(WRITE_REG + SETUP_RETR,0x1a); //???????????????????500us + 86us, 10 retrans...
SPI_WR_Reg(WRITE_REG + RF_CH, 0x40); //????????????2.4GHZ????????????
SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //???y????????????????????32???
SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x0F); //???÷????????2MHZ?????书???????0dB
SPI_WR_Reg(WRITE_REG + CONFIG, 0x0F);
CE = 1;
Delay_n10us(20); //200us
}
//----------------------------------------------
//??????unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
//????????????????rx_buf???????????
//----------------------------------------------
uchar nRF24L01_RxPacket(unsigned char* rx_buf)
{
uchar flag=0;
uchar status;
status=SPI_RD_Reg(NRFRegSTATUS); //?????????????ж???????????
if(status & 0x40) //?ж????????????
{
CE=0; //SPI???
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH); // read receive payload from RX_FIFO buffer
flag =1; //????????????
}
SPI_WR_Reg(WRITE_REG+NRFRegSTATUS, status); //??????????RX_DR,TX_DS,MAX_RT??????1?????д1??????ж???
return flag;
}
//----------------------------------------------
//??????void TX_Mode(void)
//????????????????
//----------------------------------------------
void TX_Mode(void)
{
CE = 0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // д??????
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // д???????
SPI_WR_Reg(WRITE_REG + EN_AA, 0x01); // ???0??? ACK???????
SPI_WR_Reg(WRITE_REG + EN_RXADDR, 0x01); // ???????????????0?????????????????ο?Page21
SPI_WR_Reg(WRITE_REG + SETUP_RETR, 0x1a); // ???????????????????500us + 86us, 10 retrans...
SPI_WR_Reg(WRITE_REG + RF_CH, 0x40); // ????????????2.4GHZ????????????
SPI_WR_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //???y????????????????????32???
SPI_WR_Reg(WRITE_REG + RF_SETUP, 0x0F); //???÷????????2MHZ?????书???????0dB
SPI_WR_Reg(WRITE_REG + CONFIG, 0x0E); // CRC????16λCRCУ?飬???
CE = 1;
}
//----------------------------------------------
//??????void nRF24L01_TxPacket(unsigned char * tx_buf)
//?????????tx_buf??????
//----------------------------------------------
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
CE = 0; //StandBy I??
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // ?????????
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // ???????
CE = 1; //???CE?????????????
}
void delay10ms(void) //?????????10ms
{
uchar x,y;
for(x=0;x<100;x++)
for(y=0;y<100;y++)
;
}
//??????
void main()
{
LED=1; //????????
init_NRF24L01(); //?????
Tx_Buf[0]=0;
while(1)
{
P1=0xff;
if((P1&0x0f)!=0x0f) //????м?????
{
delay10ms(); //???10ms??????
if(S1==0) //????1??????
{
TX_Mode(); //??????
Tx_Buf[0]=0x01;
nRF24L01_TxPacket(Tx_Buf); //????????????24L01
LED=0;
delay10ms();
LED=1;
delay10ms(); //?????LED1?????
}
if(S2==0) //????2??????
{
TX_Mode(); //??????
Tx_Buf[0]=0x01;
nRF24L01_TxPacket(Tx_Buf); //????????????24L01
LED=0;
delay10ms();
LED=1;
delay10ms(); //?????LED1?????
}
}
<div> }</div><div>}
</div>
复制代码
作者:
51hei**1140
时间:
2020-4-21 18:14
你好!
NRF24L01 调试本身就比较麻烦;
模块正常运行配置的参数有点多;
所以在调试的时候,要有点耐心;
程序应该你从网上找的吧;
逐段去理解分析吧。
作者:
Julia123
时间:
2020-4-24 09:27
本帖最后由 Julia123 于 2020-4-24 13:27 编辑
接收方可以接到数据了,可是为什么要发送方按好几次按键接收方的灯才会亮呢 有时候又按好多下也亮不了 是会丢失数据吗
作者:
f556
时间:
2020-4-24 16:57
丢失数据是可能的,但据你描述,估计RX端处理LED的程序不一定正确,试理一下思路。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1