强烈求助!24L01的发送完成中断标志TX_DS不变化
时间:10-02
整理:3721RD
点击:
强烈求助大神们!我调24L01已有半个月,先后试了9个24L01模块,所有的结果都是一样,就是TX_DS标志不变,也说明没有发送成功,但我检测发送缓存器是空的,具体的说,发送前我检测一下STATUS寄存器值为14(10)证明没有发送成功,FIFO_STATUS寄存器的值为1(10)证明有数据,接下来检测FFO_STATUS寄存器的值为17(10)证明没有数据,而这时STATUS寄存器的值还是14(10)说明没发送成功!到到底什么情况。求大神们帮看看,谢谢啦!程序如下!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#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 // 保留
#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 STATUS 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 // 接收频道0接收数据长度
#define RX_PW_P2 0x13 // 接收频道0接收数据长度
#define RX_PW_P3 0x14 // 接收频道0接收数据长度
#define RX_PW_P4 0x15 // 接收频道0接收数据长度
#define RX_PW_P5 0x16 // 接收频道0接收数据长度
#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置
#define TX_PLOAD_WIDTH 32 // 20 uints TX payload
#define RX_PLOAD_WIDTH 32
#define TX_ADR_WIDTH 5
uchar const TX_ADDRESS[5];
uchar const RX_ADDRESS[5];
sbit dula=P2^6;
sbit wela=P2^7;
sbit lcden=P3^4;
sbit lcddo=P3^5;
sbit CE=P1^7;
sbit CSN=P1^6;
sbit SCK=P1^5;
sbit MOSI=P1^4;
sbit MISO=P1^3;
sbit IRQ=P1^2;
uchar num;
uchar str[4];
uchar *uchartostr(uchar unm)
{
uchar x00,xx,x0,x,n;
x00=unm/100;
xx=unm%100;
x0=xx/10;
x=xx%10;
n=0;
if(x00!=0)
{
str[n]=x00+48;
n++;
}
if(!(x00==0&x0==0))
{
str[n]=x0+48;
n++;
}
str[n]=x+48;
n++;
str[n]='\0';
return str;
}
uchar SPI_RW(uchar uuchar)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI=(uuchar&0x80);
uuchar=(uuchar<<1);
SCK=1;
uuchar |=MISO;
SCK=0;
}
return(uuchar);
}
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN=0;
SPI_RW(reg);
reg_val=SPI_RW(0);
CSN=1;
return(reg_val);
}
uchar SPI_RW_Reg(uchar reg,uchar value)
{
uchar status;
CSN=0;
status=SPI_RW(reg);
SPI_RW(value);
CSN=1;
return(status);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_ord(uchar ord)
{
lcddo=0;
P0=ord;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_dat(uchar dat)
{
lcddo=1;
P0=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_ord( 0x38 );
write_ord( 0x0c );
write_ord( 0x06 );
write_ord( 0x01 );
}
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);
}
void init_NRF24L01(void)
{
delay(1);
CE=0;
CSN=1;
SCK=0;
IRQ=1;
SPI_RW_Reg(WRITE_REG+EN_AA,0x00);
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x00);
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
SPI_RW_Reg(WRITE_REG+RF_CH,1);
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);
}
void nRF24L01_TxPacket(unsigned char *tx_buf)
{
CE=0;
SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);
CE=1;
delay(1);
}
void main()
{
uchar TxBuf[5]={1};
uchar status;
uchar fifo_s;
delay(100);
init_NRF24L01();
init();
while(1)
{
uchar const TX_ADDRESS[5]={0,0,0,0,0};
uchar const RX_ADDRESS[5]={0,0,0,0,0};
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
SPI_Write_Buf(WR_TX_PLOAD,TxBuf,TX_PLOAD_WIDTH);
status=SPI_Read(STATUS);
uchartostr(status);
write_ord(0x80);
for(num=0;num<2;num++)
write_dat(str[num]);
fifo_s=SPI_Read(FIFO_STATUS);
uchartostr(fifo_s);
for(num=0;num<2;num++)
write_dat(str[num]);
nRF24L01_TxPacket(TxBuf);
status=SPI_Read(STATUS);
uchartostr(status);
write_ord(0x80+0x40);
for(num=0;num<2;num++)
write_dat(str[num]);
fifo_s=SPI_Read(FIFO_STATUS);
uchartostr(fifo_s);
for(num=0;num<2;num++)
write_dat(str[num]);
delay(800);
}
}
谢谢了!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#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 // 保留
#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 STATUS 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 // 接收频道0接收数据长度
#define RX_PW_P2 0x13 // 接收频道0接收数据长度
#define RX_PW_P3 0x14 // 接收频道0接收数据长度
#define RX_PW_P4 0x15 // 接收频道0接收数据长度
#define RX_PW_P5 0x16 // 接收频道0接收数据长度
#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置
#define TX_PLOAD_WIDTH 32 // 20 uints TX payload
#define RX_PLOAD_WIDTH 32
#define TX_ADR_WIDTH 5
uchar const TX_ADDRESS[5];
uchar const RX_ADDRESS[5];
sbit dula=P2^6;
sbit wela=P2^7;
sbit lcden=P3^4;
sbit lcddo=P3^5;
sbit CE=P1^7;
sbit CSN=P1^6;
sbit SCK=P1^5;
sbit MOSI=P1^4;
sbit MISO=P1^3;
sbit IRQ=P1^2;
uchar num;
uchar str[4];
uchar *uchartostr(uchar unm)
{
uchar x00,xx,x0,x,n;
x00=unm/100;
xx=unm%100;
x0=xx/10;
x=xx%10;
n=0;
if(x00!=0)
{
str[n]=x00+48;
n++;
}
if(!(x00==0&x0==0))
{
str[n]=x0+48;
n++;
}
str[n]=x+48;
n++;
str[n]='\0';
return str;
}
uchar SPI_RW(uchar uuchar)
{
uchar bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)
{
MOSI=(uuchar&0x80);
uuchar=(uuchar<<1);
SCK=1;
uuchar |=MISO;
SCK=0;
}
return(uuchar);
}
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN=0;
SPI_RW(reg);
reg_val=SPI_RW(0);
CSN=1;
return(reg_val);
}
uchar SPI_RW_Reg(uchar reg,uchar value)
{
uchar status;
CSN=0;
status=SPI_RW(reg);
SPI_RW(value);
CSN=1;
return(status);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_ord(uchar ord)
{
lcddo=0;
P0=ord;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_dat(uchar dat)
{
lcddo=1;
P0=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_ord( 0x38 );
write_ord( 0x0c );
write_ord( 0x06 );
write_ord( 0x01 );
}
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);
}
void init_NRF24L01(void)
{
delay(1);
CE=0;
CSN=1;
SCK=0;
IRQ=1;
SPI_RW_Reg(WRITE_REG+EN_AA,0x00);
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x00);
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);
SPI_RW_Reg(WRITE_REG+RF_CH,1);
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);
}
void nRF24L01_TxPacket(unsigned char *tx_buf)
{
CE=0;
SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);
CE=1;
delay(1);
}
void main()
{
uchar TxBuf[5]={1};
uchar status;
uchar fifo_s;
delay(100);
init_NRF24L01();
init();
while(1)
{
uchar const TX_ADDRESS[5]={0,0,0,0,0};
uchar const RX_ADDRESS[5]={0,0,0,0,0};
SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
SPI_Write_Buf(WR_TX_PLOAD,TxBuf,TX_PLOAD_WIDTH);
status=SPI_Read(STATUS);
uchartostr(status);
write_ord(0x80);
for(num=0;num<2;num++)
write_dat(str[num]);
fifo_s=SPI_Read(FIFO_STATUS);
uchartostr(fifo_s);
for(num=0;num<2;num++)
write_dat(str[num]);
nRF24L01_TxPacket(TxBuf);
status=SPI_Read(STATUS);
uchartostr(status);
write_ord(0x80+0x40);
for(num=0;num<2;num++)
write_dat(str[num]);
fifo_s=SPI_Read(FIFO_STATUS);
uchartostr(fifo_s);
for(num=0;num<2;num++)
write_dat(str[num]);
delay(800);
}
}
谢谢了!
呵呵 !还是我自己解答吧!我自己做的3V电源模块不好用!以接上24L01及变成1.2V了!所以其实24L01一直没工作!呵呵!上面的程序是好使的!
你好,我也是在搞这个有问题想请教你一下可以么?
精神可嘉哦!学习学习!
非常谢谢小编,完美解答我的问题。如果有其他同学有nrf的问题,可以加我qq12412823
我的数据发送成功了,但TX_DS一直不置位,STATUS发送数据成功读出来一直是0x1e,和数据没发送成功的一样,然后弄了有一会,发现也是24L01供电电压的问题