模块代码我这有一个51无线谁能解释一下?谢了
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_UARTTMOD|=0x20; //定时器1的工作方式2SCON=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;//存储收到数据 j=Receive_Packet(pp); //读FIFO,并发送给PC #ifdef DEBUG_UART SBUF=j; while(TI); TI=0; for(i=0;i<j;i++) { SBUF=pp; 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[]={{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 = 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){ 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;
/************************初始化寄存器组1*********************************/SwitchCFG(1); //切换到寄存器组1 for(i=0;i<=8;i++) //写前0-8号寄存器{ for(j=0;j<4;j++){ WriteArr=(RegArrFSKAnalog>>(8*(j) ) )&0xff; //将寄存器值存放到数组中,先高字节 } SPI_Write_Buf((WRITE_REG|i),&(WriteArr),4); //写寄存器} for(i=9;i<=13;i++) //写9-13号寄存器{ for(j=0;j<4;j++){ WriteArr=(RegArrFSKAnalog>>(8*(3-j) ) )&0xff;//将寄存器值存放到数组中,先低字节 } SPI_Write_Buf((WRITE_REG|i),&(WriteArr),4); //写寄存器} SPI_Write_Buf((WRITE_REG|14),&(RegArrFSKAnalogReg14),11);//写14号寄存器 /***************写REG4=0,REG4=0,REG4=0,REG4=0 **************/for(j=0;j<4;j++) { WriteArr=(RegArrFSKAnalog>>(8*(j) ) )&0xff; }WriteArr=WriteArr&0xf4;WriteArr=WriteArr&0x7F;SPI_Write_Buf((WRITE_REG|4),&(WriteArr),4); /***********写REG4=1,写REG4=1 *********************************/WriteArr=WriteArr|0x06;SPI_Write_Buf((WRITE_REG|4),&(WriteArr),4);
/*************写REG4=0,写REG4=0*****************************/ WriteArr=WriteArr&0xf9;SPI_Write_Buf((WRITE_REG|4),&(WriteArr),4); Delay(20);//延时20ms /************写REG4=1,REG4=1,REG4=1,REG4=1***********/for(j=0;j<4;j++) { WriteArr=(RegArrFSKAnalog>>(8*(j) ) )&0xff; }SPI_Write_Buf((WRITE_REG|4),&(WriteArr),4); /******************初始化寄存器组0*********************************/SwitchCFG(0); //切换到寄存器组0 for(i=20;i>=0;i--) { SPI_Write_Reg((WRITE_REG|RegArrFSK),RegArrFSK); } 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); //读寄存器29if(i==0) //是否需要激活 { SPI_Write_Reg(ACTIVATE_CMD,0x73);//激活寄存器29 for(i=22;i>=21;i--) { SPI_Write_Reg((WRITE_REG|RegArrFSK),RegArrFSK);//写寄存器28、29 } }
/************************发射连续波CW*****************************/#ifdef TX_CW SwitchCFG(0);WriteArr = 0x41;WriteArr = 0x11;WriteArr = 0x04;WriteArr = 0x21; SPI_Write_Buf((WRITE_REG|4),&(WriteArr),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_LEN32// 数据包最大长度,最大为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_CMD0x50//ACTIVATE命令#define R_RX_PL_WID_CMD0x60//读数据包长度#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);void Send_Packet(UINT8 type,UINT8* pbuf,UINT8 len);#endif
..............................................................................................................................................................................................................................................................................................
求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理, 解释:MCU+无线IC。
完了 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;//存储收到数据
j=Receive_Packet(pp); //读FIFO,并发送给PC
#ifdef DEBUG_UART
SBUF=j;
while(TI);
TI=0;
for(i=0;i<j;i++)
{
SBUF=pp;
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[]={{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 = 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)
{
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;
/************************初始化寄存器组1*********************************/
SwitchCFG(1); //切换到寄存器组1
for(i=0;i<=8;i++) //写前0-8号寄存器
{
for(j=0;j<4;j++)
{
WriteArr=(RegArrFSKAnalog>>(8*(j) ) )&0xff; //将寄存器值存放到数组中,先高字节
}
SPI_Write_Buf((WRITE_REG|i),&(WriteArr),4); //写寄存器
}
for(i=9;i<=13;i++) //写9-13号寄存器
{
for(j=0;j<4;j++)
{
WriteArr=(RegArrFSKAnalog>>(8*(3-j) ) )&0xff;//将寄存器值存放到数组中,先低字节
}
SPI_Write_Buf((WRITE_REG|i),&(WriteArr),4); //写寄存器
}
SPI_Write_Buf((WRITE_REG|14),&(RegArrFSKAnalogReg14),11);//写14号寄存器
/***************写REG4=0,REG4=0,REG4=0,REG4=0 **************/
for(j=0;j<4;j++)
{
WriteArr=(RegArrFSKAnalog>>(8*(j) ) )&0xff;
}
WriteArr=WriteArr&0xf4;
WriteArr=WriteArr&0x7F;
SPI_Write_Buf((WRITE_REG|4),&(WriteArr),4);
/***********写REG4=1,写REG4=1 *********************************/
WriteArr=WriteArr|0x06;
SPI_Write_Buf((WRITE_REG|4),&(WriteArr),4);
/*************写REG4=0,写REG4=0*****************************/
WriteArr=WriteArr&0xf9;
SPI_Write_Buf((WRITE_REG|4),&(WriteArr),4);
Delay(20);//延时20ms
/************写REG4=1,REG4=1,REG4=1,REG4=1***********/
for(j=0;j<4;j++)
{
WriteArr=(RegArrFSKAnalog>>(8*(j) ) )&0xff;
}
SPI_Write_Buf((WRITE_REG|4),&(WriteArr),4);
/******************初始化寄存器组0*********************************/
SwitchCFG(0); //切换到寄存器组0
for(i=20;i>=0;i--)
{
SPI_Write_Reg((WRITE_REG|RegArrFSK),RegArrFSK);
}
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),RegArrFSK);//写寄存器28、29
}
}
/************************发射连续波CW*****************************/
#ifdef TX_CW SwitchCFG(0);
WriteArr = 0x41;
WriteArr = 0x11;
WriteArr = 0x04;
WriteArr = 0x21;
SPI_Write_Buf((WRITE_REG|4),&(WriteArr),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_LEN32// 数据包最大长度,最大为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_CMD0x50//ACTIVATE命令
#define R_RX_PL_WID_CMD0x60//读数据包长度
#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);
void Send_Packet(UINT8 type,UINT8* pbuf,UINT8 len);
#endif
{:sleepy:}想先听听楼主对这段代码有啥想法 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;//存储收到数据
j=Receive_Packet(pp); //读FIFO,并发送给PC
#ifdef DEBUG_UART
SBUF=j;
while(TI);
TI=0;
for(i=0;i<j;i++)
{
SBUF=pp;
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[]={{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 = 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)
{
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;
/************************初始化寄存器组1*********************************/
SwitchCFG(1); //切换到寄存器组1
for(i=0;i<=8;i++) //写前0-8号寄存器
{
for(j=0;j<4;j++)
{
WriteArr=(RegArrFSKAnalog>>(8*(j) ) )&0xff; //将寄存器值存放到数组中,先高字节
}
SPI_Write_Buf((WRITE_REG|i),&(WriteArr),4); //写寄存器
}
for(i=9;i<=13;i++) //写9-13号寄存器
{
for(j=0;j<4;j++)
{
WriteArr=(RegArrFSKAnalog>>(8*(3-j) ) )&0xff;//将寄存器值存放到数组中,先低字节
}
SPI_Write_Buf((WRITE_REG|i),&(WriteArr),4); //写寄存器
}
SPI_Write_Buf((WRITE_REG|14),&(RegArrFSKAnalogReg14),11);//写14号寄存器
/***************写REG4=0,REG4=0,REG4=0,REG4=0 **************/
for(j=0;j<4;j++)
{
WriteArr=(RegArrFSKAnalog>>(8*(j) ) )&0xff;
}
WriteArr=WriteArr&0xf4;
WriteArr=WriteArr&0x7F;
SPI_Write_Buf((WRITE_REG|4),&(WriteArr),4);
/***********写REG4=1,写REG4=1 *********************************/
WriteArr=WriteArr|0x06;
SPI_Write_Buf((WRITE_REG|4),&(WriteArr),4);
/*************写REG4=0,写REG4=0*****************************/
WriteArr=WriteArr&0xf9;
SPI_Write_Buf((WRITE_REG|4),&(WriteArr),4);
Delay(20);//延时20ms
/************写REG4=1,REG4=1,REG4=1,REG4=1***********/
for(j=0;j<4;j++)
{
WriteArr=(RegArrFSKAnalog>>(8*(j) ) )&0xff;
}
SPI_Write_Buf((WRITE_REG|4),&(WriteArr),4);
/******************初始化寄存器组0*********************************/
SwitchCFG(0); //切换到寄存器组0
for(i=20;i>=0;i--)
{
SPI_Write_Reg((WRITE_REG|RegArrFSK),RegArrFSK);
}
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),RegArrFSK);//写寄存器28、29
}
}
/************************发射连续波CW*****************************/
#ifdef TX_CW SwitchCFG(0);
WriteArr = 0x41;
WriteArr = 0x11;
WriteArr = 0x04;
WriteArr = 0x21;
SPI_Write_Buf((WRITE_REG|4),&(WriteArr),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_LEN32// 数据包最大长度,最大为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_CMD0x50//ACTIVATE命令
#define R_RX_PL_WID_CMD0x60//读数据包长度
#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);
void Send_Packet(UINT8 type,UINT8* pbuf,UINT8 len);
#endif
diannaoza 发表于 2012-8-12 19:12 static/image/common/back.gif
JF24D无线收发模块
2011-01-10 15:08
/**************************************************************** ...
谁能解释一下上面代码中寄存器组与通道是怎么定义的吗?并且有关于寄存器组与通道相关知识吗?请高手指教!!如果有会的,请加QQ:2216054168谢了!! 急求!!!!高手指教!!!!
页:
[1]