无线模块专业网站!安阳市新世纪电子研究所专业研发生产小体积低功耗 无线模块 无线收发模块 2.4G无线模块 无线遥控器 无线接收器 无线控制器
全国服务热线:0372-5968708

产品目录
市场部联系电话:
0372-5968708
传真:0372-5968993
邮箱:ay5968708@163.com
中国﹒河南省安阳市文峰大道与朝阳路口国贸大厦A座9F
欢迎咨询市场部在线客服!
技术支持
您当前位置:首页 > 技术支持
JF24D如何设置频率及数据通道
发布:xsj  发布日期:2012-03-06 15:06:01  浏览:5198次

** File name:           JF24D.c

** Last modified Date:  2010-11-6

** Last Version:        2.0

** Descriptions:        Every project should include a copy of this file.

**------------------------------------------------------------------------------------------------------

** Created by:          lizhiyuan

** Created date:        2010-11-6

** Version:            2.0

** Descriptions:        The original version

**------------------------------------------------------------------------------------------------------

** Modified by:

** Modified date:

** Version:

** Descriptions:JF24D新版本程序2.0

********************************************************************************************************/

#include"JF24D.h"

//寄存器组1  0-13号寄存器的初始值  

code UINT32 RegArrFSKAnalog[]={

0xE2014B40,

0x00004B40,

0x028CFCD0,

0x41390099,

0x0B869EC1,

0xA67F0224,

0x00400000,  

0x00000000,

0x00000000,

0x00000000,

0x00000000,

0x00000000,

0x001A7300,

0x36B48000,

};

 

//寄存器组1  14号寄存器的初始值  

code UINT8 RegArrFSKAnalogReg14[]=

{

0x41,0x20,0x08,0x04,0x81,0x20,0xCF,0xF7,0xFE,0xFF,0xFF

};

 

//寄存器组0初始值

code UINT8 RegArrFSK[][2]={

{0,0x0F}, //配置寄存器

{1,0x3F},

{2,0x3F}, //使能接收地址

{3,0x03}, //信道的数据长度

{4,0xff},

{5,0x17},    //频道选择寄存器 (更改17 可以改变2.4G 的频率,改为181M 一共可以设置80个通道)

{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}; //接收通道0的地址

说明:改变0X后面5组数字的任一组数可以更改每套模块的IP地址,比如0x12 可以改为0x13,其他不变{0x13,0x34,0x56,0x78,0x01} 2只模块地址一样即可通讯 和其他不同的地址不能通讯,也互不干扰。改变地址可以数据通道。遥控可以,传数据会误码。

code UINT8 RX1_Address[]={0xc2,0x56,0x34,0x12,0x02}; //接收通道1的地址

 

/************************************************************************************

**函数名称: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) reentrant    

{

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_DRTX_DSMAX_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_UPPRIM_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_DRTX_DSMAX_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()

**函数描述:切换寄存器组

**入口参数:将要切换到寄存器组,01

**出口参数:无

***************************************************************/

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]=0REG4[1]=0REG4[3]=0REG4[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); 

 

/************REG4[0]=1REG4[1]=1REG4[3]=1REG4[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]); //写寄存器2829

  }

 

/************************发射连续波CW*****************************/

#ifdef TX_CW

SwitchCFG(1); 

 WriteArr[0] = 0x41; 

 WriteArr[1] = 0x11; 

 WriteArr[2] = 0x04; 

 WriteArr[3] = 0x21; 

    SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4); 

 while(1); 

#endif

}


安阳市新世纪电子研究所有限公司 电话:0372-5968708  豫ICP备05021267号-1  豫公安网备 41050202000031号