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

📄 rx.c

📁 MSP430F135上的nRF2401无线收发程序
💻 C
字号:
//compiler-IAR FOR MSP430 3.10A
//MCU--MSP430F135
//作者--宋光春,QQ928853769,2008.04.23
#include <msp430x14x.h>
#include "RX.h"
#include  "float.h"
#include  "stdio.h"
#include  "stdlib.h"
#include  "string.h"
#include "intrinsics.h"
int i=0;
UCHAR InitData[15];
UCHAR TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
UCHAR TxBuf[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x6,0x07,0x08,0x09};
UCHAR  RxBuf[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x6,0x07,0x08,0x09};
/********************端口初始化****************/
void init_io(void)
{
P2DIR |= PWR;          //PWR为单片机输出引脚
P1DIR |= CE;           //CE为单片机的输出脚          
P1DIR |= CS;           //CS为单片机的输出脚 
P1DIR |= CLK1;         //CLK1为单片机的输出脚 
P1DIR |= DATA;         //DATA为单片机的输出脚 
P1DIR &= ~DR1;         //DR1为单片机输入脚 
}

/****************BuildSPIWord*********************/
void buildinit_word(void)
{
  InitData[0]=0x00;//RX receiver 2,Datalength 80bit
  InitData[1]=0x50;//RX receiver 1,Datalength 80bit
  InitData[2]=0x00;
  InitData[3]=0xcc;
  InitData[4]=0xcc;
  InitData[5]=0xcc;
  InitData[6]=0xcc;
  InitData[7]=0x00;
  InitData[8]=0xcc;//RX receive 1 address High byte
  InitData[9]=0xcc;//RX receive 1 address High byte
  InitData[10]=0xcc;//RX receive 1 address Low byte
  InitData[11]=0xcc;//RX receive 1 address Low byte

  InitData[12]=0x83;//this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC enable(Bit0)

  InitData[13]=0x6f;//One receiver(Bit7), shock Mode(Bit6), Datarate(Biit5) 250K, crystal(Bit4-Bit2),RF_Power(Bit1-Bit0)

  InitData[14]=0x05;//Channel Number(Bit7-Bit1), RX/TX mode(Bit0)
}
/************delay*****************/
void  delay(UINT x)
{
  UCHAR  j;
  while((x--)!=0)
   {
    for(j=0;j<125;j++)
    ;
   }
}
void delay_1us(void)
{
  _NOP();
}
/******************配置操作****************/
void Config2401(void)
{
   int i;
   P2OUT |= PWR;               //单片机PWR引脚输出高电平,上电
   P1OUT &= ~CS;               //单片机CS输出低电平
   P1OUT &= ~CE;               //单片机CE输出低电平
   P1OUT &= ~CLK1;             //单片机CLK1输出低电平
   delay(20);
   P1OUT |= CS;                //单片机CS输出高电平

   
   for(i=0;i<15;i++)
      {
          ByteWrite(InitData[i]);
      }
   delay(6);                   //延时600us
   P1OUT &= ~CS;               //单片机CS输出低电平     
   P1OUT &= ~DATA;             //单片机DATA输出低电平
}
/////////////////////////////////
void  ByteWrite(UCHAR send)
{
   UCHAR i;
   for (i=0;i<8;i++)
     {
        if (send&0x80) 
           {  
               P1OUT |= DATA;
           }
        else
           {  
               P1OUT &= ~DATA;
           }
        _NOP();
        P1OUT |= CLK1;
        send=send<<1;
        P1OUT &= ~CLK1;
     }
}
/***********设置RF2401 为发送模式**********/
void SetTxMode(void)
{
      P1OUT |= CS;
      delay_1us();
      delay_1us();
      delay_1us();
      delay_1us();
      delay_1us();
      P1OUT &= ~DATA;
      _NOP();
      P1OUT |= CLK1;
      _NOP();
      P1OUT &= ~CLK1;
      delay(6);//延时600us
      P1OUT &= ~CS;
      P1OUT |= CE;
      delay_1us();
}
/******nRF2401数据发送函数****/
void RF2401_TxPacket(void)
{
     int i;
     for(i=0;i<(ADDR_W/8);i++) //写入接收地址(按字节对齐)
         {
             ByteWrite(TxAddress[i]);
         }
     for(i=0;i<(DATA1_W/8);i++) //写入需要发送的数据(按字节对齐)
         {
             ByteWrite(TxBuf[i]);
         }
     P1OUT &= ~CE;    //CE置低使发送有效
     P1OUT &= ~DATA;  //DATA输出低电平
     delay(1);
     delay(1); 
}
/*******设置RF2401 为接收模式********/
void SetRxMode(void)
{
      P1OUT |= CS;       //CS=1,进入设置模式
      delay_1us();
      delay_1us();
      delay_1us();
      delay_1us();
      delay_1us();
      P1OUT |= DATA;    //DATA输出高电平
      _NOP();
      P1OUT |= CLK1;    //CLK1输出高电平
      _NOP();
      P1OUT &= ~CLK1;   //CLK1输出低电平
      delay(6);
      P1OUT &= ~CS;     //退出设置模式
      P1OUT |= CE;      //激活TX/RX模式
      delay(1);
}
///////////////////////////
UCHAR ByteRead(void)
{
 UCHAR i;
 UCHAR DATA_BUF;
for(i=0;i<8;i++)
{
   DATA_BUF=DATA_BUF<<1;
   if (P1IN&DATA)     //读取最高位,保存至最末尾,通过左移位完成整个字节
     {
        DATA_BUF|=0x01;
     }
   else
     {
        DATA_BUF&=~(0x01);
     }
   P1OUT &= ~CLK1;
   P1OUT |= CLK1;

}
   return DATA_BUF;
}
/******nRF2401数据接收函数****/
unsigned char nRF2401_RxPacket(void)
{
  UINT i;
  if(P1IN&0x04)     //如果DR1 ready
    {
        P1OUT |= CLK1;
        P1DIR &= ~DATA;            //单片机DATA引脚作为输入脚
        //PORTD&=~(0x04);
        for (i=0;i<DATA1_W/8;i++)
            {
                RxBuf[i]=ByteRead();
            }
        P1OUT &= ~CLK1;
        P1OUT |= DATA;            //单片机DATA引脚输出高电平
        P1OUT &= ~DATA;           //单片机DATA引脚输出低电平
        return 1;
    }
  return 0;
}

