求助MSP430F155+NRF905通讯不了

2019-03-24 13:08发布

载波能检测到,地址检测不通过。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
obentul
1楼-- · 2019-03-25 00:41
发送程序








#include <msp430x15x.h>
//==============================================================================
#define  uchar   unsigned char
#define  uint    unsigned int
#define  uclong  unsigned long
//==================TXEN,TRX_CE,PWR_0 为收发模式控制端口======================
#define  TXEN_0     P2OUT &=~BIT0          //输出0
#define  TXEN_1     P2OUT |= BIT0          //输出1
//==============================================================================
#define  TRX_CE_0   P2OUT &=~BIT1
#define  TRX_CE_1   P2OUT |= BIT1
//==============================================================================
#define  PWR_0      P2OUT &=~BIT2
#define  PWR_1      P2OUT |= BIT2
//===================================主入从出===================================
#define  MISO_0     P3OUT &=~BIT2      
#define  MISO_1     P3OUT |= BIT2         
//==================================主出从入====================================
#define  MOSI_0     P3OUT &=~BIT1         
#define  MOSI_1     P3OUT |= BIT1        
//===================================SPI时钟端口================================
#define  SCK_0      P3OUT &=~BIT3         
#define  SCK_1      P3OUT |= BIT3         
//===================================SPI使能端口=================================
#define  CSN_0      P3OUT &=~BIT0
#define  CSN_1      P3OUT |= BIT0
//==================================以下为状态端口==============================
//===========================AM  地址匹配=======================================
#define  AM_0       P2OUT &=~BIT5      
#define  AM_1       P2OUT |= BIT5
//=================================DR 数据接收状态==============================
#define  DR_0       P2OUT &=~BIT6
#define  DR_1       P2OUT |= BIT6
//=====================================CD 载波侦听状态==========================
#define  CD_0       P2OUT &=~BIT4
#define  CD_1       P2OUT |= BIT4
//==============================================================================
#define  LED1_0     P6OUT &=~BIT1          //输出0
#define  LED1_1     P6OUT |= BIT1          //输出1
#define  LED2_0     P6OUT &=~BIT2          //输出0
#define  LED2_1     P6OUT |= BIT2          //输出1
//===========================NRF905:SPI指令=====================================
#define WC        0x00
#define RC        0x10
#define WTP        0x20
#define RTP        0x21
#define WTA        0x22
#define RTA        0x23
#define RRP        0x24
//==========================32字节发送数据收发缓冲区============================
#define TxRxBuf_Len 32
unsigned char TxRxBuf[TxRxBuf_Len]=
{ 0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
  0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,
};
char TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
char DATA_BUF[];
//==========================NRF905:10寄存器配置================================
unsigned char  RFConf[11]=
{
  WC,                                //SPI写操作命令
  0x4c,                             //CH_NO,配置频段在430MHZ
  0x0C,                             //输出功率为10db,不重发,节电为正常模式
  0x44,                             //地址宽度设置,为4字节
  0x20,0x20,                        //接收发送有效数据长度为32字节
  0xCC,0xCC,0xCC,0xCC,              //接收地址
  0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
/*****************************************************************************
系统初始化
******************************************************************************/
void Delay(uchar n)
{
    uint i;
    while(n--)
    for(i=0;i<80;i++);
}

void InitSys()
{
   unsigned int iq0;
   _DINT();
   BCSCTL1 &=~XT2OFF;
   do
   {
      IFG1 &= ~OFIFG;                            // 清除振荡器失效标志
  for (iq0 = 0xFF; iq0 > 0; iq0--);    // 延时,等待XT2起振
   }
   while ((IFG1 & OFIFG) != 0);        // 判断XT2是否起振        
   BCSCTL2 =SELM1+SELS;                      //MCLK,SMCLK时钟为XT2
                            //???USART0
}
//===========================初始化nRF905=======================================
void nRF905_IO_set(void)
{
        P2DIR |= 0x07;
        P2DIR &= 0x8F;
        P2SEL&=0x88;        
        P3DIR |= 0xC0;
        P3DIR |= 0xFB;
        P3SEL&=0xF0;        
        CSN_1;                            // Spi     disable
    SCK_0;                          // Spi clock line init low
    PWR_1;                     // nRF905 power on
    TRX_CE_0;                // Set nRF905 in standby mode
    TXEN_0;Delay(100);        // set radio in Rx mode
}
//==============================================================================
void LED_IO_set(void)
{   
        P6DIR |= BIT2;
        P6OUT |= BIT2;              //关闭电平转换        
}
//==========================延时================================================

//=========================NRF905 SPI读函数(IO模拟SPI时序)==================
unsigned char SpiRead(void)
{
    unsigned char i;
    for (i=0;i<8;i++)
    {
        DATA_BUF=DATA_BUF<<1;
        SCK_1;
        if ((P3IN&0x04))    //读取最高位,保存至最末尾,通过左移位完成整个字节
        {
            DATA_BUF|=0x01;
        }
        else
        {
            DATA_BUF&=~(0x01);
        }
        SCK_0;
     }
     return DATA_BUF;
}
//=========================NRF905 SPI读写函数(IO模拟SPI时序)==================
void SpiWrite(unsigned char send)
{
    unsigned char i;
    DATA_BUF=send;
    for (i=0;i<8;i++)
    {
    if (((DATA_BUF&0x80) != 0))    //总是发送最高位
        {
        MOSI_1;
     }
    else
     {
        MOSI_0;
     }
    SCK_1;
    DATA_BUF=DATA_BUF<<1;
    SCK_0;
    }
}

//==================================初始化NRF905================================
void Config905(void)
{
    uchar i;
    CSN_0;                        // Spi enable for write a spi command
    for (i=0;i<11;i++)    // Write configration words  写放配置字
    {
       SpiWrite(RFConf);
    }
    CSN_1;                    //关闭SPI
}
//=========================NRF905装载地址+数据打包+数据发送=====================
void TxPacket(void)
{
    uchar i;
    CSN_0;
    SpiWrite(WTP);                // 待发数据装载命令
    for (i=0;i<32;i++)
    {
      SpiWrite(TxRxBuf);
    }
    CSN_1;                                  // 关闭SPI
    Delay(1);        
    CSN_0;                    // 打开SPI
    SpiWrite(WTA);                // 写入地址要和接收方地址一样
    for (i=0;i<4;i++)            // 4字节地址
    {
      SpiWrite(TxAddress);
    }
    CSN_1;                    //关闭SPI
    TRX_CE_1;                    // Set TRX_CE high,start Tx data transmission
    Delay(10);                     //while (CheckDR()!=1);
    TRX_CE_0;                    // Set TRX_CE low
}
//==================================发送模式初始化-=============================
void SetTxMode(void)
{
    TRX_CE_0;
    TXEN_1;
    Delay(1);                     // Delay for mode change(>=650us)
}
//==================================数据发送===================================
void TX(void)
{
      
    TxPacket();
        SetTxMode();
}
//==================================主函数=====================================
void main(void)
{
   WDTCTL = WDTPW + WDTHOLD; //禁止看门狗
   InitSys();
   nRF905_IO_set();
   LED_IO_set();   //6.2灯亮,6.2为输出
   Config905();
   LED1_1 ; LED2_1 ;
while(1)
   {
    TX();   
    Delay(200); Delay(200); Delay(200);LED1_0 ;
    Delay(200); Delay(200); Delay(200); Delay(200); Delay(200); LED1_1;
   }
}
obentul
2楼-- · 2019-03-25 05:00
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章