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

📄 tx.c

📁 MSP430F135上的nRF2401无线收发程序
💻 C
字号:
//compiler-IAR FOR MSP430 3.10A
//MCU--MSP430F135
//作者--宋光春,QQ928853769,2008.04.23
#include <msp430x14x.h>
#include  "float.h"
#include  "stdio.h"
#include  "stdlib.h"
#include  "string.h"
#include "intrinsics.h"
#include  "TX.h"


UCHAR InitData[15];
UCHAR TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
UCHAR TxBuf[10]={0xfe,0xfb,0xef,0xff,0xff,0xff,0xff,0xff,0x00,0xbf};
UCHAR RxBuf[10];

UCHAR Buf;
UINT y;
UINT count=0;
UCHAR RX_Data[10];
int i=0;
/********************端口初始化****************/
void init_io(void)
{
//DDRA=0xff;           //端口1全部为输出
//PORTA=0xff;          // 
P2DIR |= PWR;          //PWR为单片机输出引脚
P1DIR |= CE;           //CE为单片机的输出脚          
P1DIR |= CS;           //CS为单片机的输出脚 
P1DIR |= CLK1;         //CLK1为单片机的输出脚 
P1DIR |= DATA;         //DATA为单片机的输出脚 
P1DIR &= ~DR1;         //DR1为单片机输入脚 
//P1IN &= 0x00;        //DR1输出低电平 
}

/****************BuildSPIWord*********************/
void buildinit_word(void)
{
  InitData[0]=0x00;//RX receiver 2,Datalength 0bit
  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;
  y = x;
  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;
   Buf = send;
   for (i=0;i<8;i++)
     {
        if (send&0x80)
           {   
               P1OUT |= DATA;    //单片机DATA输出高电平
           }
        else
           {  
               P1OUT &= ~DATA;   //单片机DATA输出低电平
           }
        _NOP();
        P1OUT |= CLK1;           //单片机CLK1输出高电平
        send=send<<1;
        P1OUT &= ~CLK1;          //单片机CLK1输出低电平
     }
}
/***********设置RF2401 为发送模式**********/
void SetTxMode(void)
{
      P1OUT |= CS;               //单片机引脚CS输出高电平           
      delay_1us();
      delay_1us();
      delay_1us();
      delay_1us();
      delay_1us();
      P1OUT &= ~DATA;           //单片机引脚DATA输出低电平
      _NOP();
      P1OUT |= CLK1;            //单片机引脚CLK1输出高电平 
      _NOP();
      P1OUT &= ~CLK1;           //单片机引脚CLK1输出低电平
      delay(6);                 //延时600us
      P1OUT &= ~CS;             //单片机引脚CS输出低电平 
      P1OUT |= CE;              //单片机引脚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置低使发送有效---使能shockburst
     P1OUT &= ~DATA;
     delay(1); 
     delay(1); 
}
/*******设置RF2401 为接收模式********/
void SetRxMode(void)
{
      P1OUT |= CS;             //单片机引脚CS输出高电平
      delay_1us();
      delay_1us();
      delay_1us();
      delay_1us();
      delay_1us();
      P1OUT |= DATA;          //单片机引脚DATA输出高电平
      _NOP();
      P1OUT |= CLK1;
      _NOP();
      P1OUT &= ~CLK1;
      delay(6);//延时600us
      P1OUT &= ~CS;           //单片机引脚CS输出低电平
      P1OUT |= CE;            //单片机引脚CE输出高电平
      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;                       //单片机引脚CLK1输出低电平
   P1OUT |= CLK1;                        //单片机引脚CLK1输出高电平
}
   return DATA_BUF;
}
/******nRF2401数据接收函数****/
unsigned char nRF2401_RxPacket(void)
{
  UINT i;
  if(P1IN&DR1)
    {
        P1OUT |= CLK1;                  //单片机引脚CLK1输出高电平 
        P1DIR &= ~DATA;                 //单片机引脚DATA为输入模式
        //P1IN &= ~DATA;                  //单片机引脚DATA输入0
        //P1IN &= ~0x01;
        for (i=0;i<DATA1_W/8;i++)
            {
                RxBuf[i]=ByteRead();
            }
        P1OUT &= ~CLK1;                   
        P1OUT |= DATA;                 //单片机引脚DATA输出高电平
        P1OUT &= ~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(); // 发送测试数据

   _NOP();
   // PORTA&=~(0x10);

    delay(10000); // 延时使LED灯点亮
    //PORTA|=0x10;


  //  SetRxMode(); // 设置RF2401 为接收模式
while(1)
{
}
}

⌨️ 快捷键说明

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