|
JF24D无线收发模块
2011-01-10 15:08
/*********************************************************************************************************************************************/
#include"JF24D.h"#define DEBUG_UART/*******************定义KEY和LED管脚**********************************/#define LED P0#define KEY P2
sbit LED1=P0^0;sbit LED2=P0^1;sbit LED3=P0^2;sbit LED4=P0^3;sbit LED5=P0^4;sbit LED6=P0^5;
sbit KEY1=P2^0;sbit KEY2=P2^1;sbit KEY3=P2^2;sbit KEY4=P2^3;sbit KEY5=P2^4;sbit KEY6=P2^5;sbit KEY7=P2^6;sbit KEY8=P2^7;
/***********************定义通道地址********************************/code UINT8 TX_PIPE0[]={0x12,0x34,0x56,0x78,0x01};code UINT8 TX_PIPE1[]={0xc2,0x56,0x34,0x12,0x02};code UINT8 TX_PIPE2[]={0xc3,0x56,0x34,0x12,0x02};code UINT8 TX_PIPE3[]={0xc4,0x56,0x34,0x12,0x02};code UINT8 TX_PIPE4[]={0xc5,0x56,0x34,0x12,0x02};code UINT8 TX_PIPE5[]={0xc6,0x56,0x34,0x12,0x02};
/*********************************************************************函数名称:Delay()**函数描述:延时**入口参数:延时时间 毫秒**出口参数:无********************************************************************/void Delay(UINT8 n){ unsigned char i,m; for(i=0;i<n;i++) { for(m=0;m<220;m++); for(m=0;m<220;m++); }}
/********************************************************************函数名称:main()**函数描述:**入口参数:无**出口参数:无******************************************************************/main(){
UINT8 flag_tx=0,cj; //发射通道标志/***************I/O初始化*****************************************/ P1=0xEF; //P1,与JF24D相连1011 1101 LED=0; //P0,LED全亮 KEY=0xff; //P2,置为输入 IRQ=1; //设置为接收数据包
/***************串口初始化,波特率2400****************************/#ifdef DEBUG_UART TMOD|=0x20; //定时器1的工作方式2 SCON=0x50; //10位异步收发(8位数据),波特率可变(由定时器1的溢出率控制) TH1=0xf4; TL1=0xf4; TR1=1; //启动定时器1#endif Delay(20); //延时 JF24D_Init(); //初始化JF24D LED=0xff; //初始化完成LED全灭 Enter_PTX(); //切换到PTX模式 while(1) { UINT8 code pbuf[]={"1"}; //发射的数据 UINT8 key; key=KEY; if(key!=0xff) { Delay(10); //按键消抖 if(key==KEY) { switch(key) //判断按键键值 { case 0xfe: SPI_Write_Buf(WRITE_REG|10,TX_PIPE0,5); //使用通道0,无应答 flag_tx=0xfb; //修改发射通道标志 break;
case 0xfd: SPI_Write_Buf(WRITE_REG|10,TX_PIPE1,5); //使用通道1,无应答 flag_tx=0xf7; break; case 0xfb: SPI_Write_Buf(WRITE_REG|10,TX_PIPE2,5); //使用通道2,无应答 flag_tx=0xef; break;
case 0xf7: SPI_Write_Buf(WRITE_REG|10,TX_PIPE3,5); //使用通道3,无应答 flag_tx=0xdf; break;
case 0xef: SPI_Write_Buf(WRITE_REG|10,TX_PIPE4,5); //使用通道4,无应答 flag_tx=0xbf; break;
case 0xdf: SPI_Write_Buf(WRITE_REG|10,TX_PIPE5,5); //使用通道5,无应答 flag_tx=0x7f; break; case 0xbf: SPI_Write_Buf(WRITE_REG|10,TX_PIPE0,5); //使用通道0,发射有应答 flag_tx=0x55; break;
case 0x7f: SPI_Write_Buf(WRITE_REG|10,TX_PIPE0,5); //使用通道0,发射有应答 flag_tx=0xaa; break;
default: flag_tx=0; }
if(flag_tx) { UINT8 value; ENTER_TX_RX(); //进入TX Delay(1); if(flag_tx==0x55) Send_Packet(WR_TX_PLOAD,pbuf,5); //写发射数据,有应答 else if(flag_tx==0xaa) Send_Packet(WR_TX_PLOAD,pbuf,16); //写发射数据,有应答 else Send_Packet(W_TX_PAYLOAD_NOACK_CMD,pbuf,16); //写发射数据,无应答 // while(IRQ) //读IRQ,判断发射是否成功 // value=SPI_Read_Reg(STATUS); //读STATUS寄存器 value=cj; if(cj==1) { LED6=0; } #ifdef DEBUG_UART SBUF=value; while(!TI); TI=0; #endif if(value&STATUS_RX_DR) //应答是否带数据 { UINT8 i,j; UINT8 pp[MAX_PACKET_LEN]; //存储收到数据 j=Receive_Packet(pp); //读FIFO,并发送给PC #ifdef DEBUG_UART SBUF=j; while(TI); TI=0; for(i=0;i<j;i++) { SBUF=pp[i]; while(!TI); TI=0; }
#endif
flag_tx=0x3f; //修改发射标志 } if(value&STATUS_MAX_RT) //判断是否收到应答信号 { flag_tx=0; //修改发射标志 SPI_Write_Reg(FLUSH_TX,0); //发射FIFO清空 } SPI_Write_Reg(WRITE_REG|STATUS,value); //清STATUS寄存器 EXIT_TX_RX(); //退出TX LED=LED&flag_tx; //亮相应指示灯 Delay(250); LED=0xff; while(KEY!=0xff); //等待按键松开 } } } }}
/*********************************************************************************************************************************************/#include"JF24D.h"
/*********************寄存器组1初始值**********************************/code UINT32 RegArrFSKAnalog[]={0xF2014B41,0x30064BC0,0x00C4FCA0,0x60350017,0x0B009941, // 0B109941 for 2 Mbps mode0xBE7F0124,0x00400000,0x00000000,0x00000000,0x00000000,0xF64EF5F6,0x5C1851D6,0x4055002D,0x00700000 // 00040000 for 2 Mbps mode};
code UINT8 RegArrFSKAnalogReg14[]={0x41,0x10,0x08,0x82,0x40,0x10,0x08,0xF2,0x7C,0xEF,0xCF};
/**************************寄存器组0初始值********************/code UINT8 RegArrFSK[][2]={{0,0x0F},{1,0x3F},{2,0x3F},{3,0x03},{4,0xff},{5,0x17},{6,0x17},{7,0x07},{8,0x00},{9,0x00},{12,0xc3},{13,0xc4},{14,0xc5},{15,0xc6},{17,0x20},{18,0x20},{19,0x20},{20,0x20},{21,0x20},{22,0x20},{23,0x00},{28,0x3F},{29,0x07}};
code UINT8 RX0_Address[]={0x12,0x34,0x56,0x78,0x01};code UINT8 RX1_Address[]={0xc2,0x56,0x34,0x12,0x02};
/****************************************************************函数名称:SPI_RW()**函数描述:写一个字节到JF24D,并返回读出的字节**入口参数:命令或地址**出口参数:读出的字节**************************************************************/ UINT8 SPI_RW(UINT8 _byte) { UINT8 bit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++) { MOSI = (_byte & 0x80); // 输出,先输出高位 _byte = (_byte << 1); // 下一位输出值移位到高位 SCK = 1; // SCK置位 _byte |= MISO; // 读MISO当前值 SCK = 0; // SCK清零 } return(_byte); // 返回读出的值}
/****************************************************************函数名称:SPI_Write_Reg()**函数描述:写寄存器的值**入口参数:寄存器地址+命令,寄存器的值**出口参数:无**************************************************************/ void SPI_Write_Reg(UINT8 reg, UINT8 value) { CSN = 0; // 清零CSN,使能SPI SPI_RW(reg); // 写寄存器地址+命令 SPI_RW(value); // 写相应的值 CSN = 1; // 置位CSN,禁止SPI} /****************************************************************函数名称:SPI_Read_Reg()**函数描述:读寄存器的值**入口参数:寄存器地址+命令**出口参数:寄存器的值**************************************************************/ UINT8 SPI_Read_Reg(UINT8 reg) { BYTE value; CSN = 0; // 清零CSN,使能SPI SPI_RW(reg); // 写寄存器地址+命令 value = SPI_RW(0); // 读寄存器的值 CSN = 1; // 置位CSN,禁止SPI
return(value); // 返回寄存器的值} /****************************************************************函数名称:SPI_Read_Buf()**函数描述:读多字节寄存器的值**入口参数:寄存器地址+命令,返回值的地址,寄存器值的长度**出口参数:无**************************************************************/ void SPI_Read_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes) { UINT8 byte_ctr; CSN = 0; // 清零CSN,使能SPI SPI_RW(reg); // 写寄存器地址+命令 for(byte_ctr=0;byte_ctr<bytes;byte_ctr++) pBuf[byte_ctr] = SPI_RW(0); // 读寄存器的值 CSN = 1; // 置位CSN,禁止SPI} /****************************************************************函数名称:SPI_Write_Buf()**函数描述:写多字节寄存器的值**入口参数:寄存器地址+命令,写入值的地址,寄存器值的长度**出口参数:无***************************************************************/ void SPI_Write_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes) { UINT8 byte_ctr; CSN = 0; // 清零CSN,使能SPI SPI_RW(reg); // 写寄存器地址+命令 for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // 写寄存器的值 SPI_RW(*(pBuf+byte_ctr)); CSN = 1; // 置位CSN,禁止SPI }
/****************************************************************函数名称:Enter_PRX()**函数描述:切换到PRX模式**入口参数:无**出口参数:无***************************************************************/void Enter_PRX(){ UINT8 value;
SPI_Write_Reg(FLUSH_RX,0);//清空接收FIFO
value=SPI_Read_Reg(STATUS); // 读STATUS寄存器 SPI_Write_Reg(WRITE_REG+STATUS,value);// 清零RX_DR、TX_DS、MAX_RT标志
value=SPI_Read_Reg(CONFIG); // 读CONFIG寄存器
value=value&0xfd;//位1清零 SPI_Write_Reg(WRITE_REG + CONFIG, value); // 清零PWR_UP位,进入POWER_DOWN模式
value=value|0x03; //置位位1,位0 SPI_Write_Reg(WRITE_REG + CONFIG, value); // 置位PWR_UP,PRIM_RX,进入PRX模式}
/****************************************************************函数名称:Enter_PTX()**函数描述:切换到PTX模式**入口参数:无**出口参数:无***************************************************************/void Enter_PTX(){ UINT8 value;
SPI_Write_Reg(FLUSH_TX,0);//清空接收FIFO
value=SPI_Read_Reg(STATUS); // 读STATUS寄存器 SPI_Write_Reg(WRITE_REG+STATUS,value);// 清零RX_DR、TX_DS、MAX_RT标志 value=SPI_Read_Reg(CONFIG); // 读CONFIG寄存器 value=value&0xfd;//位1清零 SPI_Write_Reg(WRITE_REG+CONFIG, value); // 清零PWR_UP位,进入POWER_DOWN模式
value=value|0x02;//置位位1 value=value&0xfe; //位0清零 SPI_Write_Reg(WRITE_REG + CONFIG, value); // 置位PWR_UP,清零PRIM_RX,进入PTX模式}
/****************************************************************函数名称:SwitchCFG()**函数描述:切换寄存器组**入口参数:将要切换到寄存器组,0或1**出口参数:无***************************************************************/ void SwitchCFG(char _cfg){ UINT8 Tmp;
Tmp=SPI_Read_Reg(STATUS); //读STATUS寄存器 Tmp=Tmp&0x80;
if( ( Tmp&&(_cfg==0) ) ||( (Tmp==0)&&_cfg ) ) //判断当前寄存器组是否是将要切换的 SPI_Write_Reg(ACTIVATE_CMD,0x53); //执行切换}
/****************************************************************函数名称:Send_Packet()**函数描述:发射数据包**入口参数:写发射FIFO命令,写入值的地址,寄存器值的长度**出口参数:无***************************************************************/void Send_Packet(UINT8 type,UINT8* pbuf,UINT8 len){ UINT8 fifo_sta;
fifo_sta=SPI_Read_Reg(FIFO_STATUS); // 读寄存器FIFO_STATUS
if((fifo_sta&FIFO_STATUS_TX_FULL)==0)//判断发射FIFO是否满 { SPI_Write_Buf(type, pbuf, len); // 写发射FIFO }}
/****************************************************************函数名称:Receive_Packet()**函数描述:接收数据包**入口参数:读接收FIFO命令,读出值的地址**出口参数:数据包的长度***************************************************************/UINT8 Receive_Packet(UINT8 rx_buf[MAX_PACKET_LEN]){ UINT8 len,fifo_sta;
do { len=SPI_Read_Reg(R_RX_PL_WID_CMD); // 读数据包长度
if(len<=MAX_PACKET_LEN) { SPI_Read_Buf(RD_RX_PLOAD,rx_buf,len);// 读接收FIFO } else { SPI_Write_Reg(FLUSH_RX,0);//数据包长度大于最大长度,清空FIFO }
fifo_sta=SPI_Read_Reg(FIFO_STATUS); //读寄存器FIFO_STATUS }while((fifo_sta&FIFO_STATUS_RX_EMPTY)==0); //如果不为空,继续读 return(len); //返回数据包长度}
/****************************************************************函数名称:JF24D_Init()**函数描述:初始化JF24D**入口参数:无**出口参数:无***************************************************************/ void JF24D_Init(){ INT8 i,j; UINT8 WriteArr[4];
/************************初始化寄存器组1*********************************/ SwitchCFG(1); //切换到寄存器组1 for(i=0;i<=8;i++) //写前0-8号寄存器 { for(j=0;j<4;j++) { WriteArr[j]=(RegArrFSKAnalog[i]>>(8*(j) ) )&0xff; //将寄存器值存放到数组中,先高字节 } SPI_Write_Buf((WRITE_REG|i),&(WriteArr[0]),4); //写寄存器 } for(i=9;i<=13;i++) //写9-13号寄存器 { for(j=0;j<4;j++) { WriteArr[j]=(RegArrFSKAnalog[i]>>(8*(3-j) ) )&0xff; //将寄存器值存放到数组中,先低字节 } SPI_Write_Buf((WRITE_REG|i),&(WriteArr[0]),4); //写寄存器 } SPI_Write_Buf((WRITE_REG|14),&(RegArrFSKAnalogReg14[0]),11); //写14号寄存器 /***************写REG4[0]=0,REG4[1]=0,REG4[3]=0,REG4[23]=0 **************/ for(j=0;j<4;j++) { WriteArr[j]=(RegArrFSKAnalog[4]>>(8*(j) ) )&0xff; } WriteArr[3]=WriteArr[3]&0xf4; WriteArr[1]=WriteArr[1]&0x7F; SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4); /***********写REG4[25]=1,写REG4[26]=1 *********************************/ WriteArr[0]=WriteArr[0]|0x06; SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);
/*************写REG4[25]=0,写REG4[26]=0*****************************/ WriteArr[0]=WriteArr[0]&0xf9; SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4); Delay(20); //延时20ms /************写REG4[0]=1,REG4[1]=1,REG4[3]=1,REG4[23]=1***********/ for(j=0;j<4;j++) { WriteArr[j]=(RegArrFSKAnalog[4]>>(8*(j) ) )&0xff; } SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4); /******************初始化寄存器组0*********************************/ SwitchCFG(0); //切换到寄存器组0 for(i=20;i>=0;i--) { SPI_Write_Reg((WRITE_REG|RegArrFSK[i][0]),RegArrFSK[i][1]); } SPI_Write_Buf((WRITE_REG+RX_ADDR_P0),RX0_Address,5); //写寄存器10,通道0地址 SPI_Write_Buf((WRITE_REG+RX_ADDR_P1),RX1_Address,5); //写寄存器11,通道1地址,及其余通道高位地址 SPI_Write_Buf((WRITE_REG+TX_ADDR),RX0_Address,5); //写寄存器16,发射通道地址 i=SPI_Read_Reg(29); //读寄存器29 if(i==0) //是否需要激活 { SPI_Write_Reg(ACTIVATE_CMD,0x73); //激活寄存器29 for(i=22;i>=21;i--) { SPI_Write_Reg((WRITE_REG|RegArrFSK[i][0]),RegArrFSK[i][1]); //写寄存器28、29 } }
/************************发射连续波CW*****************************/#ifdef TX_CW SwitchCFG(0); WriteArr[0] = 0x41; WriteArr[1] = 0x11; WriteArr[2] = 0x04; WriteArr[3] = 0x21; SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4); while(1);#endif}
/*********************************************************************************************************************************************/
#ifndef __JF24D__#define __JF24D__
#include "REG51F.H"
#define BYTE unsigned char#define INT8 char#define INT16 int#define UINT8 unsigned char#define UINT16 unsigned int#define UINT32 unsigned long
/************JF24D使用I/O声明**************************/sbit CE = P1^4;sbit CSN= P1^3;sbit SCK= P1^5;sbit MOSI= P1^6;sbit MISO= P1^7;sbit IRQ = P3^3;
#define MAX_PACKET_LEN 32// 数据包最大长度,最大为255
/***********SPI命令***********************************/#define READ_REG 0x00 // 读寄存器#define WRITE_REG 0x20 // 写寄存器#define RD_RX_PLOAD 0x61 // 读接收FIFO#define WR_TX_PLOAD 0xA0 // 写发射FIFO#define FLUSH_TX 0xE1 // 清空发射FIFO#define FLUSH_RX 0xE2 // 清空接收FIFO#define REUSE_TX_PL 0xE3 // 重复发射数据包#define W_TX_PAYLOAD_NOACK_CMD 0xb0 //写发射FIFO,无应答#define W_ACK_PAYLOAD_CMD 0xa8 //写应答FIFO#define ACTIVATE_CMD 0x50 //ACTIVATE命令#define R_RX_PL_WID_CMD 0x60 //读数据包长度#define NOP 0xFF // 无操作
/*********寄存器组0的寄存器声明***********************/#define CONFIG 0x00 // 'Config' register address#define EN_AA 0x01 // 'Enable Auto Acknowledgment' register address#define EN_RXADDR 0x02 // 'Enabled RX addresses' register address#define SETUP_AW 0x03 // 'Setup address width' register address#define SETUP_RETR 0x04 // 'Setup Auto. Retrans' register address#define RF_CH 0x05 // 'RF channel' register address#define RF_SETUP 0x06 // 'RF setup' register address#define STATUS 0x07 // 'Status' register address#define OBSERVE_TX 0x08 // 'Observe TX' register address#define CD 0x09 // 'Carrier Detect' register address#define RX_ADDR_P0 0x0A // 'RX address pipe0' register address#define RX_ADDR_P1 0x0B // 'RX address pipe1' register address#define RX_ADDR_P2 0x0C // 'RX address pipe2' register address#define RX_ADDR_P3 0x0D // 'RX address pipe3' register address#define RX_ADDR_P4 0x0E // 'RX address pipe4' register address#define RX_ADDR_P5 0x0F // 'RX address pipe5' register address#define TX_ADDR 0x10 // 'TX address' register address#define RX_PW_P0 0x11 // 'RX payload width, pipe0' register address#define RX_PW_P1 0x12 // 'RX payload width, pipe1' register address#define RX_PW_P2 0x13 // 'RX payload width, pipe2' register address#define RX_PW_P3 0x14 // 'RX payload width, pipe3' register address#define RX_PW_P4 0x15 // 'RX payload width, pipe4' register address#define RX_PW_P5 0x16 // 'RX payload width, pipe5' register address#define FIFO_STATUS 0x17 // 'FIFO Status Register' register address#define PAYLOAD_WIDTH 0x1f // 'payload length of 256 bytes modes register address
/************STATUS寄存器状态********************/#define STATUS_RX_DR 0x40 #define STATUS_TX_DS 0x20#define STATUS_MAX_RT 0x10
#define STATUS_TX_FULL 0x01
/***********FIFO_STATUS寄存器状态**********************/#define FIFO_STATUS_TX_REUSE 0x40#define FIFO_STATUS_TX_FULL 0x20#define FIFO_STATUS_TX_EMPTY 0x10
#define FIFO_STATUS_RX_FULL 0x02#define FIFO_STATUS_RX_EMPTY 0x01
#define ENTER_TX_RX() CE=1 //进入接收或发射#define EXIT_TX_RX() CE=0 //退出接收或发射
/****************使用函数声明*******************************/UINT8 SPI_Read_Reg(UINT8 reg); void SPI_Read_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes);
void SPI_Write_Reg(UINT8 reg, UINT8 value);void SPI_Write_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes);
void SwitchCFG(char _cfg);
void Delay(UINT8 n);
void JF24D_Init();void Enter_PTX();void SwitchToRxMode();UINT8 Receive_Packet(UINT8 rx_buf[MAX_PACKET_LEN]);void Send_Packet(UINT8 type,UINT8* pbuf,UINT8 len);#endif
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|