⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 用MSP430F149控制RF905的实用源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
  //CLR(PORTB,TRXCE); 
  TRX_CE_clr;
} 
//->ShockBurst Send 
void nrf905_TxSend() 
{ 
  //SET(PORTB,TRXCE); 
  TRX_CE_set;
  DelayUs(20);//>10us 
  //CLR(PORTB,TRXCE);//只发送一次 
  TRX_CE_clr;
} 
//->ShockBurst Recv 
void nrf905_RxOn() 
{ 
  //SET(PORTB,PWR); 
  PWR_UP_set;
  //CLR(PORTB,TX_EN);//maybe first 
  TX_EN_clr;
  //SET(PORTB,TRXCE);
  TRX_CE_set;
} 

uchar nrf905_SpiRW(uchar val)  
{
  uchar temp; 
  uchar m;
  temp = 0;
  for(m=0;m<8;m++)
  {
    SPI_UCLK_clr;
    if(val&(1<<(7-m)))  //write
      SPI_SIMO_set;
    else 
      SPI_SIMO_clr;
    if(SPI_SOMI)       //read
      temp |= (1<<(7-m));
    else 
      temp &= ~(1<<(7-m));
    SPI_UCLK_set;
  }
  SPI_UCLK_clr;
  return temp; 
} 
//切换模式
void ChangeMode(uchar num)
{
  if(num==PowerDown)
  {
     PWR_UP_clr;		/* 配置为掉电模式 */
     TX_EN_clr;
     TRX_CE_clr;
  }
  if(num==Standby)
  {
    TRX_CE_clr;
    TX_EN_clr;
    PW_UP_set;
  }
  if(num==RXMode)
  {
/* TRX_EN=0;	/**/
    TX_EN_clr;
    PW_UP_set;
    DelayUs(1);
    DelayUs(1);
    TRX_CE_set;
  }
  if(num==TXMode)
  {
    TX_EN_set;
    PW_UP_set;
    TRX_CE_clr;
  }
  if(num==TXData)
  {
    TRX_CE_set;
    Delayus(20);	
    TRX_CE_clr;		/* ??  Make a 20us Pulse as nRF905 Datasheet */
  }
}
void nrf905_SpiTest();
//初始化nrf905 
void nrf905_Init() 
{ 
  uchar error;
  error = 0;
  SPI_UCLK_clr;
  SPI_CSN_set;
  ////////////////////////////////////////////
  //nrf905_StandBy(); 
  ChangeMode(Standby);  
  DelayMs(5);//!!!must >3ms 
  nrf905_Config(); 
    
  nrf905_SpiTest();//test...
  
  if(RxBuf[0]!=CH_NO_BYTE) error++;
  if(RxBuf[1]!=(PA_PWR_10dBm | HFREQ_PLL_433MHz)) error++;
  if(RxBuf[2]!=(TX_AFW_4BYTE | RX_AFW_4BYTE)) error++;
  if(RxBuf[3]!=RX_PW_4BYTE) error++;
  if(RxBuf[4]!=TX_PW_32BYTE) error++;
  if(RxBuf[5]!=0x12) error++;
  if(RxBuf[6]!=0x34) error++;
  if(RxBuf[7]!=0x56) error++;
  if(RxBuf[8]!=0x78) error++;
  if(RxBuf[9]!=(CRC16_EN | XOF_16MHz)) error++;
  
  if(error !=0x00) LED1_clr;
  else 
  {
    P1OUT ^= BIT3;
    P1OUT ^= BIT4;
    DelayMs(500);
    P1OUT ^= BIT3;
    P1OUT ^= BIT4;
  }
  //nrf905_RxOn();
  ChangeMode(RXMODE);
  DelayUs(650);
} 

