?
** 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}, //狀態(tài)寄存器
{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()
**函數描述:寫一個字節(jié)到JF24D,并返回讀出的字節(jié)
平時低電平,上升沿讀數據,下降沿寫數據
**入口參數:命令或地址
**出口參數:讀出的字節(jié)
************************************************************************************/
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()
**函數描述:讀多字節(jié)寄存器的值
**入口參數:寄存器地址+命令,返回值的地址,寄存器值的長度
**出口參數:無
**************************************************************/
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()
**函數描述:寫多字節(jié)寄存器的值
**入口參數:寄存器地址+命令,寫入值的地址,寄存器值的長度
**出口參數:無
***************************************************************/
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); //執(zhí)行切換
}
}
/**************************************************************
**函數名稱:Send_Packet()
**函數描述:發(fā)射數據包
**入口參數:寫發(fā)射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) //判斷發(fā)射FIFO是否滿
SPI_Write_Buf(type, pbuf, len); // 寫發(fā)射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); //如果不為空,繼續(xù)讀
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; //將寄存器值存放到數組中,先高字節(jié)
}
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; //將寄存器值存放到數組中,先低字節(jié)
}
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,發(fā)射通道地址
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
}
}
/************************發(fā)射連續(xù)波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
}