NRF24L01 快要崩溃了

2019-03-24 09:29发布


这里是我的程序, 实在不知道问题出在哪里,  项目需要只要传出一个信号就足够了, 就比如这边按一个按钮那边灯亮起来。
求大神指点, 我用的FR4133 launchpad     前前后后改了10来份例程,  因为现在好像没人用这块芯片 实在不知如何下手

接受程序
#include <msp430.h>
#include <driverlib.h>
#define uchar unsigned char
#define uint unsigned int

//****************************************NRF24L01 IO端口定义**************************************//
#define CE_0            P1OUT&=~BIT3
#define CE_1            P1OUT|=BIT3
#define CSN_0           P1OUT&=~BIT4
#define CSN_1           P1OUT|=BIT4
#define SCK_0           P1OUT&=~BIT5
#define SCK_1           P1OUT|=BIT5
#define MOSI_0          P1OUT&=~BIT0
#define MOSI_1          P1OUT|=BIT0
#define MISO            P1IN&BIT1
#define IRQ             P1IN&BIT6
//****************************************test_LED IO端口定义**************************************//
#define LED_0           P4OUT&=~BIT0;
#define LED_1           P4OUT|=BIT0;
//*****************************NRF24L01的接收和发送地址********************************************//
#define TX_ADR_WIDTH    5       // 5个字节的TX地址长度
#define RX_ADR_WIDTH    5       // 5个字节的RX地址长度
#define TX_PLOAD_WIDTH  16      // 16个字节的TX数据长度
#define RX_PLOAD_WIDTH  16      // 16个字节的RX数据长度
uchar  sta;                    //状态标志
uchar   RxBuf[16];         //接收缓存
uchar   TxBuf[16];         //发送缓存
uchar   TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};   //本地地址
uchar   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栈入栈出状态寄存器设置
void    init_IO_MSP430();
void    init_NRF24L01();
uchar   SPI_RW(uchar data);
uchar   SPI_Read(uchar reg);
uchar   SPI_RW_Reg(uchar reg, uchar value);
uchar   SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
uchar   SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
void    SetRX_Mode();
void    SetTx_Mode();
void    NRF_RxPacket(uchar *rx_buf);
void    NRF_TxPacket(uchar *tx_buf);
/****************************************************************************************************
* 函数:init_IO_MSP430()
* 描述:NRF24L01初始化
* 参数:无
* 返回:无
****************************************************************************************************/
void init_IO_MSP430()
{
  P1DIR|=BIT0+BIT3+BIT4+BIT5;   
  P1DIR&=~BIT1 + BIT6;  
  P4DIR|=BIT0;
  P4OUT&=~BIT0;
}
/****************************************************************************************************
* 函数:void init_NRF24L01()
* 描述:NRF24L01初始化
* 参数:无
* 返回:无
****************************************************************************************************/
void init_NRF24L01()
{
  __delay_cycles(100);
  CE_0;    // 片选使能
  CSN_1;   // SPI使能
  SCK_0;   // SPI时钟拉低
  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自动应答  
  SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);                            //允许接收地址频道0