//测试:通过读配置,判断SPI操作是否正确 
void nrf905_SpiTest() 
{
  uchar i; 
  //CLR(PORTB,CSN);                    
  SPI_UCLK_clr;
  SPI_CSN_clr;
  nrf905_SpiRW(RC);  //读配置 
  for (i=0;i<10;i++) 
  {  
    RxBuf[i]=  nrf905_SpiRW(0);//read from nrf905 
  } 
  //SET(PORTB,CSN); 
  SPI_CSN_set;  
} 

//写Tx地址 
void nrf905_SetTxAddr() 
{ 
  //CLR(PORTB,CSN);                    
  SPI_UCLK_clr;
  SPI_CSN_clr;
  nrf905_SpiRW(WTA);  //写Tx地址   
  nrf905_SpiRW(TX_ADDRESS_0); 
  nrf905_SpiRW(TX_ADDRESS_1); 
  nrf905_SpiRW(TX_ADDRESS_2); 
  nrf905_SpiRW(TX_ADDRESS_3); 
  //SET(PORTB,CSN);
  SPI_CSN_set;
} 

//写Tx数据 
void nrf905_SetData() 
{
  uchar i; 
  //CLR(PORTB,CSN);
  SPI_UCLK_clr;
  SPI_CSN_clr;
  nrf905_SpiRW(WTP);  //写TxPayload  
  for (i=0;i<TXSIZE;i++) 
  {  
    nrf905_SpiRW(TxBuf[i]); 
  }  
  //SET(PORTB,CSN);
  SPI_CSN_set;
} 
//等待发送结束 
void nrf905_WaitSended() 
{ 
   //while ((PIND&(1<<DR))==0); 
   while(DR == 0)
   {
     ;
   } 
} 
//发送TxBuf中的数据 
void nrf905_SendData() 
{ 
   //nrf905_TxOn();//切换到发送模式 
   ChangeMode(TXMODE);
   DelayMs(4);
   nrf905_SetTxAddr();//写发送地址 
   nrf905_SetData();//写数据 
   //nrf905_TxSend();//启动发送 
   ChangeMode(TXDATA);
   nrf905_WaitSended();//等待发送结束  
   //ChangeMode(RXMODE);  //转为接收状态
   DelayUs(650);
} 
//测试直接重新发送上次写入的数据 
void nrf905_SendAgain() 
{ 
   nrf905_TxOn(); 
   nrf905_TxSend(); 
   nrf905_WaitSended();   
} 

//读出接收到的数据 
void nrf905_ReadData() 
{ 
  uchar i; 
  //CLR(PORTB,CSN); 
  SPI_UCLK_clr;
  SPI_CSN_clr;
  nrf905_SpiRW(RRP);  //读RxPayload  
  for (i=0;i<RXSIZE;i++) 
  {  
    RxBuf[i]=nrf905_SpiRW(0xff);//read... 
  } 
  //SET(PORTB,CSN);
  SPI_CSN_set;
} 


/////////////////////////////////////////////////
void main( void )
{
  // Stop watchdog timer to prevent time out reset
  uchar m;
  CpuInit();
  LED1_set;
  LED2_set;
  DelayMs(500);
  nrf905_Init();
  for(;;)
  {
    while( (P4IN & BIT0) == 0x00)  //等待接收完毕
    {
      //if((P4IN & BIT1) == BIT1)//AM
        //LED2_clr;
      ;
    } 
    P1OUT ^= BIT3;  //灯闪烁,以示该次接收正确 
    P1OUT ^= BIT4;
    //nrf905_StandBy(); 
    /* ChangeMode(Standby);*/
    
    nrf905_ReadData();
    TxBuf[0]=0x7E;
    TxBuf[1]=RxBuf[1];
    for(m=2;m<TXSIZE;m++)
    {
      TxBuf[m]=m;
    }
    DelayMs(2);
    nrf905_SendData();  //发送4个字节 
    //nrf905_RxOn();  //转为接受状态
    ChangeMode(RXMODE);
    DelayMs(1);
  }
}
////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -