搜索
bottom↓
回复: 7

模块代码我这有一个51无线谁能解释一下?谢了

[复制链接]

出0入0汤圆

发表于 2012-8-12 17:43:48 | 显示全部楼层 |阅读模式
JF24D无线收发模块
2011-01-10 15:08
/*********************************************************************************************************************************************/
#include"JF24D.h"#define DEBUG_UART/*******************定义KEY和LED管脚**********************************/#define LED P0#define KEY P2
sbit LED1=P0^0;sbit LED2=P0^1;sbit LED3=P0^2;sbit LED4=P0^3;sbit LED5=P0^4;sbit LED6=P0^5;
sbit KEY1=P2^0;sbit KEY2=P2^1;sbit KEY3=P2^2;sbit KEY4=P2^3;sbit KEY5=P2^4;sbit KEY6=P2^5;sbit KEY7=P2^6;sbit KEY8=P2^7;
/***********************定义通道地址********************************/code UINT8 TX_PIPE0[]={0x12,0x34,0x56,0x78,0x01};code UINT8 TX_PIPE1[]={0xc2,0x56,0x34,0x12,0x02};code UINT8 TX_PIPE2[]={0xc3,0x56,0x34,0x12,0x02};code UINT8 TX_PIPE3[]={0xc4,0x56,0x34,0x12,0x02};code UINT8 TX_PIPE4[]={0xc5,0x56,0x34,0x12,0x02};code UINT8 TX_PIPE5[]={0xc6,0x56,0x34,0x12,0x02};
/*********************************************************************函数名称:Delay()**函数描述:延时**入口参数:延时时间 毫秒**出口参数:无********************************************************************/void Delay(UINT8 n){  unsigned char i,m;  for(i=0;i<n;i++)   {  for(m=0;m<220;m++);   for(m=0;m<220;m++);  }}
/********************************************************************函数名称:main()**函数描述:**入口参数:无**出口参数:无******************************************************************/main(){
    UINT8 flag_tx=0,cj;  //发射通道标志/***************I/O初始化*****************************************/ P1=0xEF;    //P1,与JF24D相连1011 1101 LED=0;   //P0,LED全亮 KEY=0xff;  //P2,置为输入 IRQ=1;   //设置为接收数据包
/***************串口初始化,波特率2400****************************/#ifdef DEBUG_UART  TMOD|=0x20;   //定时器1的工作方式2  SCON=0x50;  //10位异步收发(8位数据),波特率可变(由定时器1的溢出率控制)   TH1=0xf4;  TL1=0xf4;  TR1=1;  //启动定时器1#endif   Delay(20);   //延时 JF24D_Init();  //初始化JF24D LED=0xff;   //初始化完成LED全灭      Enter_PTX();  //切换到PTX模式    while(1)    {    UINT8 code pbuf[]={"1"};  //发射的数据  UINT8 key;    key=KEY;  if(key!=0xff)  {   Delay(10);  //按键消抖   if(key==KEY)   {          switch(key)     //判断按键键值    {     case 0xfe:      SPI_Write_Buf(WRITE_REG|10,TX_PIPE0,5);  //使用通道0,无应答      flag_tx=0xfb;        //修改发射通道标志         break;
     case 0xfd:      SPI_Write_Buf(WRITE_REG|10,TX_PIPE1,5);    //使用通道1,无应答      flag_tx=0xf7;      break;        case 0xfb:      SPI_Write_Buf(WRITE_REG|10,TX_PIPE2,5);    //使用通道2,无应答      flag_tx=0xef;      break;
     case 0xf7:      SPI_Write_Buf(WRITE_REG|10,TX_PIPE3,5);   //使用通道3,无应答      flag_tx=0xdf;      break;
     case 0xef:      SPI_Write_Buf(WRITE_REG|10,TX_PIPE4,5);    //使用通道4,无应答      flag_tx=0xbf;      break;
     case 0xdf:      SPI_Write_Buf(WRITE_REG|10,TX_PIPE5,5);  //使用通道5,无应答      flag_tx=0x7f;      break;           case 0xbf:      SPI_Write_Buf(WRITE_REG|10,TX_PIPE0,5);    //使用通道0,发射有应答      flag_tx=0x55;      break;
     case 0x7f:      SPI_Write_Buf(WRITE_REG|10,TX_PIPE0,5);    //使用通道0,发射有应答      flag_tx=0xaa;      break;
     default:      flag_tx=0;    }
    if(flag_tx)    {     UINT8 value;          ENTER_TX_RX();   //进入TX        Delay(1);       if(flag_tx==0x55)      Send_Packet(WR_TX_PLOAD,pbuf,5);   //写发射数据,有应答     else if(flag_tx==0xaa)      Send_Packet(WR_TX_PLOAD,pbuf,16);   //写发射数据,有应答     else      Send_Packet(W_TX_PAYLOAD_NOACK_CMD,pbuf,16);   //写发射数据,无应答                  // while(IRQ)   //读IRQ,判断发射是否成功        //     value=SPI_Read_Reg(STATUS);  //读STATUS寄存器     value=cj;     if(cj==1)      {       LED6=0;      }    #ifdef DEBUG_UART        SBUF=value;      while(!TI);     TI=0;    #endif                  if(value&STATUS_RX_DR)   //应答是否带数据           {            UINT8 i,j;      UINT8 pp[MAX_PACKET_LEN];  //存储收到数据       j=Receive_Packet(pp); //读FIFO,并发送给PC           #ifdef DEBUG_UART              SBUF=j;      while(TI);      TI=0;      for(i=0;i<j;i++)      {       SBUF=pp[i];       while(!TI);       TI=0;      }
     #endif
      flag_tx=0x3f;     //修改发射标志            }                if(value&STATUS_MAX_RT)  //判断是否收到应答信号         {      flag_tx=0;    //修改发射标志      SPI_Write_Reg(FLUSH_TX,0);  //发射FIFO清空         }          SPI_Write_Reg(WRITE_REG|STATUS,value);    //清STATUS寄存器                    EXIT_TX_RX();        //退出TX       LED=LED&flag_tx;       //亮相应指示灯   Delay(250);   LED=0xff;           while(KEY!=0xff);     //等待按键松开         }       }  }  }}

/*********************************************************************************************************************************************/#include"JF24D.h"
/*********************寄存器组1初始值**********************************/code UINT32 RegArrFSKAnalog[]={0xF2014B41,0x30064BC0,0x00C4FCA0,0x60350017,0x0B009941, // 0B109941 for 2 Mbps mode0xBE7F0124,0x00400000,0x00000000,0x00000000,0x00000000,0xF64EF5F6,0x5C1851D6,0x4055002D,0x00700000 // 00040000 for 2 Mbps mode};
code UINT8 RegArrFSKAnalogReg14[]={0x41,0x10,0x08,0x82,0x40,0x10,0x08,0xF2,0x7C,0xEF,0xCF};
/**************************寄存器组0初始值********************/code UINT8 RegArrFSK[][2]={{0,0x0F},{1,0x3F},{2,0x3F},{3,0x03},{4,0xff},{5,0x17},{6,0x17},{7,0x07},{8,0x00},{9,0x00},{12,0xc3},{13,0xc4},{14,0xc5},{15,0xc6},{17,0x20},{18,0x20},{19,0x20},{20,0x20},{21,0x20},{22,0x20},{23,0x00},{28,0x3F},{29,0x07}};
code UINT8 RX0_Address[]={0x12,0x34,0x56,0x78,0x01};code UINT8 RX1_Address[]={0xc2,0x56,0x34,0x12,0x02};
/****************************************************************函数名称:SPI_RW()**函数描述:写一个字节到JF24D,并返回读出的字节**入口参数:命令或地址**出口参数:读出的字节**************************************************************/      UINT8 SPI_RW(UINT8 _byte)                                   {                                                           UINT8 bit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++)   {  MOSI = (_byte & 0x80);         // 输出,先输出高位  _byte = (_byte << 1);           // 下一位输出值移位到高位  SCK = 1;                      // SCK置位  _byte |= MISO;          // 读MISO当前值  SCK = 0;                // SCK清零      } return(_byte);               // 返回读出的值}                                                                 
/****************************************************************函数名称:SPI_Write_Reg()**函数描述:写寄存器的值**入口参数:寄存器地址+命令,寄存器的值**出口参数:无**************************************************************/                                                                                                                                                                      void SPI_Write_Reg(UINT8 reg, UINT8 value)                { CSN = 0;                   // 清零CSN,使能SPI SPI_RW(reg);      // 写寄存器地址+命令 SPI_RW(value);             // 写相应的值 CSN = 1;                   // 置位CSN,禁止SPI}                                                                                                                           /****************************************************************函数名称:SPI_Read_Reg()**函数描述:读寄存器的值**入口参数:寄存器地址+命令**出口参数:寄存器的值**************************************************************/                                                  UINT8 SPI_Read_Reg(UINT8 reg)                              {                                                           BYTE value; CSN = 0;                // 清零CSN,使能SPI SPI_RW(reg);            // 写寄存器地址+命令 value = SPI_RW(0);    // 读寄存器的值 CSN = 1;                // 置位CSN,禁止SPI
return(value);        // 返回寄存器的值}                                                                /****************************************************************函数名称:SPI_Read_Buf()**函数描述:读多字节寄存器的值**入口参数:寄存器地址+命令,返回值的地址,寄存器值的长度**出口参数:无**************************************************************/                                                                                                            void SPI_Read_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes)    {                                                           UINT8 byte_ctr;                                                                                         CSN = 0;                      // 清零CSN,使能SPI SPI_RW(reg);         // 写寄存器地址+命令                                                            for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)            pBuf[byte_ctr] = SPI_RW(0);    // 读寄存器的值                                                            CSN = 1;                           // 置位CSN,禁止SPI}                                                                                                                            /****************************************************************函数名称:SPI_Write_Buf()**函数描述:写多字节寄存器的值**入口参数:寄存器地址+命令,写入值的地址,寄存器值的长度**出口参数:无***************************************************************/    void SPI_Write_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes)   {                                                           UINT8 byte_ctr;                                                                                         CSN = 0;                   // 清零CSN,使能SPI SPI_RW(reg);    // 写寄存器地址+命令 for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // 写寄存器的值  SPI_RW(*(pBuf+byte_ctr)); CSN = 1;                 // 置位CSN,禁止SPI     }                                                                 
/****************************************************************函数名称:Enter_PRX()**函数描述:切换到PRX模式**入口参数:无**出口参数:无***************************************************************/void Enter_PRX(){ UINT8 value;
SPI_Write_Reg(FLUSH_RX,0);//清空接收FIFO
value=SPI_Read_Reg(STATUS); // 读STATUS寄存器 SPI_Write_Reg(WRITE_REG+STATUS,value);// 清零RX_DR、TX_DS、MAX_RT标志
value=SPI_Read_Reg(CONFIG); // 读CONFIG寄存器
value=value&0xfd;//位1清零   SPI_Write_Reg(WRITE_REG + CONFIG, value); // 清零PWR_UP位,进入POWER_DOWN模式
value=value|0x03; //置位位1,位0   SPI_Write_Reg(WRITE_REG + CONFIG, value); // 置位PWR_UP,PRIM_RX,进入PRX模式}
/****************************************************************函数名称:Enter_PTX()**函数描述:切换到PTX模式**入口参数:无**出口参数:无***************************************************************/void Enter_PTX(){ UINT8 value;
SPI_Write_Reg(FLUSH_TX,0);//清空接收FIFO
value=SPI_Read_Reg(STATUS); // 读STATUS寄存器 SPI_Write_Reg(WRITE_REG+STATUS,value);// 清零RX_DR、TX_DS、MAX_RT标志  value=SPI_Read_Reg(CONFIG); // 读CONFIG寄存器 value=value&0xfd;//位1清零 SPI_Write_Reg(WRITE_REG+CONFIG, value); // 清零PWR_UP位,进入POWER_DOWN模式
value=value|0x02;//置位位1 value=value&0xfe; //位0清零 SPI_Write_Reg(WRITE_REG + CONFIG, value); // 置位PWR_UP,清零PRIM_RX,进入PTX模式}
/****************************************************************函数名称:SwitchCFG()**函数描述:切换寄存器组**入口参数:将要切换到寄存器组,0或1**出口参数:无***************************************************************/        void SwitchCFG(char _cfg){ UINT8 Tmp;
Tmp=SPI_Read_Reg(STATUS);  //读STATUS寄存器 Tmp=Tmp&0x80;     
if( ( Tmp&&(_cfg==0) ) ||( (Tmp==0)&&_cfg ) )    //判断当前寄存器组是否是将要切换的 SPI_Write_Reg(ACTIVATE_CMD,0x53);     //执行切换}
/****************************************************************函数名称:Send_Packet()**函数描述:发射数据包**入口参数:写发射FIFO命令,写入值的地址,寄存器值的长度**出口参数:无***************************************************************/void Send_Packet(UINT8 type,UINT8* pbuf,UINT8 len){ UINT8 fifo_sta;
fifo_sta=SPI_Read_Reg(FIFO_STATUS); // 读寄存器FIFO_STATUS
if((fifo_sta&FIFO_STATUS_TX_FULL)==0)//判断发射FIFO是否满  {    SPI_Write_Buf(type, pbuf, len); // 写发射FIFO  }}
/****************************************************************函数名称:Receive_Packet()**函数描述:接收数据包**入口参数:读接收FIFO命令,读出值的地址**出口参数:数据包的长度***************************************************************/UINT8 Receive_Packet(UINT8 rx_buf[MAX_PACKET_LEN]){ UINT8 len,fifo_sta;
do {  len=SPI_Read_Reg(R_RX_PL_WID_CMD); // 读数据包长度
  if(len<=MAX_PACKET_LEN)  {    SPI_Read_Buf(RD_RX_PLOAD,rx_buf,len);// 读接收FIFO  }  else  {   SPI_Write_Reg(FLUSH_RX,0);//数据包长度大于最大长度,清空FIFO  }
  fifo_sta=SPI_Read_Reg(FIFO_STATUS); //读寄存器FIFO_STATUS      }while((fifo_sta&FIFO_STATUS_RX_EMPTY)==0); //如果不为空,继续读  return(len);    //返回数据包长度}
/****************************************************************函数名称:JF24D_Init()**函数描述:初始化JF24D**入口参数:无**出口参数:无***************************************************************/ void JF24D_Init(){ INT8 i,j; UINT8 WriteArr[4];
/************************初始化寄存器组1*********************************/  SwitchCFG(1);    //切换到寄存器组1                  for(i=0;i<=8;i++)    //写前0-8号寄存器  {    for(j=0;j<4;j++)  {         WriteArr[j]=(RegArrFSKAnalog[i]>>(8*(j) ) )&0xff;   //将寄存器值存放到数组中,先高字节     }     SPI_Write_Buf((WRITE_REG|i),&(WriteArr[0]),4);   //写寄存器  }                   for(i=9;i<=13;i++)            //写9-13号寄存器  {    for(j=0;j<4;j++)  {     WriteArr[j]=(RegArrFSKAnalog[i]>>(8*(3-j) ) )&0xff;  //将寄存器值存放到数组中,先低字节     }    SPI_Write_Buf((WRITE_REG|i),&(WriteArr[0]),4);    //写寄存器  } SPI_Write_Buf((WRITE_REG|14),&(RegArrFSKAnalogReg14[0]),11);  //写14号寄存器 /***************写REG4[0]=0,REG4[1]=0,REG4[3]=0,REG4[23]=0 **************/  for(j=0;j<4;j++) {     WriteArr[j]=(RegArrFSKAnalog[4]>>(8*(j) ) )&0xff;   }  WriteArr[3]=WriteArr[3]&0xf4;  WriteArr[1]=WriteArr[1]&0x7F;  SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4); /***********写REG4[25]=1,写REG4[26]=1 *********************************/  WriteArr[0]=WriteArr[0]|0x06;  SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);
/*************写REG4[25]=0,写REG4[26]=0*****************************/   WriteArr[0]=WriteArr[0]&0xf9;  SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);   Delay(20);  //延时20ms /************写REG4[0]=1,REG4[1]=1,REG4[3]=1,REG4[23]=1***********/  for(j=0;j<4;j++) {     WriteArr[j]=(RegArrFSKAnalog[4]>>(8*(j) ) )&0xff;   }  SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4); /******************初始化寄存器组0*********************************/  SwitchCFG(0);   //切换到寄存器组0   for(i=20;i>=0;i--) {     SPI_Write_Reg((WRITE_REG|RegArrFSK[i][0]),RegArrFSK[i][1]);   }   SPI_Write_Buf((WRITE_REG+RX_ADDR_P0),RX0_Address,5);   //写寄存器10,通道0地址    SPI_Write_Buf((WRITE_REG+RX_ADDR_P1),RX1_Address,5);   //写寄存器11,通道1地址,及其余通道高位地址   SPI_Write_Buf((WRITE_REG+TX_ADDR),RX0_Address,5);    //写寄存器16,发射通道地址   i=SPI_Read_Reg(29);   //读寄存器29  if(i==0)    //是否需要激活 {     SPI_Write_Reg(ACTIVATE_CMD,0x73);  //激活寄存器29    for(i=22;i>=21;i--)   {       SPI_Write_Reg((WRITE_REG|RegArrFSK[i][0]),RegArrFSK[i][1]);  //写寄存器28、29     } }
/************************发射连续波CW*****************************/#ifdef TX_CW SwitchCFG(0);  WriteArr[0] = 0x41;  WriteArr[1] = 0x11;  WriteArr[2] = 0x04;  WriteArr[3] = 0x21;     SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);  while(1);#endif}


/*********************************************************************************************************************************************/
#ifndef __JF24D__#define __JF24D__
#include "REG51F.H"
#define BYTE unsigned char#define INT8 char#define INT16 int#define UINT8 unsigned char#define UINT16 unsigned int#define UINT32 unsigned long
/************JF24D使用I/O声明**************************/sbit CE =  P1^4;sbit CSN=  P1^3;sbit SCK=  P1^5;sbit MOSI= P1^6;sbit MISO= P1^7;sbit IRQ = P3^3;
#define MAX_PACKET_LEN  32// 数据包最大长度,最大为255
/***********SPI命令***********************************/#define READ_REG        0x00  // 读寄存器#define WRITE_REG       0x20  // 写寄存器#define RD_RX_PLOAD     0x61  // 读接收FIFO#define WR_TX_PLOAD     0xA0  // 写发射FIFO#define FLUSH_TX        0xE1  // 清空发射FIFO#define FLUSH_RX        0xE2  // 清空接收FIFO#define REUSE_TX_PL     0xE3  // 重复发射数据包#define W_TX_PAYLOAD_NOACK_CMD 0xb0  //写发射FIFO,无应答#define W_ACK_PAYLOAD_CMD 0xa8  //写应答FIFO#define ACTIVATE_CMD  0x50  //ACTIVATE命令#define R_RX_PL_WID_CMD  0x60  //读数据包长度#define NOP             0xFF  // 无操作
/*********寄存器组0的寄存器声明***********************/#define CONFIG          0x00  // 'Config' register address#define EN_AA           0x01  // 'Enable Auto Acknowledgment' register address#define EN_RXADDR       0x02  // 'Enabled RX addresses' register address#define SETUP_AW        0x03  // 'Setup address width' register address#define SETUP_RETR      0x04  // 'Setup Auto. Retrans' register address#define RF_CH           0x05  // 'RF channel' register address#define RF_SETUP        0x06  // 'RF setup' register address#define STATUS          0x07  // 'Status' register address#define OBSERVE_TX      0x08  // 'Observe TX' register address#define CD              0x09  // 'Carrier Detect' register address#define RX_ADDR_P0      0x0A  // 'RX address pipe0' register address#define RX_ADDR_P1      0x0B  // 'RX address pipe1' register address#define RX_ADDR_P2      0x0C  // 'RX address pipe2' register address#define RX_ADDR_P3      0x0D  // 'RX address pipe3' register address#define RX_ADDR_P4      0x0E  // 'RX address pipe4' register address#define RX_ADDR_P5      0x0F  // 'RX address pipe5' register address#define TX_ADDR         0x10  // 'TX address' register address#define RX_PW_P0        0x11  // 'RX payload width, pipe0' register address#define RX_PW_P1        0x12  // 'RX payload width, pipe1' register address#define RX_PW_P2        0x13  // 'RX payload width, pipe2' register address#define RX_PW_P3        0x14  // 'RX payload width, pipe3' register address#define RX_PW_P4        0x15  // 'RX payload width, pipe4' register address#define RX_PW_P5        0x16  // 'RX payload width, pipe5' register address#define FIFO_STATUS     0x17  // 'FIFO Status Register' register address#define PAYLOAD_WIDTH   0x1f  // 'payload length of 256 bytes modes register address
/************STATUS寄存器状态********************/#define STATUS_RX_DR 0x40  #define STATUS_TX_DS 0x20#define STATUS_MAX_RT 0x10
#define STATUS_TX_FULL 0x01
/***********FIFO_STATUS寄存器状态**********************/#define FIFO_STATUS_TX_REUSE 0x40#define FIFO_STATUS_TX_FULL 0x20#define FIFO_STATUS_TX_EMPTY 0x10
#define FIFO_STATUS_RX_FULL 0x02#define FIFO_STATUS_RX_EMPTY 0x01
#define ENTER_TX_RX() CE=1    //进入接收或发射#define EXIT_TX_RX()  CE=0    //退出接收或发射
/****************使用函数声明*******************************/UINT8 SPI_Read_Reg(UINT8 reg);   void SPI_Read_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes);
void SPI_Write_Reg(UINT8 reg, UINT8 value);void SPI_Write_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes);
void SwitchCFG(char _cfg);
void Delay(UINT8 n);
void JF24D_Init();void Enter_PTX();void SwitchToRxMode();UINT8 Receive_Packet(UINT8 rx_buf[MAX_PACKET_LEN]);void Send_Packet(UINT8 type,UINT8* pbuf,UINT8 len);#endif

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-8-12 17:56:37 | 显示全部楼层
..............................................................................................................................................................................................................................................................................................
求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,求整理,

出0入0汤圆

发表于 2012-8-12 18:42:23 | 显示全部楼层
解释:MCU+无线IC。
完了

出0入0汤圆

发表于 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[MAX_PACKET_LEN];  //存储收到数据      
                                       j=Receive_Packet(pp); //读FIFO,并发送给PC           
                                       #ifdef DEBUG_UART              
                                       SBUF=j;     
                                        while(TI);   
                                          TI=0;      
                                          for(i=0;i<j;i++)     
                                           {      
                                           SBUF=pp[i];      
                                           while(!TI);      
                                           TI=0;     
                                            }
                             #endif
                              flag_tx=0x3f;     //修改发射标志           
                               }               
                               if(value&STATUS_MAX_RT)  //判断是否收到应答信号        
                                {      
                                        flag_tx=0;    //修改发射标志      
                                SPI_Write_Reg(FLUSH_TX,0);  //发射FIFO清空      
                                }         
                                SPI_Write_Reg(WRITE_REG|STATUS,value);    //清STATUS寄存器                  
                                EXIT_TX_RX();        //退出TX      
                                LED=LED&flag_tx;       //亮相应指示灯   
                                Delay(250);   
                                LED=0xff;         
                                while(KEY!=0xff);     //等待按键松开      
                            }
                                               
                        }  
                }  
        }
}

/*********************************************************************************************************************************************/
#include"JF24D.h"
/*********************寄存器组1初始值**********************************/
code UINT32 RegArrFSKAnalog[]={0xF2014B41,0x30064BC0,0x00C4FCA0,0x60350017,0x0B009941,
// 0B109941 for 2 Mbps mode0xBE7F0124,0x00400000,0x00000000,0x00000000,0x00000000,0xF64EF5F6,0x5C1851D6,0x4055002D,0x00700000
// 00040000 for 2 Mbps mode};
code UINT8 RegArrFSKAnalogReg14[]={0x41,0x10,0x08,0x82,0x40,0x10,0x08,0xF2,0x7C,0xEF,0xCF};

/**************************寄存器组0初始值********************/
code UINT8 RegArrFSK[][2]={{0,0x0F},{1,0x3F},{2,0x3F},{3,0x03},{4,0xff},{5,0x17},{6,0x17},{7,0x07},{8,0x00}
,{9,0x00},{12,0xc3},{13,0xc4},{14,0xc5},{15,0xc6},{17,0x20},{18,0x20}
,{19,0x20},{20,0x20},{21,0x20},{22,0x20},{23,0x00},{28,0x3F},{29,0x07}};
code UINT8 RX0_Address[]={0x12,0x34,0x56,0x78,0x01};
code UINT8 RX1_Address[]={0xc2,0x56,0x34,0x12,0x02};

/****************************************************************
函数名称:SPI_RW()**函数描述:写一个字节到JF24D,并返回读出的字节
**入口参数:命令或地址**出口参数:读出的字节
**************************************************************/      
UINT8 SPI_RW(UINT8 _byte)                                   
{                                                           
UINT8 bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)   
{  
        MOSI = (_byte & 0x80);         // 输出,先输出高位
_byte = (_byte << 1);           // 下一位输出值移位到高位  
SCK = 1;                      // SCK置位  
_byte |= MISO;          // 读MISO当前值
  SCK = 0;                // SCK清零      
  }
  return(_byte);               // 返回读出的值
  }                                                                 
/****************************************************************
函数名称:SPI_Write_Reg()
**函数描述:写寄存器的值
**入口参数:寄存器地址+命令,寄存器的值**出口参数:无
**************************************************************/                                                                                                                                                                      void SPI_Write_Reg(UINT8 reg, UINT8 value)                { CSN = 0;                   // 清零CSN,使能SPI SPI_RW(reg);      // 写寄存器地址+命令 SPI_RW(value);             // 写相应的值 CSN = 1;                   // 置位CSN,禁止SPI}                                                                                                                           /****************************************************************函数名称:SPI_Read_Reg()**函数描述:读寄存器的值**入口参数:寄存器地址+命令**出口参数:寄存器的值**************************************************************/                                                  UINT8 SPI_Read_Reg(UINT8 reg)                              {                                                           BYTE value; CSN = 0;                // 清零CSN,使能SPI SPI_RW(reg);            // 写寄存器地址+命令 value = SPI_RW(0);    // 读寄存器的值 CSN = 1;                // 置位CSN,禁止SPI
return(value);        // 返回寄存器的值}                                                               
/****************************************************************
函数名称:SPI_Read_Buf()**函数描述:读多字节寄存器的值
**入口参数:寄存器地址+命令,返回值的地址,寄存器值的长度
**出口参数:无
**************************************************************/                                                                                                            void SPI_Read_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes)    {                                                           UINT8 byte_ctr;                                                                                         CSN = 0;                      // 清零CSN,使能SPI SPI_RW(reg);         // 写寄存器地址+命令                                                            for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)            pBuf[byte_ctr] = SPI_RW(0);    // 读寄存器的值                                                            CSN = 1;                           // 置位CSN,禁止SPI}                                                                                                                            /****************************************************************函数名称:SPI_Write_Buf()**函数描述:写多字节寄存器的值**入口参数:寄存器地址+命令,写入值的地址,寄存器值的长度**出口参数:无***************************************************************/    void SPI_Write_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes)   {                                                           UINT8 byte_ctr;                                                                                         CSN = 0;                   // 清零CSN,使能SPI SPI_RW(reg);    // 写寄存器地址+命令 for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // 写寄存器的值  SPI_RW(*(pBuf+byte_ctr)); CSN = 1;                 // 置位CSN,禁止SPI     }                                                                 
/****************************************************************
函数名称:Enter_PRX()
**函数描述:切换到PRX模式**入口参数:无
**出口参数:无
***************************************************************/
void Enter_PRX()
{
UINT8 value;
SPI_Write_Reg(FLUSH_RX,0);//清空接收FIFO
value=SPI_Read_Reg(STATUS); // 读STATUS寄存器 SPI_Write_Reg(WRITE_REG+STATUS,value);// 清零RX_DR、TX_DS、MAX_RT标志
value=SPI_Read_Reg(CONFIG); // 读CONFIG寄存器
value=value&0xfd;//位1清零   
SPI_Write_Reg(WRITE_REG + CONFIG, value); // 清零PWR_UP位,进入POWER_DOWN模式
value=value|0x03; //置位位1,位0   
SPI_Write_Reg(WRITE_REG + CONFIG, value); // 置位PWR_UP,PRIM_RX,进入PRX模式
}
/****************************************************************
函数名称:Enter_PTX()
**函数描述:切换到PTX模式
**入口参数:无**出口参数:无
***************************************************************/
void Enter_PTX()
{
UINT8 value;
SPI_Write_Reg(FLUSH_TX,0);//清空接收FIFO
value=SPI_Read_Reg(STATUS); // 读STATUS寄存器
SPI_Write_Reg(WRITE_REG+STATUS,value);// 清零RX_DR、TX_DS、MAX_RT标志
value=SPI_Read_Reg(CONFIG); // 读CONFIG寄存器
value=value&0xfd;//位1清零
SPI_Write_Reg(WRITE_REG+CONFIG, value); // 清零PWR_UP位,进入POWER_DOWN模式
value=value|0x02;//置位位1
value=value&0xfe; //位0清零
SPI_Write_Reg(WRITE_REG + CONFIG, value); // 置位PWR_UP,清零PRIM_RX,进入PTX模式
}

/****************************************************************
函数名称:SwitchCFG()
**函数描述:切换寄存器组
**入口参数:将要切换到寄存器组,0或1
**出口参数:无
***************************************************************/      
void SwitchCFG(char _cfg)
{
UINT8 Tmp;
Tmp=SPI_Read_Reg(STATUS);  //读STATUS寄存器
Tmp=Tmp&0x80;     
if( ( Tmp&&(_cfg==0) ) ||( (Tmp==0)&&_cfg ) )    //判断当前寄存器组是否是将要切换的
SPI_Write_Reg(ACTIVATE_CMD,0x53);     //执行切换
}

/****************************************************************
函数名称:Send_Packet()**函数描述:发射数据包
**入口参数:写发射FIFO命令,写入值的地址,寄存器值的长度
**出口参数:无
***************************************************************/
void Send_Packet(UINT8 type,UINT8* pbuf,UINT8 len)
{
UINT8 fifo_sta;
fifo_sta=SPI_Read_Reg(FIFO_STATUS); // 读寄存器FIFO_STATUS

if((fifo_sta&FIFO_STATUS_TX_FULL)==0)//判断发射FIFO是否满  
{   
        SPI_Write_Buf(type, pbuf, len); // 写发射FIFO  
}
}
/****************************************************************
函数名称:Receive_Packet()
**函数描述:接收数据包
**入口参数:读接收FIFO命令,读出值的地址
**出口参数:数据包的长度
***************************************************************/
UINT8 Receive_Packet(UINT8 rx_buf[MAX_PACKET_LEN])
{
UINT8 len,fifo_sta;
do {  
        len=SPI_Read_Reg(R_RX_PL_WID_CMD); // 读数据包长度
  if(len<=MAX_PACKET_LEN)  
  {   
          SPI_Read_Buf(RD_RX_PLOAD,rx_buf,len);// 读接收FIFO  
  }  
  else  
  {  
           SPI_Write_Reg(FLUSH_RX,0);//数据包长度大于最大长度,清空FIFO  
  }
          fifo_sta=SPI_Read_Reg(FIFO_STATUS); //读寄存器FIFO_STATUS      
  }
  while((fifo_sta&FIFO_STATUS_RX_EMPTY)==0); //如果不为空,继续读  
  return(len);    //返回数据包长度
  }
/****************************************************************
函数名称:JF24D_Init()
**函数描述:初始化JF24D
**入口参数:无
**出口参数:无
***************************************************************/
void JF24D_Init()
{
INT8 i,j; UINT8 WriteArr[4];
/************************初始化寄存器组1*********************************/  
SwitchCFG(1);    //切换到寄存器组1                  
for(i=0;i<=8;i++)    //写前0-8号寄存器  
{   
        for(j=0;j<4;j++)  
        {         
        WriteArr[j]=(RegArrFSKAnalog[i]>>(8*(j) ) )&0xff;   //将寄存器值存放到数组中,先高字节     
        }     
        SPI_Write_Buf((WRITE_REG|i),&(WriteArr[0]),4);   //写寄存器  
}                  

for(i=9;i<=13;i++)            //写9-13号寄存器  
{   
        for(j=0;j<4;j++)  
        {     
        WriteArr[j]=(RegArrFSKAnalog[i]>>(8*(3-j) ) )&0xff;  //将寄存器值存放到数组中,先低字节     
        }   
        SPI_Write_Buf((WRITE_REG|i),&(WriteArr[0]),4);    //写寄存器  
}
SPI_Write_Buf((WRITE_REG|14),&(RegArrFSKAnalogReg14[0]),11);  //写14号寄存器
/***************写REG4[0]=0,REG4[1]=0,REG4[3]=0,REG4[23]=0 **************/  
for(j=0;j<4;j++)
{     
        WriteArr[j]=(RegArrFSKAnalog[4]>>(8*(j) ) )&0xff;   
}  
WriteArr[3]=WriteArr[3]&0xf4;  
WriteArr[1]=WriteArr[1]&0x7F;  
SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);

/***********写REG4[25]=1,写REG4[26]=1 *********************************/  
WriteArr[0]=WriteArr[0]|0x06;  
SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);

/*************写REG4[25]=0,写REG4[26]=0*****************************/   
WriteArr[0]=WriteArr[0]&0xf9;
SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);   
Delay(20);  //延时20ms

/************写REG4[0]=1,REG4[1]=1,REG4[3]=1,REG4[23]=1***********/  
for(j=0;j<4;j++)
{     
        WriteArr[j]=(RegArrFSKAnalog[4]>>(8*(j) ) )&0xff;   
}  
SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);
/******************初始化寄存器组0*********************************/  
SwitchCFG(0);   //切换到寄存器组0   
for(i=20;i>=0;i--)
{     
        SPI_Write_Reg((WRITE_REG|RegArrFSK[i][0]),RegArrFSK[i][1]);   
}   
SPI_Write_Buf((WRITE_REG+RX_ADDR_P0),RX0_Address,5);   //写寄存器10,通道0地址   
SPI_Write_Buf((WRITE_REG+RX_ADDR_P1),RX1_Address,5);   //写寄存器11,通道1地址,及其余通道高位地址  
  SPI_Write_Buf((WRITE_REG+TX_ADDR),RX0_Address,5);    //写寄存器16,发射通道地址   
  i=SPI_Read_Reg(29);   //读寄存器29
   if(i==0)    //是否需要激活
   {     
           SPI_Write_Reg(ACTIVATE_CMD,0x73);  //激活寄存器29   
           for(i=22;i>=21;i--)  
    {      
            SPI_Write_Reg((WRITE_REG|RegArrFSK[i][0]),RegArrFSK[i][1]);  //写寄存器28、29     
    }
   }

/************************发射连续波CW*****************************/
#ifdef TX_CW SwitchCFG(0);
WriteArr[0] = 0x41;  
WriteArr[1] = 0x11;  
WriteArr[2] = 0x04;  
WriteArr[3] = 0x21;   
  SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);  
  while(1);
#endif
}


/*********************************************************************************************************************************************/
#ifndef __JF24D__#define __JF24D__
#include "REG51F.H"
#define BYTE unsigned char
#define INT8 char
#define INT16 int
#define UINT8 unsigned char
#define UINT16 unsigned int
#define UINT32 unsigned long

/************JF24D使用I/O声明**************************/
sbit CE =  P1^4;
sbit CSN=  P1^3;
sbit SCK=  P1^5;
sbit MOSI= P1^6;
sbit MISO= P1^7;
sbit IRQ = P3^3;

#define MAX_PACKET_LEN  32// 数据包最大长度,最大为255

/***********SPI命令***********************************/
#define READ_REG        0x00  // 读寄存器
#define WRITE_REG       0x20  // 写寄存器
#define RD_RX_PLOAD     0x61  // 读接收FIFO
#define WR_TX_PLOAD     0xA0  // 写发射FIFO
#define FLUSH_TX        0xE1  // 清空发射FIFO
#define FLUSH_RX        0xE2  // 清空接收FIFO
#define REUSE_TX_PL     0xE3  // 重复发射数据包
#define W_TX_PAYLOAD_NOACK_CMD 0xb0  //写发射FIFO,无应答
#define W_ACK_PAYLOAD_CMD 0xa8  //写应答FIFO
#define ACTIVATE_CMD  0x50  //ACTIVATE命令
#define R_RX_PL_WID_CMD  0x60  //读数据包长度
#define NOP             0xFF  // 无操作

/*********寄存器组0的寄存器声明***********************/
#define CONFIG          0x00  // 'Config' register address
#define EN_AA           0x01  // 'Enable Auto Acknowledgment' register address
#define EN_RXADDR       0x02  // 'Enabled RX addresses' register address
#define SETUP_AW        0x03  // 'Setup address width' register address
#define SETUP_RETR      0x04  // 'Setup Auto. Retrans' register address
#define RF_CH           0x05  // 'RF channel' register address
#define RF_SETUP        0x06  // 'RF setup' register address
#define STATUS          0x07  // 'Status' register address
#define OBSERVE_TX      0x08  // 'Observe TX' register address
#define CD              0x09  // 'Carrier Detect' register address
#define RX_ADDR_P0      0x0A  // 'RX address pipe0' register address
#define RX_ADDR_P1      0x0B  // 'RX address pipe1' register address
#define RX_ADDR_P2      0x0C  // 'RX address pipe2' register address
#define RX_ADDR_P3      0x0D  // 'RX address pipe3' register address
#define RX_ADDR_P4      0x0E  // 'RX address pipe4' register address
#define RX_ADDR_P5      0x0F  // 'RX address pipe5' register address
#define TX_ADDR         0x10  // 'TX address' register address
#define RX_PW_P0        0x11  // 'RX payload width, pipe0' register address
#define RX_PW_P1        0x12  // 'RX payload width, pipe1' register address
#define RX_PW_P2        0x13  // 'RX payload width, pipe2' register address
#define RX_PW_P3        0x14  // 'RX payload width, pipe3' register address
#define RX_PW_P4        0x15  // 'RX payload width, pipe4' register address
#define RX_PW_P5        0x16  // 'RX payload width, pipe5' register address
#define FIFO_STATUS     0x17  // 'FIFO Status Register' register address
#define PAYLOAD_WIDTH   0x1f  // 'payload length of 256 bytes modes register address

/************STATUS寄存器状态********************/
#define STATUS_RX_DR 0x40  
#define STATUS_TX_DS 0x20
#define STATUS_MAX_RT 0x10
#define STATUS_TX_FULL 0x01

/***********FIFO_STATUS寄存器状态**********************/
#define FIFO_STATUS_TX_REUSE 0x40
#define FIFO_STATUS_TX_FULL 0x20
#define FIFO_STATUS_TX_EMPTY 0x10
#define FIFO_STATUS_RX_FULL 0x02
#define FIFO_STATUS_RX_EMPTY 0x01
#define ENTER_TX_RX() CE=1    //进入接收或发射#define EXIT_TX_RX()  CE=0    //退出接收或发射

/****************使用函数声明*******************************/
UINT8 SPI_Read_Reg(UINT8 reg);   
void SPI_Read_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes);
void SPI_Write_Reg(UINT8 reg, UINT8 value);void SPI_Write_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes);
void SwitchCFG(char _cfg);
void Delay(UINT8 n);
void JF24D_Init();
void Enter_PTX();
void SwitchToRxMode();
UINT8 Receive_Packet(UINT8 rx_buf[MAX_PACKET_LEN]);
void Send_Packet(UINT8 type,UINT8* pbuf,UINT8 len);
#endif

出0入0汤圆

发表于 2012-8-12 18:59:42 | 显示全部楼层
想先听听楼主对这段代码有啥想法

出0入0汤圆

发表于 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[MAX_PACKET_LEN];  //存储收到数据      
                                       j=Receive_Packet(pp); //读FIFO,并发送给PC           
                                       #ifdef DEBUG_UART              
                                       SBUF=j;     
                                        while(TI);   
                                          TI=0;      
                                          for(i=0;i<j;i++)     
                                           {      
                                           SBUF=pp[i];      
                                           while(!TI);      
                                           TI=0;     
                                            }
                             #endif
                              flag_tx=0x3f;     //修改发射标志           
                               }               
                               if(value&STATUS_MAX_RT)  //判断是否收到应答信号        
                                {      
                                        flag_tx=0;    //修改发射标志      
                                SPI_Write_Reg(FLUSH_TX,0);  //发射FIFO清空      
                                }         
                                SPI_Write_Reg(WRITE_REG|STATUS,value);    //清STATUS寄存器                  
                                EXIT_TX_RX();        //退出TX      
                                LED=LED&flag_tx;       //亮相应指示灯   
                                Delay(250);   
                                LED=0xff;         
                                while(KEY!=0xff);     //等待按键松开      
                            }
                                                
                        }  
                }  
        }
}

/*********************************************************************************************************************************************/
#include"JF24D.h"
/*********************寄存器组1初始值**********************************/
code UINT32 RegArrFSKAnalog[]={0xF2014B41,0x30064BC0,0x00C4FCA0,0x60350017,0x0B009941,
// 0B109941 for 2 Mbps mode0xBE7F0124,0x00400000,0x00000000,0x00000000,0x00000000,0xF64EF5F6,0x5C1851D6,0x4055002D,0x00700000
// 00040000 for 2 Mbps mode};
code UINT8 RegArrFSKAnalogReg14[]={0x41,0x10,0x08,0x82,0x40,0x10,0x08,0xF2,0x7C,0xEF,0xCF};

/**************************寄存器组0初始值********************/
code UINT8 RegArrFSK[][2]={{0,0x0F},{1,0x3F},{2,0x3F},{3,0x03},{4,0xff},{5,0x17},{6,0x17},{7,0x07},{8,0x00}
,{9,0x00},{12,0xc3},{13,0xc4},{14,0xc5},{15,0xc6},{17,0x20},{18,0x20}
,{19,0x20},{20,0x20},{21,0x20},{22,0x20},{23,0x00},{28,0x3F},{29,0x07}};
code UINT8 RX0_Address[]={0x12,0x34,0x56,0x78,0x01};
code UINT8 RX1_Address[]={0xc2,0x56,0x34,0x12,0x02};

/****************************************************************
函数名称:SPI_RW()**函数描述:写一个字节到JF24D,并返回读出的字节
**入口参数:命令或地址**出口参数:读出的字节
**************************************************************/      
UINT8 SPI_RW(UINT8 _byte)                                   
{                                                           
UINT8 bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++)   
{  
        MOSI = (_byte & 0x80);         // 输出,先输出高位
_byte = (_byte << 1);           // 下一位输出值移位到高位  
SCK = 1;                      // SCK置位  
_byte |= MISO;          // 读MISO当前值
  SCK = 0;                // SCK清零      
  }
  return(_byte);               // 返回读出的值
  }                                                                 
