微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 为什么nRF24L01TX发送不了,响应staa一直都是零。求大神指点

为什么nRF24L01TX发送不了,响应staa一直都是零。求大神指点

时间:10-02 整理:3721RD 点击:
用的是XS128芯片,看了程序没什么问题,响应一直是零呢?
#include <hidef.h>      
#include "derivative.h"   

typedef unsigned char uchar;
typedef unsigned int  uint;
//****************************************IO端口定义***************************************
#define   CE         PORTA_PA0
#define   CSN  PORTA_PA1        
#define         SCK         PORTA_PA2
#define         MOSI PORTA_PA3
#define   MISO PORTA_PA4
#define         IRQ         PORTA_PA5
//*********************************************NRF24L01*************************************
#define   TX_ADR_WIDTH    5           // 5 uints TX address width
#define   RX_ADR_WIDTH    5           // 5 uints RX address width
#define   TX_PLOAD_WIDTH  2          // 20 uints TX payload
#define   RX_PLOAD_WIDTH  2          // 20 uints TX payload
uint      TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
uint      RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
//***************************************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   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   RX_DR           0x40&sta
#define   TX_DS           0x20&sta
#define   MAX_RT          0x10&sta
uchar TxBuf[2]={0x00,0x00};
uchar staa;
//*************************************************************************************
void   init_NRF24L01(void);
uint   SPI_RW(uint data);
uchar  SPI_Read(uchar reg);         
uint   SPI_RW_Reg(uchar reg, uchar value);
uint   SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);//本地寄存器读写
uint   SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
void   SetRX_Mode(void);
uchar  nRF24L01_RxPacket(uchar rx_buf);
void   nRF24L01_TxPacket(uchar  tx_buf);

/******************************************************************************************/
/*uint         bdata sta;   //状态标志
sbit        RX_DR        =sta^6;
sbit        TX_DS        =sta^5;
sbit        MAX_RT        =sta^4; */
uchar sta;

//*****************************************长延时*****************************************
void Delay(uint s)
{
  uint i;
        for(i=0; i<s; i++);
        for(i=0; i<s; i++);
}
//****************************************IO初始化***************************************
void IO_init()
{
DDRA_DDRA0=1;
DDRA_DDRA1=1;
DDRA_DDRA2=1;
DDRA_DDRA3=1;
DDRA_DDRA4=0;
DDRA_DDRA5=0;
DDRK_DDRK0=0;
DDRK_DDRK1=0;
}

//****************************************************************************************
//NRF24L01初始化

void init_NRF24L01(void)
{
  Delay(100);
         CE=0;                   // chip enable
         CSN=1;                  // Spi disable
         SCK=0;                  // Spi clockline init high
        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_RW_Reg(WRITE_REG + EN_AA, 0x01);                               // 频道0自动        ACK应答允许        
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);                           // 允许接收地址只有频道0,如果需要多频道可以参考Page21  
        SPI_RW_Reg(WRITE_REG + RF_CH, 0);                                  // 设置信道工作为2.4GHZ,收发必须一致
        SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);                  // 设置接收数据长度,本次设置为32字节
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                                  // 设置发射速率为1MHZ,发射功率为最大值0dB        
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                                          // IRQ收发完成中断响应,16位CRC,主发送
}


//***************************************************************************************************
////功能:NRF24L01的SPI写时序    // 写和读
uint SPI_RW(uint data)
{
        uint bit;
           for(bit=0;bit<8;bit++) // output 8-bit
           {
                MOSI = (data & 0x80);         // output 'data', MSB to MOSI    把后面的7位全变零,第一位保留
          data = (data << 1);           // shift next bit into MSB..
                SCK = 1;                      // Set SCK high..
                data|= MISO;                               // capture current MISO bit               //写入同时读出都存在unchar中
                SCK = 0;                                  // ..then set SCK low again
           }
    return(data);                             // return read data
}

