📄 rx.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 + -