/****************************************************************
函数名称:SPI_Write_Reg()
**函数描述:写寄存器的值
**入口参数:寄存器地址+命令,寄存器的值**出口参数:无
**************************************************************/                                                                                                                                                                     
void SPI_Write_Reg(UINT8 reg, UINT8 value)               
{ CSN = 0;                   // 清零CSN,使能
        SPI SPI_RW(reg);      // 写寄存器地址+命令
        SPI_RW(value);             // 写相应的值
        CSN = 1;                   // 置位CSN,禁止SPI}                                                                                                                           
        /****************************************************************
        函数名称:SPI_Read_Reg()
        **函数描述:读寄存器的值
        **入口参数:寄存器地址+命令
        **出口参数:寄存器的值
        **************************************************************/                                                  
        UINT8 SPI_Read_Reg(UINT8 reg)                              
        {                                                           
                BYTE value; CSN = 0;                // 清零CSN,使能
                SPI SPI_RW(reg);            // 写寄存器地址+命令
                value = SPI_RW(0);    // 读寄存器的值
                CSN = 1;                // 置位CSN,禁止SPI
return(value);        // 返回寄存器的值}                                                               
/****************************************************************
函数名称:SPI_Read_Buf()**函数描述:读多字节寄存器的值
**入口参数:寄存器地址+命令,返回值的地址,寄存器值的长度
**出口参数:无
**************************************************************/                                                                                                            
void SPI_Read_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes)   
{                                                           
        UINT8 byte_ctr;                                                                                         
        CSN = 0;                      // 清零CSN,使能
        SPI SPI_RW(reg);         // 写寄存器地址+命令                                                            
        for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)            pBuf[byte_ctr] = SPI_RW(0);    // 读寄存器的值                                                            
        CSN = 1;                           // 置位CSN,禁止SPI}                                                                                                                           
        /****************************************************************
        函数名称:SPI_Write_Buf()
        **函数描述:写多字节寄存器的值
        **入口参数:寄存器地址+命令,写入值的地址,寄存器值的长度
        **出口参数:无***************************************************************/   
        void SPI_Write_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes)   
        {                                                           
                UINT8 byte_ctr;                                                                                       
                 CSN = 0;                   // 清零CSN,使能
                 SPI SPI_RW(reg);    // 写寄存器地址+命令
                 for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // 写寄存器的值
                  SPI_RW(*(pBuf+byte_ctr)); CSN = 1;                 // 置位CSN,禁止SPI   
                   }                                                                 
/****************************************************************
函数名称:Enter_PRX()
**函数描述:切换到PRX模式**入口参数:无
**出口参数:无
***************************************************************/
void Enter_PRX()
{
UINT8 value;
SPI_Write_Reg(FLUSH_RX,0);//清空接收FIFO
value=SPI_Read_Reg(STATUS); // 读STATUS寄存器 SPI_Write_Reg(WRITE_REG+STATUS,value);// 清零RX_DR、TX_DS、MAX_RT标志
value=SPI_Read_Reg(CONFIG); // 读CONFIG寄存器
value=value&0xfd;//位1清零   
SPI_Write_Reg(WRITE_REG + CONFIG, value); // 清零PWR_UP位,进入POWER_DOWN模式
value=value|0x03; //置位位1,位0   
SPI_Write_Reg(WRITE_REG + CONFIG, value); // 置位PWR_UP,PRIM_RX,进入PRX模式
}
/****************************************************************
函数名称:Enter_PTX()
**函数描述:切换到PTX模式
**入口参数:无**出口参数:无
***************************************************************/
void Enter_PTX()
{
UINT8 value;
SPI_Write_Reg(FLUSH_TX,0);//清空接收FIFO
value=SPI_Read_Reg(STATUS); // 读STATUS寄存器
SPI_Write_Reg(WRITE_REG+STATUS,value);// 清零RX_DR、TX_DS、MAX_RT标志
value=SPI_Read_Reg(CONFIG); // 读CONFIG寄存器
value=value&0xfd;//位1清零
SPI_Write_Reg(WRITE_REG+CONFIG, value); // 清零PWR_UP位,进入POWER_DOWN模式
value=value|0x02;//置位位1
value=value&0xfe; //位0清零
SPI_Write_Reg(WRITE_REG + CONFIG, value); // 置位PWR_UP,清零PRIM_RX,进入PTX模式
}

/****************************************************************
函数名称:SwitchCFG()
**函数描述:切换寄存器组
**入口参数:将要切换到寄存器组,0或1
**出口参数:无
***************************************************************/      
void SwitchCFG(char _cfg)
{
UINT8 Tmp;
Tmp=SPI_Read_Reg(STATUS);  //读STATUS寄存器
Tmp=Tmp&0x80;     
if( ( Tmp&&(_cfg==0) ) ||( (Tmp==0)&&_cfg ) )    //判断当前寄存器组是否是将要切换的
SPI_Write_Reg(ACTIVATE_CMD,0x53);     //执行切换
}

/****************************************************************
函数名称:Send_Packet()**函数描述:发射数据包
**入口参数:写发射FIFO命令,写入值的地址,寄存器值的长度
**出口参数:无
***************************************************************/
void Send_Packet(UINT8 type,UINT8* pbuf,UINT8 len)
{
UINT8 fifo_sta;
fifo_sta=SPI_Read_Reg(FIFO_STATUS); // 读寄存器FIFO_STATUS

if((fifo_sta&FIFO_STATUS_TX_FULL)==0)//判断发射FIFO是否满  
{   
        SPI_Write_Buf(type, pbuf, len); // 写发射FIFO  
}
}
/****************************************************************
函数名称:Receive_Packet()
**函数描述:接收数据包
**入口参数:读接收FIFO命令,读出值的地址
**出口参数:数据包的长度
***************************************************************/
UINT8 Receive_Packet(UINT8 rx_buf[MAX_PACKET_LEN])
{
UINT8 len,fifo_sta;
do {  
        len=SPI_Read_Reg(R_RX_PL_WID_CMD); // 读数据包长度
  if(len<=MAX_PACKET_LEN)  
  {   
          SPI_Read_Buf(RD_RX_PLOAD,rx_buf,len);// 读接收FIFO  
  }  
  else  
  {  
           SPI_Write_Reg(FLUSH_RX,0);//数据包长度大于最大长度,清空FIFO  
  }
          fifo_sta=SPI_Read_Reg(FIFO_STATUS); //读寄存器FIFO_STATUS      
  }
  while((fifo_sta&FIFO_STATUS_RX_EMPTY)==0); //如果不为空,继续读  
  return(len);    //返回数据包长度
  }
/****************************************************************
函数名称:JF24D_Init()
**函数描述:初始化JF24D
**入口参数:无
**出口参数:无
***************************************************************/
void JF24D_Init()
{
INT8 i,j; UINT8 WriteArr[4];
/************************初始化寄存器组1*********************************/  
SwitchCFG(1);    //切换到寄存器组1                  
for(i=0;i<=8;i++)    //写前0-8号寄存器  
{   
        for(j=0;j<4;j++)  
        {         
        WriteArr[j]=(RegArrFSKAnalog[i]>>(8*(j) ) )&0xff;   //将寄存器值存放到数组中,先高字节     
        }     
        SPI_Write_Buf((WRITE_REG|i),&(WriteArr[0]),4);   //写寄存器  
}                  

for(i=9;i<=13;i++)            //写9-13号寄存器  
{   
        for(j=0;j<4;j++)  
        {     
        WriteArr[j]=(RegArrFSKAnalog[i]>>(8*(3-j) ) )&0xff;  //将寄存器值存放到数组中,先低字节     
        }   
        SPI_Write_Buf((WRITE_REG|i),&(WriteArr[0]),4);    //写寄存器  
}
SPI_Write_Buf((WRITE_REG|14),&(RegArrFSKAnalogReg14[0]),11);  //写14号寄存器
/***************写REG4[0]=0,REG4[1]=0,REG4[3]=0,REG4[23]=0 **************/  
for(j=0;j<4;j++)
{     
        WriteArr[j]=(RegArrFSKAnalog[4]>>(8*(j) ) )&0xff;   
}  
WriteArr[3]=WriteArr[3]&0xf4;  
WriteArr[1]=WriteArr[1]&0x7F;  
SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);

