971626996 发表于 2012-8-12 17:43:48

模块代码我这有一个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

yangshichang110 发表于 2012-8-12 17:56:37

..............................................................................................................................................................................................................................................................................................
求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,

sxmilovebb2 发表于 2012-8-12 18:42:23

解释:MCU+无线IC。
完了

diannaoza 发表于 2012-8-12 18:54:53

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

winterw 发表于 2012-8-12 18:59:42

{:sleepy:}想先听听楼主对这段代码有啥想法

diannaoza 发表于 2012-8-12 19:12:36

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

971626996 发表于 2012-8-13 08:25:29

diannaoza 发表于 2012-8-12 19:12 static/image/common/back.gif
JF24D无线收发模块
2011-01-10 15:08
/**************************************************************** ...

谁能解释一下上面代码中寄存器组与通道是怎么定义的吗?并且有关于寄存器组与通道相关知识吗?请高手指教!!如果有会的,请加QQ:2216054168谢了!!

971626996 发表于 2012-8-13 11:14:49

急求!!!!高手指教!!!!
页: [1]
查看完整版本: 模块代码我这有一个51无线谁能解释一下?谢了