MSP430 code for nRF2401
*********************************************************************
//你可以参考一下!
CPU=MSP430F149
//搜索:智凡单片机。mcuc.com.cn
*********************************************************************
TX code:
#include
#define uchar unsigned char
#define uint unsigned int
uchar InitData[18];
uchar TXData[14];
uchar RXData[2];
uchar temp;
uchar ByteCnt;
uchar ByteCnt1;
uchar BitCnt;
uchar BitCnt1;
uchar Data1=0xff;
uchar tempi;
#define PWR BIT0 //P4.0
#define DR1 BIT3 //P4.3
#define CLK1 BIT4 //P4.4
#define DATA BIT5//P4.5
#define CE BIT1 //P4.1
#define CS BIT2 //P4.2
void init_io();
void nRF2401_ON();
void BuildInitWord();
void InitnRF2401();
void DoSPIClock();
void CE_High();
void RXEN_HIGH();
void TXEN_LOW();
void Delay500ns();
void Delay5us();
void Delay202us();
void Delay3ms();
void BuildShockWord();
void ShockBurst();
void ReceiveShock();
void time_set();
void main (void)
{ uint i;
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1&=~XT2OFF;
BCSCTL2=0x88; //10001000; XT2 as MCLK, 6M
do
{
IFG1&=~OFIFG; //clear OSCFault flag_breathe
for(i=0xFF;i>0;i--); //delay wait
} while((IFG1&OFIFG)!=0);
init_io();
nRF2401_ON();
BuildInitWord();
InitnRF2401();
BuildShockWord();
ShockBurst();
}
void init_io(void)
{P4DIR|=CS+DATA+PWR;//P1.0+P1.3+P1.4
P4DIR&=~DR1;//P1.1
P4DIR|=CLK1;//P5.6
P4DIR|=CE; //P6.6
P4OUT&=~DATA;
P4OUT&=~PWR;
P4OUT&=~CS;
P4OUT&=~CLK1;
P4OUT&=~CE;
}
void nRF2401_ON(void)
{P4OUT|=PWR;
}
void BuildInitWord(void)
{InitData[0]=0x8E;//
InitData[1]=0x08;//
InitData[2]=0x1C;//
InitData[3]=0x10;// 频道 2 数据长度
InitData[4]=0x10;// 频道 1 数据长度,16bit,2byte.
InitData[5]=0x00;// 频道 2 地址
InitData[6]=0x1c;// 频道 2 地址
InitData[7]=0xcc;// 频道 2 地址
InitData[8]=0xcc;// 频道 2 地址
InitData[9]=0xcc;// 频道 2 地址
InitData[10]=0x00;//频道 1 地址
InitData[11]=0xcc;//频道 1 地址
InitData[12]=0xcc;//频道 1 地址
InitData[13]=0xcc;//频道 1 地址
InitData[14]=0xcc;//频道 1 地址
InitData[15]=0x83;//4byte 地址,16CRC,CRC 允许
InitData[16]=0x4f;//一个频道接收,shock 模式,250K,16MCRY ,0DBm
InitData[17]=0x04;//tx
}
void InitnRF2401(void)
{
P4OUT|=CS;
Delay5us();//
for(ByteCnt=0;ByteCnt<18;ByteCnt++)
{tempi=InitData[ByteCnt];
for(BitCnt=0;BitCnt<8;BitCnt++)
{ P4OUT&=~CLK1;
if(tempi&0x80)
P4OUT|=DATA;
else
P4OUT&=~DATA;
Delay500ns();
P4OUT|=CLK1;
Delay500ns();
P4OUT&=~CLK1;
tempi=tempi<<1;
}
}
P4OUT&=~CS;
P4OUT&=~DATA;
}
void Delay500ns(void)
{
_NOP();
}
void Delay5us(void)
{uchar x;
uchar y;
for(y=0;y<5;y++)
for(x=0;x<2;x++);
}
void Delay202us(void)
{uchar n;
uchar m;
for(m=0;m<200;m++)
for(n=0;n<3;n++);
}
void Delay3ms(void)
{
int i;
unsigned long j;
for(i = 3;i > 0;i--)
{
for(j = 2000;j > 0;j--);
}
}
void BuildShockWord(void)
{TXData[0]=0xcc;
TXData[1]=0xcc;
TXData[2]=0xcc;
TXData[3]=0xcc;
TXData[4]=0x01;
TXData[5]=0x01;
}
void ShockBurst(void)
{
P4OUT|=CE;
Delay5us();//
for(ByteCnt1=0;ByteCnt1<6;ByteCnt1++)
{tempi=TXData[ByteCnt1];
for(BitCnt1=0;BitCnt1<8;BitCnt1++)
{P4OUT&=~CLK1;
if(tempi&0x80)
P4OUT|=DATA;
else
P4OUT&=~DATA;
Delay500ns();
P4OUT|=CLK1;
Delay500ns();
P4OUT&=~CLK1;
tempi=tempi<<1;
}
}
P4OUT&=~CE;
P4OUT&=~DATA;
Delay202us();
}
*******************************************************************************
RX code:
#include
#define uchar unsigned char
#define uint unsigned int
uchar InitData[18];
uchar TXData[14];
uchar RXData[2];
uchar temp;
uchar ByteCnt;
uchar ByteCnt1;
uchar BitCnt;
uchar BitCnt1;
uchar Data1=0xff;
uchar tempi;
#define PWR BIT0 //P4.0
#define DR1 BIT3 //P4.3
#define CLK1 BIT4 //P4.4
#define DATA BIT5//P4.5
#define CE BIT1 //P4.1
#define CS BIT2 //P4.2
void init_io();
void nRF2401_ON();
void BuildInitWord();
void InitnRF2401();
void DoSPIClock();
void CE_High();
void RXEN_HIGH();
void TXEN_LOW();
void Delay500ns();
void Delay5us();
void Delay202us();
void Delay3ms();
void BuildShockWord();
void ShockBurst();
void ReceiveShock();
void time_set();
void main (void)
{ uint i;
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1&=~XT2OFF;
BCSCTL2=0x88; //10001000; XT2 as MCLK, 6M
do
{
IFG1&=~OFIFG; //clear OSCFault flag_breathe
for(i=0xFF;i>0;i--); //delay wait
} while((IFG1&OFIFG)!=0);
init_io();
nRF2401_ON();
Delay3ms();
BuildInitWord();
InitnRF2401();
P4OUT|=CE;
Delay202us();
while(1)
{if(P4IN&DR1)
ReceiveShock();
}
}
void init_io(void)
{P4DIR|=CS+DATA+PWR;//P1.0+P1.3+P1.4
P4DIR&=~DR1;
P4DIR|=CLK1;
P4DIR|=CE;
P4OUT&=~DATA;
P4OUT&=~PWR;
P4OUT&=~CS;
P4OUT&=~CLK1;
P4OUT&=~CE;
}
void BuildInitWord(void)
{InitData[0]=0x8E;//
InitData[1]=0x08;//
InitData[2]=0x1C;//
InitData[3]=0x50;// 频道 2 数据长度
InitData[4]=0x10;// 频道 1 数据长度,80bit,10byte.
InitData[5]=0x00;// 频道 2 地址
InitData[6]=0x1c;// 频道 2 地址
InitData[7]=0xcc;// 频道 2 地址
InitData[8]=0xcc;// 频道 2 地址
InitData[9]=0xcc;// 频道 2 地址
InitData[10]=0x00;//频道 1 地址
InitData[11]=0xcc;//频道 1 地址
InitData[12]=0xcc;//频道 1 地址
InitData[13]=0xcc;//频道 1 地址
InitData[14]=0xcc;//频道 1 地址
InitData[15]=0x83;//4byte 地址,16CRC,CRC 允许
InitData[16]=0x4f;//一个频道接收,shock 模式,250K,16MCRY ,0DBm
InitData[17]=0x05;//receive
}
void InitnRF2401(void)
{
P4OUT|=CS;
Delay5us();
for(ByteCnt=0;ByteCnt<18;ByteCnt++)
{tempi=InitData[ByteCnt];
for(BitCnt=0;BitCnt<8;BitCnt++)
{ P4OUT&=~CLK1;
if(tempi&0x80)
P4OUT|=DATA;
else
P4OUT&=~DATA;
Delay500ns();
P4OUT|=CLK1;
Delay500ns();
P4OUT&=~CLK1;
tempi=tempi<<1;
}
}
P4OUT&=~CS;
P4OUT&=~DATA;
}
void nRF2401_ON(void)
{P4OUT|=PWR;
}
void Delay500ns(void)
{
_NOP();
}
void Delay5us(void)
{uchar x;
uchar y;
for(y=0;y<5;y++)
for(x=0;x<1;x++);
}
void Delay3ms(void)
{
int i;
unsigned long j;
for(i = 3;i > 0;i--)
{
for(j = 1000;j > 0;j--);
}
}
void Delay202us(void)
{uchar n;
uchar m;
for(m=0;m<200;m++)
for(n=0;n<3;n++);
}
void ReceiveShock(void)
{uchar i=0,j=0;
uchar dat;
P4DIR&=~DATA;
while(P4IN&DR1)
{ dat=dat<<1;
P4OUT&=~CLK1;
if(P4IN&DATA)
dat=dat|0x01;
i++;
P4OUT|=CLK1;
Delay500ns();
if(i>7)
{i=0;
RXData[j]=dat;
j++;
}
P4OUT&=~CLK1;
}
}
******************************** END *************************************