** 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 的频率,改为18变1M 一共可以设置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_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);
/************写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(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
}