强烈求助!!24L01的发送完成中断标志TX_DS不变化

2019-07-18 14:22发布

强烈求助大神们!我调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]='';
        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);
        }
}


谢谢了!!!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
chenming1234
1楼-- · 2019-07-18 18:56
 精彩回答 2  元偷偷看……
yo_paul
2楼-- · 2019-07-18 20:13
你好,我也是在搞这个有问题想请教你一下可以么?
weslydreamer
3楼-- · 2019-07-18 20:36
精神可嘉哦!学习学习!
Willjean臻
4楼-- · 2019-07-18 23:00
非常谢谢楼主,完美解答我的问题。如果有其他同学有nrf的问题,可以加我qq12412823
深蓝色的夜
5楼-- · 2019-07-19 02:32
我的数据发送成功了,但TX_DS一直不置位,STATUS发送数据成功读出来一直是0x1e,和数据没发送成功的一样,然后弄了有一会,发现也是24L01供电电压的问题
5000322
6楼-- · 2019-07-19 07:00
 精彩回答 2  元偷偷看……

一周热门 更多>