|
发表于 2009-8-15 14:01:02
|
显示全部楼层
接收 模块
#include<p18f4550.h>
#include<delays.h>
//
/*************************************************************
引脚连接宏定义
*************************************************************/
#define DATA LATBbits.LATB0//频道1收发数据端
#define CLK1 LATBbits.LATB1//频道1时钟
#define DR1 LATBbits.LATB2//频道1数据已准备好
#define CS LATBbits.LATB3//配置模式片选
#define CE LATBbits.LATB4//收发状态控制
#define PWR_UP LATBbits.LATB5//芯片唤醒
//
/*************************************************************
状态切换宏定义
*************************************************************/
#define NRF2401_Mode_RT() PWR_UP=1;CE=1;CS=0;//收发
#define NRF2401_Mode_Deploy() PWR_UP=1;CE=0;CS=1;//配置
#define NRF2401_Mode_Free() PWR_UP=1;CE=0;CS=0;//空闲
#define NRF2401_Mode_Off() PWR_UP=0//关机
//
/*************************************************************
测试用数据
*************************************************************/
const unsigned char Dat[10]=
{
1,
2,
3,
4,
5,
6,
7,
8,
9,
10
};
//
/*************************************************************
NRF2401配置数据
备 注:当芯片未掉电,且需要切换收发方式时仅需要发送一个字节
*************************************************************/
const unsigned char NRF2401_Deploy_Data[15]=
{
0x50,//DATA2_W通道二数据包长度80bit(10byte),DATA2_W<=256-ADDR_W-CRC(bit)
0x50,//DATA2_W通道一数据包长度,DATA1_W<=256-ADDR_W-CRC(bit)
0x00,//通道二地址(A24),ADDR2
0x00,//通道二地址(A23)
0x00,//通道二地址(A22)
0x00,//通道二地址(A21)
0x02,//通道二地址(A20)
0x00,//通道一地址(A14),ADDR1=0x00000000ff
0x00,//通道一地址(A13)
0x00,//通道一地址(A12)
0x00,//通道一地址(A11)
0xff,//通道一地址(A10)
0x83,//b7~b2:接收地址宽度32位,(和发送端一致,不超过40bit),ADDR_W
//b1~b0:16CRC模式(01-8bit;11-16bit;00/10-no);b1,CRC_L;b0,CRC_EN
0x6F,//b15:通道二禁止(0-通道1;1-通道1和2),RX2_EN
//b14:通讯模式为ShockBurat(0-Direct模式,1-ShockBurst模式),CM
//b13:通信速率为1M(0-250Kbps;1-1Mbps),RFDR_SB
//b12~b10:晶振选择16M(000-4M;001-8M;010-12M;011-16M),XO_F
//b9~b8:发射功率0db(00,01,10,11>-20db,-10db,-5db,0db),RF_PWR
0x05 //b7~b1:频道选择4,RF_CH#
//b0:配置成收模式(0-发送;1-接收),RXEN
};
//
/*************************************************************
IO初始化函数
函数名称:Init_IOforNRF2401();
输入参数:无
输出参数:无
备 注:无
*************************************************************/
void Init_IOforNRF2401(void)
{
TRISBbits.TRISB0=0;//设置DATA引脚为输出
TRISBbits.TRISB1=0;//设置CLK引脚为输出
TRISBbits.TRISB2=1;//设置DR1引脚为输入
TRISBbits.TRISB3=0;//设置CS引脚为输出
TRISBbits.TRISB4=0;//设置CE引脚为输出
TRISBbits.TRISB5=0;//设置PWR_UP引脚为输出
}
//
/*************************************************************
数据串行发送函数
函数名称:NRF2401_DataSerialSend();
输入参数:待发送数据块首地址,待发送数据个数
输出参数:无
备 注:调用前要对NRF2401的工作模式做相应的设定
*************************************************************/
void NRF2401_DataSerialSend(unsigned char *p,unsigned char n)
{
unsigned char i,j;
//
unsigned char d;
//
TRISBbits.TRISB0=0;//设置DATA引脚为输出
TRISBbits.TRISB1=0;//设置CLK引脚为输出
//
CLK1=0;
for(i=0;i<n;i++)//字节数
{
d=*(p++);
for(j=0;j<8;j++)
{
if(d&0x80)//MSB
{
DATA=1;//数据建立时间>500nS
}
else
{
DATA=0;
}
//Nop();
// Nop();
CLK1=1;//最短时钟宽度500nS
d<<=1;
//Nop();
// Nop();
CLK1=0;
}
}
DATA=0;
//CLK1=0;
}
//
/*************************************************************
数据串行读取函数
函数名称:NRF2401_DataSerialRead();
输入参数:接收数觉存储区首地址,接收数觉个数
输出参数:接收是否与设置吻合
备 注:调用前要对NRF2401的工作模式做相应的设定
*************************************************************/
unsigned char NRF2401_DataSerialRead(unsigned char *p,unsigned char n)
{
unsigned char i,j;
unsigned char d;
TRISBbits.TRISB0=1;//设置DATA引脚为输入
TRISBbits.TRISB1=0;//设置CLK引脚为输出
CLK1=0;
for(i=0;i<n;i++)
{
for(j=0;j<8;j++)
{
d<<=1;
CLK1=1;
if(PORTBbits.RB0==1)
{
d|=0x01;
}
else
{
d&=0xfe;
}
CLK1=0;
//Nop();
// Nop();
}
p=d;
}
}
//
/*************************************************************
NRF2401初始化配置
函数名称:NRF2401_Init();
输入参数:无
输出参数:无
备 注:具体配置见NRF2401_Deploy_Data数组
该函数为15个字节全部配置
若只需要改变收发状态,仅需发送NRF2401_Deploy_Data[14]
*************************************************************/
void NRF2401_Init(void)
{
NRF2401_Mode_Free();//进入待机
Delay1KTCYx(3);//由待机进入配置延时3mS
NRF2401_Mode_Deploy();//进入配置模式时引脚保持时间>5uS,两次通信间隔>50nS
Delay10TCYx(3);
NRF2401_DataSerialSend((unsigned char *)NRF2401_Deploy_Data,15);//发送数据
NRF2401_Mode_RT();//从配置模式退出,进入到收发模式,使配置有效
}
//
/*************************************************************
NRF2401收发状态配置
函数名称:NRF2401_R_and_T();
输入参数:n n>0 收状态
n=0 发状态
ch 要选择的频道
输出参数:无
备 注:用于更改收发模式和通信频道
最后两个字节具体配置见NRF2401_Deploy_Data数组
仅用于NRF2401被配置过,且没有掉电的情况
*************************************************************/
void NRF2401_R_and_T(unsigned char n,unsigned char ch)
{
unsigned char i;
NRF2401_Mode_Deploy();//进入配置模式,保持时间>5uS
Delay10TCYx(2);
if(n)
{
i=(ch<<1)|0x01;
}
else
{
i=(ch<<1)&0xfe;
}
NRF2401_DataSerialSend(&i,1);
NRF2401_Mode_RT();//从配置模式退出,进入到收发模式
Delay10TCYx(2);
}
//
/*************************************************************
NRF2401发送数据
函数名称:NRF2401_Send();
输入参数:*Add 发送目标地址
*Dat 待发送数据块首地址
输出参数:无
备 注:确保该函数执行前NRF2401处于发射状态
*************************************************************/
void NRF2401_Send(unsigned char *Add,unsigned char *Dat)
{
NRF2401_Mode_RT();//配置芯片为收发模式
//Delay10TCYx(2);//建立时间>5uS
NRF2401_DataSerialSend(Add,4);//32位地址,根据最初的配置信息改动,或者NRF2401_Deploy_Data[12]>>2表示
NRF2401_DataSerialSend(Dat,10);//10bety数据,根据最初的配置信息改动,或者NRF2401_Deploy_Data[1]表示
NRF2401_Mode_Free();//拉低CE,使芯片开始发送
}
//
/*************************************************************
主函数
*************************************************************/
void main(void)
{
unsigned char DATA_for_R[10];
unsigned char a,b,c,d,e,f,g,h,i,j;
unsigned char k;
ADCON1 = ADCON1 | 0x0f;//关闭模拟IO
TRISA = 0x00;//A口为输出
TRISAbits.TRISA5=0;//LED点亮
Init_IOforNRF2401();//初始化端口
NRF2401_Init();//按表格配置NRF2401
//TRISB=0xff;
while(1)
{
//NRF2401_Init();//按表格配置NRF2401
if(PORTBbits.RB2==1)
{
LATAbits.LATA5=0;
NRF2401_DataSerialRead(DATA_for_R,10);
a=DATA_for_R[0];
b=DATA_for_R[1];
c=DATA_for_R[2];
d=DATA_for_R[3];
e=DATA_for_R[4];
f=DATA_for_R[5];
g=DATA_for_R[6];
h=DATA_for_R[7];
i=DATA_for_R[8];
j=DATA_for_R[9];
for(k=0;k<10;k++)
{
if(DATA_for_R[k]!=Dat[k])
{
LATAbits.LATA5=0;
while(1);
}
}
}
else
{
LATAbits.LATA5=1;
}
}
} |
|