/*************************主函数***************************************/
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;          //关闭看门狗
    BCSCTL1 &= ~XT2OFF;
    do 
      {
       IFG1 &= ~OFIFG;
       for(i=0xff;i>0;i--);
      }while(IFG1 & OFIFG);
    BCSCTL2 |= SELM_2 + SELS;         //MCLK =  8M   SMCLK=8M 
    init_io();
    buildinit_word();//生成配置内容
    Config2401(); // 必须执行的配置操作
   // SetTxMode(); // 设置为发送模式
   // RF2401_TxPacket(); // 发送测试数据


    //PORTA&=~(0x04); //pA.4 =0,led亮

    delay(10000); // 延时使LED灯点亮
    //PORTA|=0x04;  // pA.4 =1,led灭

    SetRxMode(); // 设置RF2401 为接收模式
while(1)
{
    if (nRF2401_RxPacket()==1) //返回1 表明有数据包接收到
       {

       /*  PORTA&=~(0x04); //pA.4 =0,led亮
         delay(10000);   // 延时使LED灯点亮
         PORTA|=0x04;    // pA.4 =1,led灭     */

      /*   PORTA=RxBuf[0];
         delay(10000);   // 延时使LED灯点亮
         PORTA&=~(RxBuf[0]);                     

         PORTA=RxBuf[1];
         delay(10000);   // 延时使LED灯点亮
         PORTA&=~(RxBuf[1]);

         PORTA=RxBuf[2];
         delay(10000);   // 延时使LED灯点亮
         PORTA&=~(RxBuf[2]);

         PORTA=RxBuf[8];
         delay(10000); // 延时使LED灯点亮
         PORTA&=~(RxBuf[8]);

         PORTA=RxBuf[9];   */

         //  SetTxMode(); // 设置为发射模式
         //  RF2401_TxPacket(); // 发送数据
           SetRxMode(); // 设置为接收模式

        }
}//end_while(1);
}

⌨️ 快捷键说明

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