//****************************************************************************************************
//功能:NRF24L01的SPI时序  //只读
uchar SPI_Read(uchar reg)
{
        uchar reg_val;
        
        CSN = 0;                // CSN low, initialize SPI communication...
        SPI_RW(reg);            // Select register to read from..                //   发零读寄存器
        reg_val = SPI_RW(0);    // ..then read registervalue   发8个零过去
        CSN = 1;                // CSN high, terminate SPI communication
        
        return(reg_val);        // return register value
}



//****************************************************************************************************
//功能:NRF24L01读写寄存器函数 只是读写寄存器。
uint SPI_RW_Reg(uchar reg, uchar value)
{
        uint status;
        
        CSN = 0;                   // CSN low, init SPI transaction
        status = SPI_RW(reg);      // select register               //读寄存器
        SPI_RW(value);             // ..and write value to it..     //再写进去
        CSN = 1;                   // CSN high again
        
        return(status);            // return nRF24L01 status uchar
}

//***************************************************************************************************
//功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数   
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
        uint status,uchar_ctr;
        
        CSN = 0;                                    // Set CSN low, init SPI tranaction
        status = SPI_RW(reg);                       // Select register to write to and read status uchar
        
        for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
          {
          pBuf[uchar_ctr] = SPI_RW(0);
          }
                // 读出来全存到        pBuf[uchar_ctr] 中。
        
        CSN = 1;                           
        
        return(status);                    // return nRF24L01 status uchar
}
//********************************************************************************************************
//功能: 用于写数据:reg: 为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数      //读写寄存器
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
        uint status,uchar_ctr;
        
        CSN = 0;            //SPI使能      
        status = SPI_RW(reg);   
        for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++)
        {
          SPI_RW(*pBuf++);                               //加到这才输出一个。因为最后一个CSN才拉高
        }
        CSN = 1;           //关闭SPI
        return(status);    //
}


//***************************************************************************************************/
//功能:数据接收配置
void SetRX_Mode(void)
{
        CE=0;
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,主接收
        CE = 1;
        Delay(130);
}


//**************************************************************************************************
//功能:数据读取后放如rx_buf接收缓冲区中
unsigned char nRF24L01_RxPacket(uchar* rx_buf)
{
  uchar revale=0;
  SPI_RW_Reg(WRITE_REG + CONFIG,0X0F);
  CE=1;
  Delay(100);
        sta=SPI_Read(STATUS);        // 读取状态寄存其来判断数据接收状况
        if(RX_DR)                                // 判断是否接收到数据
         {
            CE = 0;                         //SPI使能
                SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
                revale =1;                        //读取数据完成标志
         }
        SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
        return revale;
}



//**********************************************************************************************************
//功能:发送 tx_buf中数据
void nRF24L01_TxPacket(uchar *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);                          // 装载数据        
  //        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送
        CE=1;                 //置高CE,激发数据发送
  Delay(100);
}




//************************************主函数************************************************************
void main(void)
{
  IO_init();
while(1){
init_NRF24L01();
Delay(130);
if(PORTK_PK0==0)
  {   
    Delay(10);
   if(PORTK_PK0==0)
    {
    TxBuf[1]=0x00;
     }
    while(!PORTK_PK0);
                Delay(5);
                while(!PORTK_PK0);           //按键松手时发射
                nRF24L01_TxPacket(TxBuf);
                staa=SPI_Read(READ_REG+STATUS);
                staa=staa&0x20;
                SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
        }

if(PORTK_PK1==0)
  {
    Delay(10);
    if(PORTK_PK1==0)
    {
      TxBuf[1]=0xff;
     }
    while(!PORTK_PK1);
                Delay(5);
                while(!PORTK_PK1);           //按键松手时发射
                nRF24L01_TxPacket(TxBuf);
                staa=SPI_Read(READ_REG+STATUS);
                staa=staa&0x20;
                SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
   }
        
  }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top