//SPI_RW_Reg(WRITE_REG+SETUP_AW,0x02);//Setup address width = 5bytes
  SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x1a);                              //设置自动重发时间和次数:500us + 86us, 10 retrans...
  SPI_RW_Reg(WRITE_REG + RF_CH, 0x32);                                //设置信道工作频率,收发必须一致
  SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);                   //设置接收数据长度
  SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f);                     //设置发射速率为2MHZ,发射功率为最大值0dB
  SPI_RW_Reg(WRITE_REG + CONFIG, 0x7c);                               //IRQ引脚不显示中断 掉电模式  1~16CRC校验
}
/****************************************************************************************************
* 函数:uchar SPI_RW(uchar data)
* 描述:SPI读/写一个字节数据
* 参数:要写入的数据(uchar)
* 返回:读取到的数据(uchar)
****************************************************************************************************/
uchar SPI_RW(uchar data)
{
  char i,temp=0;
  for(i=0;i<8;i++)              // output 8-bit
  {
    if((data & 0x80)==0x80)
      MOSI_1;                   // output 'uchar', MSB to MOSI
    else
      MOSI_0;
    data = (data << 1);         // shift next bit into MSB..
    temp<<=1;
    SCK_1;                      // Set SCK high..
    if(MISO)temp++;             // capture current MISO bit
    SCK_0;                      // ..then set SCK low again
  }
  return(temp);                 // return read uchar
}
/****************************************************************************************************
* 函数:uchar SPI_Read(uchar reg)
* 功能:NRF24L01的SPI时序,读取寄存器reg中的状态
* 参数:要写入的寄存器reg(uchar)
* 返回:寄存器的状态(uchar)
****************************************************************************************************/
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
  CSN_1;                        // CSN high, terminate SPI communication
  return(reg_val);              // return register value
}
/****************************************************************************************************
* 函数:uchar SPI_RW_Reg(uchar reg, uchar value)
* 描述:SPI读/写一个字节数据,向寄存器reg写value,并返回状态字
* 参数:要写入的寄存器reg(uchar),要写入的值value(uchar)
* 返回:寄存器的状态(uchar)
****************************************************************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
{
  uchar 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
}
/****************************************************************************************************
* 函数:uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
* 描述:接受缓冲区访问函数,用于在接收时访问FIFO缓冲区中的值
* 参数:寄存器reg(uchar),待读出数据地址pBuf(uchar),读出的数据个数bytes(uchar)
* 返回:寄存器的状态(uchar)
****************************************************************************************************/
uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
{
  uchar status,byte_ctr;
  CSN_0;                        // Set CSN low, init SPI tranaction
  status = SPI_RW(reg);         // Select register to write to and read status byte
  for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
    pBuf[byte_ctr] = SPI_RW(0); // Perform SPI_RW to read byte from nRF24L01
  CSN_1;                        // Set CSN high again
  return(status);               // return nRF24L01 status byte
}
/****************************************************************************************************
* 函数:uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
* 描述:发送缓冲区访问函数,主要用来把数组里的数放到FIFO缓冲区中
* 参数:寄存器reg(uchar),待写入数据地址pBuf(uchar),写入的数据个数bytes(uchar)
* 返回:寄存器的状态(uchar)
****************************************************************************************************/
uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
  uchar status,uchar_ctr;
  CSN_0;                        //SPI使能      
  status = SPI_RW(reg);   
  for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++)
    SPI_RW(*pBuf++);
  CSN_1;                        //关闭SPI
  return(status);     
}
/****************************************************************************************************
* 函数:void SetTX_Mode()
* 描述:发送模式配置
* 参数:无
* 返回:无
****************************************************************************************************/
void SetTX_Mode()
{
  CE_0;
  SPI_RW_Reg(WRITE_REG+STATUS,0xff);    //清除中断标志
  SPI_RW_Reg(FLUSH_TX,0x00);         //清除TX_FIFO寄存器
  SPI_RW_Reg(WRITE_REG + CONFIG,0x7e);  //IRQ引脚不显示中断 上电 发射模式  1~16CRC校验
  CE_1;
  __delay_cycles(130);                         //从CE = 0 到 CE = 1;即待机模式到收发模式,需要最大130us
}
/****************************************************************************************************
* 函数:void SetRX_Mode()
* 描述:接受模式配置
* 参数:无
* 返回:无
****************************************************************************************************/
void SetRX_Mode()
{
  CE_0;
  SPI_RW_Reg(WRITE_REG+STATUS,0xff);    //清除中断标志
  SPI_RW_Reg(FLUSH_RX,0x00);   //清除RX_FIFO寄存器
  SPI_RW_Reg(WRITE_REG + CONFIG, 0x7f); //IRQ引脚不显示中断 上电 接收模式   1~16CRC校验   
  CE_1;
  __delay_cycles(130);                         //从CE = 0 到 CE = 1;即待机模式到收发模式,需要最大130us
}
/****************************************************************************************************
* 函数:void NRF_TxPacket(uchar *tx_buf)
* 描述:发送tx_buf中的数据
* 参数:要发送的数组tx_buf(uchar)
* 返回:无
****************************************************************************************************/
void NRF_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);             // 装载数据
  CE_1;                                                           //置高CE,激发数据发送
  __delay_cycles(10);                                                    //注意,此处应该要大于10s,转为发射模式
  sta = SPI_Read(STATUS);                                         //读取状态寄存器的值
  SPI_RW_Reg(WRITE_REG+STATUS,sta);                               //清除对应的中断
}
/****************************************************************************************************
* 函数:void NRF_RxPacket(uchar *rx_buf)
* 描述:数据读取后放如rx_buf接收缓冲区中
* 参数:要接收的数组tx_buf(uchar)
* 返回:无
****************************************************************************************************/
void NRF_RxPacket(uchar *rx_buf)
{
  sta=SPI_Read(STATUS);                                 // 读取状态寄存其来判断数据接收状况
  SPI_RW_Reg(WRITE_REG+STATUS,sta);                     //清除对应的中断
  if(sta&0x40)                                          // 判断是否接收到数据
  {
    CE_0 ;                                              //SPI使能
    SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);    // read receive payload from RX_FIFO buffer
    SPI_RW_Reg(FLUSH_RX,0x00);                          //清除rx fifo寄存器,数据不抖动
    CE_1;
  }
}
/****************************************************************************************************
* 函数:void main()
* 描述:接收主函数
****************************************************************************************************/
void main()
{
  WDTCTL = WDTPW + WDTHOLD;     // Stop WDT
  init_IO_MSP430();             //MSP430的IO口初始化
  init_NRF24L01();  //nrf24l01初始化
  RxBuf[0] = 0;
  TxBuf[0] = 1;
  SetRX_Mode();                 //接收模式
  PMM_unlockLPM5();
  while(1)
  { SetRX_Mode();  
    NRF_RxPacket(RxBuf); //接收数据
    if(RxBuf[0] == 0)
    {LED_1;}
    else
    {LED_0;}   
  }
}


发送程序


void main()
{
  WDTCTL = WDTPW + WDTHOLD;      // Stop WDT
  init_IO_MSP430();             //msp430的io口初始化
  init_NRF24L01();  //nrf24l01初始化
   PMM_unlockLPM5();
  RxBuf[0] = 0;
  TxBuf[0] = 1;
  SetTX_Mode();                 //发送模式
  while(1)
  {
    TxBuf[0] = 1;
    NRF_TxPacket(TxBuf); //发送数据1
    __delay_cycles(50000);
    TxBuf[0] = 0;
    NRF_TxPacket(TxBuf); //发送数据0
    __delay_cycles(50000);     
  }
}





求大神指导
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
liaohailong_9
2019-03-24 23:41
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章