/***********写REG4[25]=1,写REG4[26]=1 *********************************/  
WriteArr[0]=WriteArr[0]|0x06;  
SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);

/*************写REG4[25]=0,写REG4[26]=0*****************************/   
WriteArr[0]=WriteArr[0]&0xf9;
SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);   
Delay(20);  //延时20ms

/************写REG4[0]=1,REG4[1]=1,REG4[3]=1,REG4[23]=1***********/  
for(j=0;j<4;j++)
{     
        WriteArr[j]=(RegArrFSKAnalog[4]>>(8*(j) ) )&0xff;   
}  
SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);
/******************初始化寄存器组0*********************************/  
SwitchCFG(0);   //切换到寄存器组0   
for(i=20;i>=0;i--)
{     
        SPI_Write_Reg((WRITE_REG|RegArrFSK[i][0]),RegArrFSK[i][1]);   
}   
SPI_Write_Buf((WRITE_REG+RX_ADDR_P0),RX0_Address,5);   //写寄存器10,通道0地址   
SPI_Write_Buf((WRITE_REG+RX_ADDR_P1),RX1_Address,5);   //写寄存器11,通道1地址,及其余通道高位地址  
  SPI_Write_Buf((WRITE_REG+TX_ADDR),RX0_Address,5);    //写寄存器16,发射通道地址   
  i=SPI_Read_Reg(29);   //读寄存器29
   if(i==0)    //是否需要激活
   {     
           SPI_Write_Reg(ACTIVATE_CMD,0x73);  //激活寄存器29   
           for(i=22;i>=21;i--)  
    {      
            SPI_Write_Reg((WRITE_REG|RegArrFSK[i][0]),RegArrFSK[i][1]);  //写寄存器28、29     
    }
   }

/************************发射连续波CW*****************************/
#ifdef TX_CW SwitchCFG(0);
WriteArr[0] = 0x41;  
WriteArr[1] = 0x11;  
WriteArr[2] = 0x04;  
WriteArr[3] = 0x21;   
  SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4);  
  while(1);
#endif
}


/*********************************************************************************************************************************************/
#ifndef __JF24D__#define __JF24D__
#include "REG51F.H"
#define BYTE unsigned char
#define INT8 char
#define INT16 int
#define UINT8 unsigned char
#define UINT16 unsigned int
#define UINT32 unsigned long

/************JF24D使用I/O声明**************************/
sbit CE =  P1^4;
sbit CSN=  P1^3;
sbit SCK=  P1^5;
sbit MOSI= P1^6;
sbit MISO= P1^7;
sbit IRQ = P3^3;

#define MAX_PACKET_LEN  32// 数据包最大长度,最大为255

/***********SPI命令***********************************/
#define READ_REG        0x00  // 读寄存器
#define WRITE_REG       0x20  // 写寄存器
#define RD_RX_PLOAD     0x61  // 读接收FIFO
#define WR_TX_PLOAD     0xA0  // 写发射FIFO
#define FLUSH_TX        0xE1  // 清空发射FIFO
#define FLUSH_RX        0xE2  // 清空接收FIFO
#define REUSE_TX_PL     0xE3  // 重复发射数据包
#define W_TX_PAYLOAD_NOACK_CMD 0xb0  //写发射FIFO,无应答
#define W_ACK_PAYLOAD_CMD 0xa8  //写应答FIFO
#define ACTIVATE_CMD  0x50  //ACTIVATE命令
#define R_RX_PL_WID_CMD  0x60  //读数据包长度
#define NOP             0xFF  // 无操作

/*********寄存器组0的寄存器声明***********************/
#define CONFIG          0x00  // 'Config' register address
#define EN_AA           0x01  // 'Enable Auto Acknowledgment' register address
#define EN_RXADDR       0x02  // 'Enabled RX addresses' register address
#define SETUP_AW        0x03  // 'Setup address width' register address
#define SETUP_RETR      0x04  // 'Setup Auto. Retrans' register address
#define RF_CH           0x05  // 'RF channel' register address
#define RF_SETUP        0x06  // 'RF setup' register address
#define STATUS          0x07  // 'Status' register address
#define OBSERVE_TX      0x08  // 'Observe TX' register address
#define CD              0x09  // 'Carrier Detect' register address
#define RX_ADDR_P0      0x0A  // 'RX address pipe0' register address
#define RX_ADDR_P1      0x0B  // 'RX address pipe1' register address
#define RX_ADDR_P2      0x0C  // 'RX address pipe2' register address
#define RX_ADDR_P3      0x0D  // 'RX address pipe3' register address
#define RX_ADDR_P4      0x0E  // 'RX address pipe4' register address
#define RX_ADDR_P5      0x0F  // 'RX address pipe5' register address
#define TX_ADDR         0x10  // 'TX address' register address
#define RX_PW_P0        0x11  // 'RX payload width, pipe0' register address
#define RX_PW_P1        0x12  // 'RX payload width, pipe1' register address
#define RX_PW_P2        0x13  // 'RX payload width, pipe2' register address
#define RX_PW_P3        0x14  // 'RX payload width, pipe3' register address
#define RX_PW_P4        0x15  // 'RX payload width, pipe4' register address
#define RX_PW_P5        0x16  // 'RX payload width, pipe5' register address
#define FIFO_STATUS     0x17  // 'FIFO Status Register' register address
#define PAYLOAD_WIDTH   0x1f  // 'payload length of 256 bytes modes register address

/************STATUS寄存器状态********************/
#define STATUS_RX_DR 0x40  
#define STATUS_TX_DS 0x20
#define STATUS_MAX_RT 0x10
#define STATUS_TX_FULL 0x01

/***********FIFO_STATUS寄存器状态**********************/
#define FIFO_STATUS_TX_REUSE 0x40
#define FIFO_STATUS_TX_FULL 0x20
#define FIFO_STATUS_TX_EMPTY 0x10
#define FIFO_STATUS_RX_FULL 0x02
#define FIFO_STATUS_RX_EMPTY 0x01
#define ENTER_TX_RX() CE=1    //进入接收或发射#define EXIT_TX_RX()  CE=0    //退出接收或发射

/****************使用函数声明*******************************/
UINT8 SPI_Read_Reg(UINT8 reg);   
void SPI_Read_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes);
void SPI_Write_Reg(UINT8 reg, UINT8 value);void SPI_Write_Buf(UINT8 reg, UINT8 *pBuf, UINT8 bytes);
void SwitchCFG(char _cfg);
void Delay(UINT8 n);
void JF24D_Init();
void Enter_PTX();
void SwitchToRxMode();
UINT8 Receive_Packet(UINT8 rx_buf[MAX_PACKET_LEN]);
void Send_Packet(UINT8 type,UINT8* pbuf,UINT8 len);
#endif

出0入0汤圆

 楼主| 发表于 2012-8-13 08:25:29 | 显示全部楼层
diannaoza 发表于 2012-8-12 19:12
JF24D无线收发模块
2011-01-10 15:08
/**************************************************************** ...

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

出0入0汤圆

 楼主| 发表于 2012-8-13 11:14:49 | 显示全部楼层
急求!!!!高手指教!!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表