This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

【MSP430 LaunchPad设计心得】+基于NRF905的简单无线通讯



最近做了个基于NRF905的无线通讯系统,期间发现了一些问题,虽然最后调通了,但是其中的道理不是很清楚,下面上程序,这个是接收数据的,发送的只是在上面小改一下就好了。

#include "io430G2231.h"

 

#define CPU_F ((double)1000000) 

#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 

#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 

 

#define  uchar   unsigned char

#define  uint    unsigned int

 

//#define  uclong  unsigned long

//==================TXEN,TRX_CE,PWR_0 为收发模式控制端口======================

#define  TX_EN_0    P2OUT &=~BIT6          //输出0

#define  TX_EN_1    P2OUT |= BIT6          //输出1

//=======================================================

#define  TRX_CE_0   P1OUT &=~BIT0

#define  TRX_CE_1   P1OUT |= BIT0

//=======================================================

#define  PWR_0      P2OUT &=~BIT7

#define  PWR_1      P2OUT |= BIT7

//=========================SPI 主入从出==================

#define  MISO       ((P1IN&BIT2)>>2)          

//=========================主出从入======================

#define  MOSI_0     P1OUT &=~BIT7         

#define  MOSI_1     P1OUT |= BIT7        

//=========================SPI时钟端口===================

#define  SCK_0      P1OUT &=~BIT3         

#define  SCK_1      P1OUT |= BIT3         

//=========================SPI使能端口===================

#define  CSN_0      P1OUT &=~BIT5

#define  CSN_1      P1OUT |= BIT5

 

//===========================以下为状态端口==============

//===========================AM  地址匹配================

#define  AM       (P1IN&BIT1)       

//===========================DR 数据接收状态=============

#define  DR       ((P1IN&BIT6)>>6)

//===========================CD 载波侦听状态=============

#define  CD       ((P1IN&BIT4)>>4)

 

//============NRF905:SPI指令==================

#define WC 0x00      //写配置寄存器

#define RC 0x10      //读配置寄存器

#define WTP 0x20      //写TX有效数据

#define RTP 0x21      //读TX有效数据

#define WTA 0x22      //写TX地址

#define RTA 0x23      //读TX地址

#define RRP 0x24      //读取RX有效数据

 

uchar sss[10]={0};

uchar rx[10]={0};

typedef struct RFConfig{

  uchar n;

  uchar buf[10];

}RFConfig;

 

struct RFConfig RxTxConf ={

  10,                        

  0x4c,                       /**/

  0x0c,                       /**/

  0x44,                       /*TX_AFW,RX_AFW地址宽度*/

  0x01,0x01,                  /*RX,TX有效数据位长度1位*/

  0x22,0x22,0x22,0x22,        /*接收地址*/

  0x58                        /*CRCx效验*/

};

 

uchar SPI_NRF905_READ(void){

  uchar i;

  uchar byte;

  for(i=0; i<8; i++){

    byte = byte<<1;

    SCK_1;

    if(MISO)

      byte |= 0x01;

    else

      byte &=~0x01;

    SCK_0;

  }

  return byte;

}

 

void SPI_NRF905_WRITE(uchar byte){

  uchar i;

  for(i=0; i<8; i++){

    if(byte&0x80)

      MOSI_1;

    else 

      MOSI_0;

    SCK_1;

    byte = byte<<1;

    SCK_0;

  }

}

 

void Config905(void){

  uchar i;

  CSN_0;

  SPI_NRF905_WRITE(WC);

  for(i=0; i<RxTxConf.n; i++){

    SPI_NRF905_WRITE(RxTxConf.buf[i]);  

  }

  CSN_1;

}

 

void ReadConfig905(){

  uchar i;

  CSN_0;

  SPI_NRF905_WRITE(RC);

  for(i=0; i<10; i++){

    sss[i]=SPI_NRF905_READ();  

  }

  CSN_1;  

}

 

void TxPacket(void){

  uchar i;

  CSN_0;

  SPI_NRF905_WRITE(WTP);

  SPI_NRF905_WRITE(0x01);     //发送一位数据

  CSN_1;

  delay_us(2);

  CSN_0;

  SPI_NRF905_WRITE(WTA);

  for(i=0; i<4; i++){

    SPI_NRF905_WRITE(RxTxConf.buf[i+5]);          //发送地址

  }

  CSN_1;

  TRX_CE_1;

  delay_us(5);

  while(!DR);

  TRX_CE_0;

}

 

void RxPacket(void){

  //uchar i;

  TRX_CE_0;

  CSN_0;

  SPI_NRF905_WRITE(RRP);

  rx[0]=SPI_NRF905_READ();//读取一位数据

  CSN_1;

  while(DR||AM);

  TRX_CE_1;

}

 

void SetTxMode(void){

  TX_EN_1;

  TRX_CE_0;

  delay_us(400);

}

 

void SetRxMode(void){

  TX_EN_0;

  TRX_CE_1;

  delay_us(650);

}

 

void main( void )

{

  // Stop watchdog timer to prevent time out reset

  WDTCTL = WDTPW + WDTHOLD;

  if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)                                     

  {  

    while(1);                               // If calibration constants erased

                                            // do not load, trap CPU!!

  }

  BCSCTL1 = CALBC1_1MHZ;                    // Set range

  DCOCTL = CALDCO_1MHZ;  

  //P1DIR = 0x01;

  //while(1){

    //P1OUT ^= 0x01;

    //delay_ms(1000);

  //}

  P2DIR |=(BIT6+BIT7);

  P1DIR = 0xff;

  P1DIR &= ~(BIT1+BIT2+BIT4+BIT6);

  P2REN |= (BIT6+BIT7);            //采用了上拉电阻,否则无法NRF905无法正常工作(实验出来的)至今还不是很明白

  P2OUT = 0x00;

  P1OUT = 0x00;

  CSN_1;

  SCK_0;

  PWR_1;

  TRX_CE_0;

  TX_EN_0;  

  Config905();

  ReadConfig905();

  //SetTxMode();//设置发送模式

  SetRxMode();

  while(1){ 

    //TxPacket();           //发送数据

    //delay_ms(500);    

    while(!DR);             //检测接收是否完成

    RxPacket();              //读取接收数据

    __delay_cycles(1);    

  }

}