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

📄 2401a.c

📁 射频识别利用nrf 2401芯片实现收发功能
💻 C
字号:
#include "msp430x12x2.h"
#include "timer.h"
#include  "flash.h"
/*pin connection description
CE   P1.3		out
CS   P1.2		out
DR1	 P1.0		in	  *****
CLK1 P2.4		out       *****
DATA P2.3		inout,  defaut is out     *****
POWER P3.4              out
*/
struct RFConfig
{
unsigned char n;
unsigned char buf[15];
};
struct RFConfig RxTxConf =
{
15,
0xd0, 0xd0,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x66, 0x88, 0x88, 0x66,
0x83, 0x6f, 0x64
};
//设置包长为26个字节,第2通道接收地址为
//1通道当为接收时地址设为0x8866
//接收地址为32bit长,使能crc,16位
//只有接收通道1工作,ShockBurst模式,1 Mbps,16M晶阵
//输出功率0dBm
//工作频段2.45G,默认为发射模式

void intPORT()
{
	P1DIR = 0xfe;       //*********	
	P1SEL = 0x00;
	P1OUT = 0x00;
	
	P2DIR = 0xff;	
	P2SEL = 0x00;
	P2OUT = 0x00;
	
	P3DIR = 0xff;	
	P3SEL = 0x00;
        P3OUT = 0x00;
}
void powerUP2401A()
{
        P3OUT = 0x10;
        //power up,wait 3ms
        delayNms(4);
}
void powerOFF2401A()
{
        P3OUT = 0x00;
}
void setCE()
{
	P1OUT = P1OUT | 0x08;
}
void clrCE()
{
	P1OUT = P1OUT & 0xf7;
}
void setCS()
{
	P1OUT = P1OUT | 0x04;
}
void clrCS()
{
	P1OUT = P1OUT & 0xfb;
}
void setCLK1()
{
	P2OUT = P2OUT | 0x10;
}
void clrCLK1()
{
	P2OUT = P2OUT & 0xef;
}
void setDATA()
{
	P2OUT = P2OUT | 0x08;
}
void clrDATA()
{
	P2OUT = P2OUT & 0xf7;
}
void ReadDR1(unsigned char *state)
{
	if((P1IN & 0x01))
		*state = 1;
	else
		*state = 0;	
}
void ReadData(unsigned char *state)
{
	if((P2IN & 0x08))
		*state = 1;
	else
		*state = 0;	
}
void Nrf2401Send8bit(unsigned char data)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		clrCLK1();
		if(data & 0x80)
			setDATA();
		else
			clrDATA();
		//Delay100us(1);
                //j++;
                //j++;
		setCLK1();
		//Delay100us(1);	
		data = data<<1;		
	}
	clrCLK1();
}
void Nrf2401Read8bit(unsigned char *data)
{
	unsigned char i,dat,buf;
	buf = 0;
	clrCLK1();
	for(i=0;i<8;i++)
	{
		setCLK1();
		//Delay100us(1);	
		buf = buf << 1;
		ReadData(&dat);
		if(dat == 1)
			buf = buf | 0x01;
		clrCLK1();
		//Delay100us(1);	
	}
	*data = buf;
}

void SetRxMode(void)
{
	setCS();
//	Delay100us(2000);
        delay300us();
        Nrf2401Send8bit(RxTxConf.buf[RxTxConf.n - 1] | 0x01);
	clrCS();
}
void SetTxMode(void)
{
	setCS();
//	Delay100us(2000);
        delay300us();
        Nrf2401Send8bit(RxTxConf.buf[RxTxConf.n - 1]);
	clrCS();
}

void Nrf2401Config( )
{
	unsigned char i;
       // unsigned char *Flash_ptr;
	//使能配置
	setCS();
//	Delay100us(2000);
        delay300us();
        //从flash中读取功率系数
       *Flash_ptr = (unsigned char *) 0x1000;
        i = *Flash_ptr++;
        RxTxConf.buf[8] = i;
        i = *Flash_ptr++;
        RxTxConf.buf[9] = i;
        i = *Flash_ptr++;
        RxTxConf.buf[10] = i;
        i = *Flash_ptr++;
        RxTxConf.buf[11] = i;
        i = *Flash_ptr++;
        RxTxConf.buf[13] = 0x6c | (i & 0x3);
       //发送配置数据
	for(i=0;i<RxTxConf.n;i++)
	{
		Nrf2401Send8bit(RxTxConf.buf[i]);
	}
	//结束配置
	clrCS();
}

void Nrf2401TX(unsigned char * data,unsigned char *adr)
{
	unsigned char i;
	setCE();
//	Delay100us(2000);
        delay300us();
        //发送地址
	for(i=0; i<4; i++)
	{
		Nrf2401Send8bit(adr[i]);
	}
	//发送数据
	for(i=0; i<26; i++)
	{
		Nrf2401Send8bit(data[i]);
	}
	clrCE();
}
//接受定长的数据,长度在初始化时确定
//接收之前需要事先设定接收模式
void Nrf2401RX(unsigned char * data)
{
	unsigned char i,state;
        unsigned int count;
	i=0;
	//设置data为输入脚
	//P2DIR = P2DIR & 0xf7;
        P2DIR = 0xf7;
	setCE();
//	Delay100us(2000);
        delay300us();
        //等待有效数据到来
	do{
                count ++;
		ReadDR1(&state);
                delayNms(100);
                if(count == 3000)
                  return;
	}while(state == 0x00);
	//读取数据(数据个数必须是字节的整数倍)	
	do{
		Nrf2401Read8bit(&data[i]);
		i++;
		ReadDR1(&state);
	}while(state == 0x01);
	//重新设置data为输出脚
	//P2DIR = P2DIR | 0x08;
        P2DIR = 0xff;
	clrCE();
}
//接受定长的数据,长度在初始化时确定
//接收之前需要事先设定接收模式
unsigned char Nrf2401RXDelay(unsigned char * data)
{
	unsigned char i,state;
        unsigned int count;
	i=0;
        count = 0;
	//设置data为输入脚
	//P2DIR = P2DIR & 0xf7;
        P2DIR = 0xf7;
	setCE();
//	Delay100us(2000);
        delay300us();

        //等待有效数据到来
	do{
                count++;
		ReadDR1(&state);
                delayNms(1);
                if(count == 100)
                  return(0);
	}while(state == 0x00);
	//读取数据(数据个数必须是字节的整数倍)	
	do{
		Nrf2401Read8bit(&data[i]);
		i++;
		ReadDR1(&state);
	}while(state == 0x01);

	//重新设置data为输出脚
	//P2DIR = P2DIR | 0x08;
        P2DIR = 0xff;
	clrCE();
        return(1);
}
//测试主程序
void testRF()
{
	unsigned char adr[4]={0x66,0x88,0x88,0x66};		//要读取的卡号
	unsigned char tdata[26];	//发送到卡的数据
//	unsigned char rdataPC[20];	
	unsigned char i;
	Nrf2401Config();
        for(i=0; i<26; i++)
        {
           tdata[i] = i;
        }
        //循环发送数据
	while(1)
	{
           Nrf2401TX(tdata,adr);
            for(i=0; i<26; i++)
            {
               tdata[i] = tdata[i] + 26;
            }

//           SetRxMode();
//           Nrf2401RX(tdata);
          delayNms(20);
            P3OUT = P3OUT ^ 0x20;
        }
}



⌨️ 快捷键说明

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