A7139 擁有電磁波喚醒以及10mW的發(fā)射功率,非常容易實現(xiàn)長距離通信,目前測試有障礙物可以輕松達到300m以上。
通過幾天的調(diào)試,目前可以發(fā)送任意大小的數(shù)據(jù)包,大小為1-16KB,全部使用中斷收發(fā),效率極高。
增加波特率設(shè)置2Kbps-100Kbps任意設(shè)置
增加通信信道設(shè)置0-255
增加發(fā)送功率設(shè)置0-7
#include “SYSTEM.H”
#include “GPIO_INIT.H”
#include “a7139.H”
#include “LED.H”
//晶振寄存器,用于設(shè)置晶振以及PAGE地址
//用于緩存寄存器7的值
static u16 A7139_CRYSTAL_REG = 0x18;
//單包數(shù)據(jù)發(fā)送超時時間
#define A7139_SEND_TIME_OUT 5 //單位10ms
//基礎(chǔ)頻率,設(shè)置頻率范圍為420.500MHZ~452.375MHZ ,頻道差為125KHZ
#define A7139_BASE_FRE 420.5f
//調(diào)試開關(guān)
#define A7193_DBUG 1
#if A7193_DBUG
#include “system.h”
#define A7193_debug(format,。。。) uart_printf(format,##__VA_ARGS__)
#else
#define A7193_debug(format,。。。) /\
/
#endif //A7193_DBUG
vu8 IntCnt = 0;
//寄存器配置
typedef struct
{
u16 SCLOCK; //系統(tǒng)時鐘寄存器
u16 PLL1; //PLL1
u16 PLL2; //PLL2
u16 PLL3; //PLL3
u16 PLL4; //PLL4
u16 PLL5; //PLL5
u16 PLL6; //PLL6
u16 CRYSTAL; //晶振設(shè)置
u16 PREG8S; //寄存器組,由CRYSTAL控制切換
u16 PREG9S; //寄存器組,由CRYSTAL控制切換
u16 RX1; //接收設(shè)置1
u16 RX2; //接收設(shè)置2
u16 PIN; //PIN
u16 CALIB; //Calibration
u16 MODE; //模式控制
} A7139_CONFIG_YPTE;
const u16 A7139Config[]=
{
0x0021, //SYSTEM CLOCK register,
0x0A21, //PLL1 register,
0xDA05, //PLL2 register, 433.301MHz
0x0000, //PLL3 register,
0x0A20, //PLL4 register,
0x0024, //PLL5 register,
0x0000, //PLL6 register,
0x0001, //CRYSTAL register,
0x0000, //PAGEA,
0x0000, //PAGEB,
0x18D4, //RX1 register, IFBW=100KHz, ETH=1
0x7009, //RX2 register, by preamble
0x4400, //ADC register,
0x0800, //PIN CONTROL register, Use Strobe CMD
0x4845, //CALIBRATION register,
0x20C0 //MODE CONTROL register, Use FIFO mode
};
const u16 A7139Config_PageA[]=
{
0xF706, //TX1 register, Fdev = 37.5kHz
0x0000, //WOR1 register,
0xF800, //WOR2 register,
0x1107, //RFI register, Enable Tx Ramp up/down
0x0170, //PM register,
0x0201, //RTH register,
0x400F, //AGC1 register,
0x2AC0, //AGC2 register,
0x0041, //GIO register GIO1-》WTR GIO2-》WTR
0xD281, //CKO register
0x0004, //VCB register,
0x0A21, //CHG1 register, 430MHz
0x0022, //CHG2 register, 435MHz
0x003F, //FIFO register, FEP=63+1=64bytes
0x1507, //CODE register, Preamble=4bytes, ID=4bytes
0x0000 //WCAL register,
};
const u16 A7139Config_PageB[]=
{
0x0337, //TX2 register,
0x8400, //IF1 register, Enable Auto-IF, IF=200KHz
0x0000, //IF2 register, 頻率偏移為0
0x0000, //ACK register,
0x0000 //ART register,
};
//GPIO1功能設(shè)置
#define A7139_SetGIO_WTR() A7139_WritePageA(A7139_REG8_GPIO, 0x0041) //WTR模式,單包收發(fā)提示
#define A7139_SetGIO_FPF() A7139_WritePageA(A7139_REG8_GPIO, 0x0035) //FPF模式,多包收發(fā)狀態(tài)提示
#define A7139_SetGIO_NULL() A7139_WritePageA(A7139_REG8_GPIO, 0x0000) //關(guān)閉GPIO1指示
//發(fā)送數(shù)據(jù)結(jié)構(gòu)
typedef struct
{
u8 *pSendData; //發(fā)送數(shù)據(jù)緩沖區(qū)指針
u16 SendLen; //需要發(fā)送數(shù)據(jù)長度
u16 TranLen; //已經(jīng)發(fā)送數(shù)據(jù)長度
bool isSendOK; //發(fā)送完成
bool isSendError;//發(fā)送失敗
}A7139_SEND_TYPE;
volatile A7139_SEND_TYPE SendConfig; //發(fā)送數(shù)據(jù)的信息
//接收數(shù)據(jù)結(jié)構(gòu)
typedef struct
{
u8 *pRevData; //接收數(shù)據(jù)緩沖區(qū)指針
u16 RevLen; //需要接收數(shù)據(jù)長度
u16 TranLen; //已經(jīng)接收數(shù)據(jù)長度
u16 RevBuffSize;//接收緩沖區(qū)大小
bool isRevOK; //接收完成
bool isRevError;//接收失敗
}A7139_REV_TYPE;
volatile A7139_REV_TYPE RevConfig; //發(fā)送數(shù)據(jù)的信息
//收發(fā)模式記錄,用于中斷處理發(fā)送或接收模式
static bool isSendMode = FALSE; //默認為接收模式
#define A7139_SendMode(x) (isSendMode=x)
/*命令選擇
地址格式
BIT7 BIT6-BIT4 BIT3-BIT0
R/W Command Address
0:寫 000 讀寫控制寄存器
1:讀 010 讀寫ID
100 讀寫FIFO
110 復(fù)位FIFO
111 RF復(fù)位
*/
void A7139_SetBaseFreq(float RfFreq); //基礎(chǔ)頻率設(shè)置
bool A7139_Cali(void); //頻率校準
/*************************************************************************************************************************
* 函數(shù) : void A7139_SetTrafficRate(u8 Rate)
* 功能 : A7139設(shè)置通信速率,單位Kbps
* 參數(shù) : Rate:通信速率,單位Kbps
* 返回 : 無
* 依賴 : 底層宏定義
* 說明 : 用于設(shè)置通信速率
范圍2-100Kbps
設(shè)置系統(tǒng)時鐘2分頻,設(shè)置為12.8MHZ后如果IFBW設(shè)置過小會導致初始化時自動校準失敗
如果設(shè)置為50會出現(xiàn)校準失敗
*************************************************************************************************************************/
void A7139_SetTrafficRate(u8 Rate)
{
u16 SDR;
if(Rate 《 2) Rate = 2;
if(Rate 》 100) Rate = 100;
//IFBW設(shè)置 DMOS=1 64分頻 ETH=1 CSC=0 FCSCK=12.8MHZ
if(Rate 《= 50) //IFBW=100KHZ
{
A7139_WriteReg(A7139_RX1, 0x18D0 | (1《《2));
}
else //IFBW=100KHZ
{
A7139_WriteReg(A7139_RX1, 0x18D0 | (1《《2));
}
SDR = 100/Rate;
SDR -= 1; //計算波特率分頻值
A7139_WriteReg(A7139_SCLOCK,0x0021|(SDR《《9)); //CSC=1 GRC=1 SDR
}
/*************************************************************************************************************************
* 函數(shù) : void A7139_SetChannel(u8 Channel)
* 功能 : A7139設(shè)置通信信道
* 參數(shù) : Channel:通信信道0-255
* 返回 : 無
* 依賴 : 底層宏定義
* 說明 : 用于設(shè)置通信頻道
Channel*0.125/0.0125,最小頻率偏差為12.5KHZ,設(shè)置通道間隔為125KHZ(最少為100KHZ)
*************************************************************************************************************************/
void A7139_SetChannel(u8 Channel)
{
A7139_WritePageB(A7139_REG9_IF2,Channel*10);
}
/*************************************************************************************************************************
* 函數(shù) : void A7139_SetTxPowerSupply(u8 PowerSupply)
* 功能 : 設(shè)置A7139發(fā)射功率
* 參數(shù) : PowerSupply:功率等級0-7
* 返回 : 無
* 依賴 : 底層宏定義
* 說明 : 用于設(shè)置發(fā)射功率
由于不同頻率下TX驅(qū)動電流與PA驅(qū)動電流并不相同,因此按照文檔設(shè)置
目前只支持433頻段設(shè)置,其它頻段請按照文檔進行設(shè)置。
*************************************************************************************************************************/
void A7139_SetTxPowerSupply(u8 PowerSupply)
{
if(PowerSupply》6)PowerSupply=6; //最大功率為6
if(PowerSupply == 0)
{
A7139_WritePageB(A7139_REG9_TX2, 0x0300); //功率最小-34dBm,PAC=0,TDC=0,TBG=增益
}
else
{
A7139_WritePageB(A7139_REG9_TX2, 0x0300|(1《《5)|(1《《3)|PowerSupply); //PAC=1,TDC=1,TBG=增益
}
}
/*************************************************************************************************************************
* 函數(shù) : bool A7139_Init(u8 Channel, u16 RfID, u8 PowerSupply, u8 Rate)
* 功能 : A7139初始化
* 參數(shù) : Channel:通信信道0-80,RfID:RF ID,PowerSupply:發(fā)射功率0-7;Rate:通信波特率2-100Kbps
* 返回 : TRUE:成功;FALSE:失敗
* 依賴 : 底層宏定義
* 說明 : RF_ID:用于區(qū)分網(wǎng)絡(luò)
2-100Kbps頻率間隔至少為100KHZ,150~200KHZ頻道間隔必須大于200KHZ
*************************************************************************************************************************/
bool A7139_Init(u8 Channel, u16 RfID, u8 PowerSupply, u8 Rate)
{
u32 ID;
u32 temp;
if(Rate 《 2) Rate = 2;
if(Rate 》 100) Rate = 100;
A7139_DisableInt(); //關(guān)閉中斷
A7139_DisableNVIC(); //關(guān)閉總中斷
A7139_IO_INIT(); //初始化IO
A7139_CS_H();
A7139_CLK_L();
A7139_DIO_H();
ID = RfID;
ID 《《= 16;
ID |= RfID;
A7193_debug(“[RF]頻率:%dKHz, 通信速率:%dKbps, RFID:%X!\r\n”,(u32)(A7139_BASE_FRE*1000+Channel*0.125*1000),Rate, ID);
A7139_CRYSTAL_REG = 0x0001;
A7139_SoftReset(); //軟復(fù)位
if(A7139_ReadID() != 0)
{
A7139_SoftReset(); //軟復(fù)位
}
A7139_DelayMS(1);
A7139_Config(); //初始化寄存器
A7139_SetBaseFreq(A7139_BASE_FRE); //設(shè)置基礎(chǔ)頻率
A7139_SetChannel(Channel); //設(shè)置信道
A7139_SetTrafficRate(Rate); //設(shè)置通信速率
A7139_WriteID(ID); //寫入ID
temp = A7139_ReadID(); //讀取用戶ID
if(temp != ID)
{
A7193_debug(“A7139 初始化失敗,芯片檢測錯誤!\r\n”);
return FALSE;
}
A7193_debug(“A7139 用戶ID:%X\t硬件ID:%X\r\n”,ID, A7139_ReadDeverID());
A7139_DelayMS(5);
if(A7139_Cali()==FALSE) //校準
{
A7193_debug(“A7139 初始化失敗,校準失??!\r\n”);
return FALSE;
}
A7193_debug(“A7139 初始化成功!\r\n”);
A7139_SetTxPowerSupply(PowerSupply); //設(shè)置發(fā)射功率
A7139_EnableInt(); //開啟上升沿觸發(fā)中斷
return TRUE;
}
/*************************************************************************************************************************
* 函數(shù) : void A7139_WriteByte(u8 data)
* 功能 : A7139寫一字節(jié)
* 參數(shù) : data:需要寫入的數(shù)據(jù)
* 返回 : 無
* 依賴 : 底層宏定義
* 說明 : 不帶片選,最底層寫入1B
*************************************************************************************************************************/
void A7139_WriteByte(u8 data)
{
u8 i;
for(i = 0;i 《 8;i ++)
{
if(data & 0x80)
{
A7139_DIO_H();
}
else
{
A7139_DIO_L();
}
nop;nop;
A7139_CLK_H();
data 《《= 1;
nop;nop;
A7139_CLK_L();
}
}
/*************************************************************************************************************************
* 函數(shù) : u8 A7139_ReadByte(void)
* 功能 : A7139讀取一字節(jié)
* 參數(shù) : 無
* 返回 : 讀取的數(shù)據(jù)
* 依賴 : 底層宏定義
* 說明 : 不帶片選,最底層讀取1B
*************************************************************************************************************************/
u8 A7139_ReadByte(void)
{
u8 i;
u8 data = 0;
for(i = 0;i 《 8;i ++)
{
A7139_CLK_H();
data 《《= 1;
if(A7139_DIO_IN())
{
data |= 1;
}
nop;
A7139_CLK_L();
nop;nop;nop;
}
return data;
}
/*************************************************************************************************************************
* 函數(shù) : u16 A7139_ReadReg(A7139_CREG RegAddr)
* 功能 : 讀取控制寄存器
* 參數(shù) : RegAddr:寄存器地址
* 返回 : 寄存器值
* 依賴 : 底層宏定義
* 說明 :
*************************************************************************************************************************/
u16 A7139_ReadReg(A7139_CREG RegAddr)
{
u16 data;
RegAddr &= 0x0f; //地址限制為BIT0-BIT3
RegAddr |= A7139_RCR_CMD; //讀命令
A7139_CS_L();
A7139_OutMode();
A7139_WriteByte(RegAddr);
A7139_InMode(); //輸入
data = A7139_ReadByte();
data 《《= 8;
data |= A7139_ReadByte();
A7139_CS_H();
return data;
}
/*************************************************************************************************************************
* 函數(shù) : void A7139_WriteReg(u8 RegAddr, u16 data)
* 功能 : 寫入控制寄存器
* 參數(shù) : RegAddr:寄存器地址,data:要寫入的值
* 返回 : 無
* 依賴 : 底層宏定義
* 說明 :
*************************************************************************************************************************/
void A7139_WriteReg(A7139_CREG RegAddr, u16 data)
{
RegAddr &= 0x0f; //地址限制為BIT0-BIT3
RegAddr |= A7139_WCR_CMD; //寫命令
A7139_CS_L();
A7139_OutMode();
A7139_WriteByte(RegAddr);
A7139_WriteByte(data》》8);
A7139_WriteByte(data);
A7139_CS_H();
}
/*************************************************************************************************************************
* 函數(shù) : u16 A7139_ReadPageA(A7139_PAGE_A RegAddr)
* 功能 : 讀取控制寄存器組寄存器A
* 參數(shù) : RegAddr:寄存器組地址
* 返回 : 寄存器值
* 依賴 : 底層宏定義
* 說明 : 寄存器組8
************************************************************************************************************************/
u16 A7139_ReadPageA(A7139_PAGE_A RegAddr)
{
u16 data;
//先選擇組
A7139_CRYSTAL_REG &= ~(0xf 《《 12); //清除寄存器組8地址
A7139_CRYSTAL_REG |= (RegAddr 《《 12); //存儲寄存器組8地址
A7139_WriteReg(A7139_CRYSTAL, A7139_CRYSTAL_REG); //重新設(shè)置此存器組8地址
data = A7139_ReadReg(A7139_PREG8S); //讀取寄存器組數(shù)據(jù)
return data;
}
/*************************************************************************************************************************
* 函數(shù) : void A7139_WritePageA(A7139_PAGE_A RegAddr, u16 data)
* 功能 : 寫入控制寄存器組寄存器
* 參數(shù) : RegAddr:寄存器組地址,data:寄存器值
* 返回 : 寄存器值
* 依賴 : 底層宏定義
* 說明 : 寄存器組8
*************************************************************************************************************************/
void A7139_WritePageA(A7139_PAGE_A RegAddr, u16 data)
{
//先選擇組
A7139_CRYSTAL_REG &= ~(0xf 《《 12); //清除寄存器組8地址
A7139_CRYSTAL_REG |= (RegAddr 《《 12); //存儲寄存器組8地址
A7139_WriteReg(A7139_CRYSTAL, A7139_CRYSTAL_REG); //重新設(shè)置此存器組8地址
A7139_WriteReg(A7139_PREG8S, data); //設(shè)置寄存器組數(shù)據(jù)
}
/*************************************************************************************************************************
* 函數(shù) : u16 A7139_ReadPageB(A7139_PAGE_B RegAddr)
* 功能 : 讀取控制寄存器組寄存器
* 參數(shù) : RegAddr:寄存器組地址
* 返回 : 寄存器值
* 依賴 : 底層宏定義
* 說明 : 寄存器組9
*************************************************************************************************************************/
u16 A7139_ReadPageB(A7139_PAGE_B RegAddr)
{
u16 data;
A7139_CRYSTAL_REG &= ~(0x7 《《 7); //清除寄存器組9地址
A7139_CRYSTAL_REG |= ((RegAddr&0x7) 《《 7); //存儲寄存器組9地址
A7139_WriteReg(A7139_CRYSTAL, A7139_CRYSTAL_REG); //重新設(shè)置此存器組9地址
data = A7139_ReadReg(A7139_PREG9S); //讀取寄存器組數(shù)據(jù)
return data;
}
/*************************************************************************************************************************
* 函數(shù) : void A7139_WritePageB(A7139_PAGE_B RegAddr, u16 data)
* 功能 : 寫入控制寄存器組寄存器
* 參數(shù) : RegAddr:寄存器組地址,data:寄存器值
* 返回 : 寄存器值
* 依賴 : 底層宏定義
* 說明 : 寄存器組9
*************************************************************************************************************************/
void A7139_WritePageB(A7139_PAGE_B RegAddr, u16 data)
{
//先選擇組
A7139_CRYSTAL_REG &= ~(0x7 《《 7); //清除寄存器組9地址
A7139_CRYSTAL_REG |= ((RegAddr&0x7) 《《 7); //存儲寄存器組9地址
A7139_WriteReg(A7139_CRYSTAL, A7139_CRYSTAL_REG); //重新設(shè)置此存器組9地址
A7139_WriteReg(A7139_PREG9S, data); //設(shè)置寄存器組數(shù)據(jù)
}
/*************************************************************************************************************************
* 函數(shù) : u32 A7139_ReadID(void)
* 功能 : 讀取A7139 ID
* 參數(shù) : 無
* 返回 : ID值
* 依賴 : 底層宏定義
* 說明 : 讀取ID
*************************************************************************************************************************/
u32 A7139_ReadID(void)
{
u32 data;
u8 i;
A7139_CS_L();
A7139_OutMode();
A7139_WriteByte(A7139_RID_CMD); //讀ID命令
A7139_InMode(); //輸入
data = 0;
for(i = 0;i 《 4;i ++)
{
data 《《= 8;
data |= A7139_ReadByte();
}
A7139_CS_H();
return data;
}
/*************************************************************************************************************************
* 函數(shù) : void A7139_WriteID(u32 ID)
* 功能 : 設(shè)置A7139 ID
* 參數(shù) : 無ID值
* 返回 : 無
* 依賴 : 底層宏定義
* 說明 : 設(shè)置ID
*************************************************************************************************************************/
void A7139_WriteID(u32 ID)
{
A7139_CS_L();
A7139_OutMode();
A7139_WriteByte(A7139_WID_CMD); //寫ID命令
A7139_WriteByte(ID 》》 24);
A7139_WriteByte(ID 》》 16);
A7139_WriteByte(ID 》》 8);
A7139_WriteByte(ID 》》 0);
A7139_CS_H();
}
/*************************************************************************************************************************
* 函數(shù) : void A7139_StrobeCmd(A7139_STROBE_CMD StrobeCmd)
* 功能 : A7139發(fā)送Strobe命令
* 參數(shù) : 無
* 返回 : 無
* 依賴 : 底層宏定義
* 說明 :
*************************************************************************************************************************/
void A7139_StrobeCmd(A7139_STROBE_CMD StrobeCmd)
{
A7139_CS_L();
A7139_OutMode();
A7139_WriteByte(StrobeCmd);
A7139_CS_H();
}
/*************************************************************************************************************************
* 函數(shù) : void A7139_ReadFIFO(u8 *pData, u8 DataLen)
* 功能 : A7139讀取FIFO
* 參數(shù) : 無
* 返回 : 無
* 依賴 : 底層宏定義
* 說明 :
*************************************************************************************************************************/
void A7139_ReadFIFO(u8 *pData, u8 DataLen)
{
u8 i;
A7139_CS_L();
A7139_OutMode();
A7139_WriteByte(A7139_RFIFO_CMD);
A7139_InMode();
//循環(huán)讀取FIFO
for(i = 0;i 《 DataLen;i ++)
{
pData[i] = A7139_ReadByte();
}
A7139_CS_H();
}
/*************************************************************************************************************************
* 函數(shù) : void A7139_WriteFIFO(u8 *pData, u8 DataLen)
* 功能 : A7139寫FIFO
* 參數(shù) : 無
* 返回 : 無
* 依賴 : 底層宏定義
* 說明 :
*************************************************************************************************************************/
void A7139_WriteFIFO(u8 *pData, u8 DataLen)
{
u8 i;
A7139_CS_L();
A7139_OutMode();
A7139_WriteByte(A7139_WFIFO_CMD);
//循環(huán)寫入FIFO
for(i = 0;i 《 DataLen;i ++)
{
A7139_WriteByte(pData[i]);
}
A7139_CS_H();
}
/*************************************************************************************************************************
* 函數(shù) : void A7139_Config(void)
* 功能 : A7139 配置
* 參數(shù) : 無
* 返回 : 無
* 依賴 : 底層宏定義
* 說明 : 初始化配置
*************************************************************************************************************************/
void A7139_Config(void)
{
u8 i;
for(i=0; i《8; i++)
A7139_WriteReg((A7139_CREG)i, A7139Config[i]);
for(i=10; i《16; i++)
A7139_WriteReg((A7139_CREG)i, A7139Config[i]);
for(i=0; i《16; i++)
A7139_WritePageA((A7139_PAGE_A)i, A7139Config_PageA[i]);
for(i=0; i《5; i++)
A7139_WritePageB((A7139_PAGE_B)i, A7139Config_PageB[i]);
}
/*************************************************************************************************************************
* 函數(shù) : void A7139_SetSendDataLen(u16 DataLen)
* 功能 : A7139 設(shè)置發(fā)送數(shù)據(jù)長度(只針對FIFO外延模式有效)
* 參數(shù) : DataLen:數(shù)據(jù)長度,最大16KB
* 返回 : 無
* 依賴 : 底層宏定義
* 說明 : 用于FIFO外延模式下設(shè)置發(fā)送數(shù)據(jù)長度
*************************************************************************************************************************/
void A7139_SetSendDataLen(u16 DataLen)
{
if(DataLen 》 16*1024) DataLen = 16*1024; //限制最大長度為16KB
//將要發(fā)送的數(shù)據(jù)長度寫入到FEP[13:0]寄存器中
A7139_WritePageA(A7139_REG8_VCO, (DataLen&0x3F00) | 0x04); //FEP【13:8】
A7139_WritePageA(A7139_REG8_FIFO, (3《《14) | (DataLen&0xFF)); //FPM=3;PSA=0,F(xiàn)EP【7:0】
}
/*************************************************************************************************************************
* 函數(shù) : u8 A7139_WriteFistPackToFIFO(u8 *pData, u16 SnedDataLen)
* 功能 : FIFO外延模式發(fā)送首包數(shù)據(jù)
* 參數(shù) : pData:數(shù)據(jù)緩沖區(qū);SnedDataLen:需要發(fā)送的數(shù)據(jù)總長度(不是當前包長度)
* 返回 : 發(fā)送的數(shù)據(jù)長度
* 依賴 : 底層宏定義
* 說明 : 用于FIFO外延模式發(fā)送第一包,前面2個字節(jié)為總包長度,后面62B為數(shù)據(jù)包有效大小
如果數(shù)據(jù)包小于62B后面補充無效數(shù)據(jù)0x00
FIFO外延模式,64B.。.48B.。.48B.。。
*************************************************************************************************************************/
u8 A7139_WriteFistPackToFIFO(u8 *pData, u16 SnedDataLen)
{
u16 i;
u8 temp;
A7139_CS_L();
A7139_OutMode();
A7139_WriteByte(A7139_WFIFO_CMD);
//循環(huán)寫入FIFO
A7139_WriteByte(0xA5); //數(shù)據(jù)包起始字節(jié)1
A7139_WriteByte(0xB6); //數(shù)據(jù)包起始字節(jié)2
A7139_WriteByte(SnedDataLen》》8); //數(shù)據(jù)包總長度,高位
A7139_WriteByte(SnedDataLen); //數(shù)據(jù)包總長度,低位
if(SnedDataLen 《 60) //不足一包,需要填充
{
for(i = 0;i 《 SnedDataLen;i ++) //發(fā)送數(shù)據(jù)包
{
A7139_WriteByte(pData[i]);
}
for(i = 0;i 《 (60-SnedDataLen);i ++) //填充不足的字節(jié)數(shù)
{
A7139_WriteByte(0x00); //填充
}
}
else //超出一包數(shù)據(jù)
{
for(i = 0;i 《 60;i ++) //發(fā)送數(shù)據(jù)包
{
A7139_WriteByte(pData[i]);
}
SnedDataLen = 60; //返回發(fā)送的數(shù)據(jù)長度
}
A7139_CS_H();
return SnedDataLen; //返回發(fā)送的數(shù)據(jù)長度
}
/*************************************************************************************************************************
* 函數(shù) : u8 A7139_WritePackToFIFO(u8 *pData, u16 ResidueDataLen)
* 功能 : FIFO外延模式發(fā)送后續(xù)數(shù)據(jù)包(不能是第一包)
* 參數(shù) : pData:數(shù)據(jù)緩沖區(qū);ResidueDataLen:剩余需要發(fā)送的數(shù)長度(不是當前包長度)
* 返回 : 發(fā)送的數(shù)據(jù)長度
* 依賴 : 底層宏定義
* 說明 : 如果剩余數(shù)據(jù)小于48B后面補充無效數(shù)據(jù)0x00
FIFO外延模式,64B.。.48B.。.48B.。。
BUG:如果外延模式下,寫數(shù)據(jù)中斷觸發(fā)后立即寫數(shù)據(jù)則會再次產(chǎn)生一次寫數(shù)據(jù)中斷
*************************************************************************************************************************/
u8 A7139_WritePackToFIFO(u8 *pData, u16 ResidueDataLen)
{
u8 i;
if(ResidueDataLen == 0) return 0;
A7139_CS_L();
A7139_OutMode();
A7139_WriteByte(A7139_WFIFO_CMD);
//循環(huán)寫入FIFO
if(ResidueDataLen 《 48) //不足一包,需要填充
{
for(i = 0;i 《 ResidueDataLen;i ++) //發(fā)送數(shù)據(jù)包
{
A7139_WriteByte(pData[i]);
}
for(i = 0;i 《 (48-ResidueDataLen);i ++) //填充不足的字節(jié)數(shù)
{
A7139_WriteByte(0x00); //填充
}
}
else //超出一包數(shù)據(jù)
{
for(i = 0;i 《 48;i ++) //發(fā)送數(shù)據(jù)包
{
A7139_WriteByte(pData[i]);
}
ResidueDataLen = 48; //返回發(fā)送的數(shù)據(jù)長度
}
A7139_CS_H();
return ResidueDataLen; //返回發(fā)送的數(shù)據(jù)長度
}
/*************************************************************************************************************************
* 函數(shù) : u8 A7139_ReadFistPackToFIFO(u8 *pDataBuff, u16 *pRevDataLen, u16 ResidueBuffSize)
* 功能 : FIFO外延模式讀取首包數(shù)據(jù)
* 參數(shù) : pDataBuff:接收數(shù)據(jù)緩沖區(qū);pRevDataLen:需要接收的數(shù)據(jù)總長度(不是當前包長度);ResidueBuffSize:剩余接收數(shù)據(jù)緩沖區(qū)大小
* 返回 : 接收到的數(shù)據(jù)長度(當前接收的)
* 依賴 : 底層宏定義
* 說明 : 用于FIFO外延模式接收第一包,前面2個字節(jié)為總包長度,后面48-2B為數(shù)據(jù)包有效大小
如果數(shù)據(jù)包小于48-2B后面數(shù)據(jù)將丟棄
FIFO外延模式,48B.。.48B.。.48B.。。
*************************************************************************************************************************/
vu8 A7139_ReadFistPackToFIFO(vu8 *pDataBuff, vu16 *pRevDataLen, vu16 ResidueBuffSize)
{
u8 i;
u16 len;
A7139_CS_L();
A7139_OutMode();
A7139_WriteByte(A7139_RFIFO_CMD);
A7139_InMode();
//循環(huán)讀取FIFO
if((A7139_ReadByte()!=0xA5) || ((A7139_ReadByte()!=0xB6)))
{
uart_printf(“幀頭錯誤\r\n”);
*pRevDataLen = 0; //獲取需要接收的總長度
return 0;
}
len = A7139_ReadByte(); //高位
len 《《= 8;
len |= A7139_ReadByte(); //低位
*pRevDataLen = len; //獲取需要接收的總長度
if(len == 0)
{
uart_printf(“長度錯誤\r\n”);
return 0; //長度錯誤
}
if(len 《 ResidueBuffSize) //數(shù)據(jù)緩沖區(qū)足夠大
{
if(len 《 44) //不足一包
{
for(i = 0;i 《 len;i ++)
{
pDataBuff[i] = A7139_ReadByte(); //讀取有效數(shù)據(jù)
}
for(i = 0;i 《 (44-len);i ++) //丟棄
{
A7139_ReadByte();
}
}
else //超過一包
{
for(i = 0;i 《 44;i ++)
{
pDataBuff[i] = A7139_ReadByte(); //讀取有效數(shù)據(jù)
}
len = 44;
}
}
else //緩沖區(qū)不夠
{
if(ResidueBuffSize 《 44) //不足一包
{
for(i = 0;i 《 ResidueBuffSize;i ++)
{
pDataBuff[i] = A7139_ReadByte(); //讀取有效數(shù)據(jù)
}
for(i = 0;i 《 (44-ResidueBuffSize);i ++) //丟棄
{
A7139_ReadByte();
}
len = ResidueBuffSize;
}
else //超過一包
{
for(i = 0;i 《 44;i ++)
{
pDataBuff[i] = A7139_ReadByte(); //讀取有效數(shù)據(jù)
}
len = 44;
}
}
A7139_CS_H();
return len; //返回發(fā)送的數(shù)據(jù)長度
}
/*************************************************************************************************************************
* 函數(shù) : u8 A7139_ReadPackToFIFO(u8 *pDataBuff, u16 ResidueDataLen, u16 ResidueBuffSize)
* 功能 : FIFO外延模式讀取后續(xù)數(shù)據(jù)(非首包)
* 參數(shù) : pDataBuff:接收數(shù)據(jù)緩沖區(qū);ResidueDataLen:未接受的數(shù)據(jù)長度;ResidueBuffSize:剩余接收數(shù)據(jù)緩沖區(qū)大小
* 返回 : 接收到的數(shù)據(jù)長度(當前接收的)
* 依賴 : 底層宏定義
* 說明 : 如果數(shù)據(jù)包小于48后面數(shù)據(jù)將丟棄
FIFO外延模式,48B.。.48B.。.48B.。。
*************************************************************************************************************************/
vu8 A7139_ReadPackToFIFO(vu8 *pDataBuff, vu16 ResidueDataLen, vu16 ResidueBuffSize)
{
u8 i;
A7139_CS_L();
A7139_OutMode();
A7139_WriteByte(A7139_RFIFO_CMD);
A7139_InMode();
//循環(huán)讀取FIFO
if(ResidueDataLen 《 ResidueBuffSize) //數(shù)據(jù)緩沖區(qū)足夠大
{
if(ResidueDataLen 《 48) //不足一包
{
for(i = 0;i 《 ResidueDataLen;i ++)
{
pDataBuff[i] = A7139_ReadByte(); //讀取有效數(shù)據(jù)
}
for(i = 0;i 《 (48-ResidueDataLen);i ++) //丟棄
{
A7139_ReadByte();
}
}
else //超過一包
{
for(i = 0;i 《 48;i ++)
{
pDataBuff[i] = A7139_ReadByte(); //讀取有效數(shù)據(jù)
}
ResidueDataLen = 48;
}
}
else //緩沖區(qū)不夠
{
if(ResidueBuffSize 《 48) //不足一包
{
for(i = 0;i 《 ResidueBuffSize;i ++)
{
pDataBuff[i] = A7139_ReadByte(); //讀取有效數(shù)據(jù)
}
for(i = 0;i 《 (48-ResidueBuffSize);i ++) //丟棄
{
A7139_ReadByte();
}
ResidueDataLen = ResidueBuffSize;
}
else //超過一包
{
for(i = 0;i 《 48;i ++)
{
pDataBuff[i] = A7139_ReadByte(); //讀取有效數(shù)據(jù)
}
ResidueDataLen = 48;
}
}
A7139_CS_H();
return ResidueDataLen; //返回發(fā)送的數(shù)據(jù)長度
}
/*************************************************************************************************************************
* 函數(shù) : bool A7139_SendData(u8 *pData, u16 DataLen)
* 功能 : A7139 發(fā)送數(shù)據(jù)(FIFO外延模式最大16KB-4)
* 參數(shù) : pData:發(fā)送數(shù)據(jù)緩沖區(qū),最大16KB-4;DataLen:發(fā)送數(shù)據(jù)長度
* 返回 : TRUE:發(fā)送成功;FALSE:發(fā)送失敗
* 依賴 : 底層宏定義
* 說明 : 用于FIFO外延模式下發(fā)送數(shù)據(jù)
FIFO外延模式,64B.。.48B.。.48B.。。
至少需要發(fā)送64B以上的數(shù)據(jù)
*************************************************************************************************************************/
bool A7139_SendData(u8 *pData, u16 DataLen)
{
u8 retry = 0;
u16 len = 0;
A7139_DisableNVIC(); //總中斷關(guān)閉
if(DataLen 》 (16*1024-4)) DataLen = (16*1024-4); //限制最大長度為(16KB-4)
if(DataLen 《= 60)
{
A7139_SetSendDataLen(64-1); //設(shè)置發(fā)送數(shù)據(jù)長度
}
else
{
len = ((DataLen-60)%48)?((DataLen-60)/48*48+48):((DataLen-60)/48*48);
A7139_SetSendDataLen(64+len-1); //設(shè)置發(fā)送數(shù)據(jù)長度
}
A7139_StrobeCmd(A7139_STBY_CMD);
A7139_DelayMS(1);
A7139_StrobeCmd(A7139_RESTFIFO_CMD);
A7139_DelayMS(1);
A7139_SetGIO_FPF(); //FPF模式
A7139_SendMode(TRUE); //發(fā)送模式
SendConfig.isSendError = FALSE; //清除發(fā)送錯誤狀態(tài)
SendConfig.isSendOK = FALSE; //清除發(fā)送成功狀態(tài)
SendConfig.pSendData = pData; //設(shè)置發(fā)送數(shù)據(jù)緩沖區(qū)
SendConfig.SendLen = DataLen; //設(shè)置發(fā)送數(shù)據(jù)長度
SendConfig.TranLen = A7139_WriteFistPackToFIFO(&SendConfig.pSendData[0], SendConfig.SendLen); //發(fā)送首包數(shù)據(jù)
A7139_StrobeCmd(A7139_TX_CMD); //發(fā)送命令牌,使A7139進入“發(fā)送”狀態(tài),其后A7139會將數(shù)據(jù)打包后自動發(fā)送
// //定時器主要用來進行調(diào)試,可以計算進入中斷的時間,進而查出問題所在
// DeviceClockEnable(DEV_TIM6, ENABLE); //使能定時器6時鐘
// TIM6-》CNT = 0;
// TIM6-》ARR=60000; //設(shè)定計數(shù)器自動重裝值
// TIM6-》PSC=SYSTEM_GetClkSpeed()/1000000-1; //預(yù)分頻器
// TIM6-》SR = 0; //清除中斷標志位
// TIM6-》CR1|=0x01; //使能定時器6
// IntCnt = 0;
if(SendConfig.TranLen 》= SendConfig.SendLen)
{
SendConfig.isSendOK = TRUE; //發(fā)送完成
}
else
{
A7139_ClearRxInt();
A7139_EnableNVIC(); //總中斷開啟
while(SendConfig.isSendOK != TRUE)
{
A7139_DelayMS(10);
retry ++;
if(retry 》 200)
{
A7139_DisableNVIC();//總中斷關(guān)閉
return FALSE;
}
}
A7139_DisableNVIC();//總中斷關(guān)閉
}
//需要等待最后一包數(shù)據(jù)發(fā)送完畢,一般需要等待至少3ms以上
A7139_DelayMS(1);
return TRUE;
}
/*************************************************************************************************************************
* 函數(shù) : bool A7139_SetRevListen(u8 *pRevBuff, u16 RevBuffSize)
* 功能 : A7139 進入數(shù)據(jù)監(jiān)聽狀態(tài)(FIFO外延模式最大16KB)
* 參數(shù) : pRevBuff:接收數(shù)據(jù)緩沖區(qū),最大16KB;RevBuffSize:接收數(shù)據(jù)緩沖區(qū)大小
* 返回 : 無
* 依賴 : 底層宏定義
* 說明 : 用于FIFO外延模式下接收數(shù)據(jù)
FIFO外延模式,48B.。.48B.。.48B.。。
*************************************************************************************************************************/
bool A7139_SetRevListen(u8 *pRevBuff, u16 RevBuffSize)
{
A7139_SetGIO_FPF(); //FPF模式,F(xiàn)PF信號空閑為低電平
A7139_DisableNVIC(); //總中斷關(guān)閉
A7139_SetSendDataLen(0x3fff); //設(shè)置發(fā)送數(shù)據(jù)長度
A7139_StrobeCmd(A7139_IDLE_CMD);
A7139_DelayMS(1);
A7139_StrobeCmd(A7139_RESRFIFO_CMD);
A7139_DelayMS(1);
A7139_StrobeCmd(A7139_RX_CMD);
RevConfig.pRevData = pRevBuff; //接收數(shù)據(jù)緩沖區(qū)指針
RevConfig.TranLen = 0; //已經(jīng)接收數(shù)據(jù)長度
RevConfig.RevLen = 0; //需接收數(shù)據(jù)長度為0
RevConfig.RevBuffSize = RevBuffSize;//接收緩沖區(qū)大小
RevConfig.isRevOK = FALSE; //接收完成無效
RevConfig.isRevError = FALSE; //接收失敗無效
A7139_SendMode(FALSE); //接收模式
A7139_ClearRxInt();
A7139_EnableNVIC(); //總中斷開啟
uart_printf(“接收監(jiān)控模式!\r\n”);
return TRUE;
}
/*************************************************************************************************************************
* 函數(shù) : int A7139_GetRxLen(void)
* 功能 : 獲取接收數(shù)據(jù)長度
* 參數(shù) : 無
* 返回 : -1:接收錯誤,》0接收到的數(shù)據(jù)長度
* 依賴 : 底層宏定義
* 說明 : A7139 進入接收模式后,使用中斷進行接收
*************************************************************************************************************************/
int A7139_GetRxLen(void)
{
if(RevConfig.isRevError == TRUE) return -1;
else if(RevConfig.isRevOK == TRUE) return RevConfig.TranLen;
else return 0;
}
/*************************************************************************************************************************
* 函數(shù) : void A7139_SetBaseFreq(float RfFreq)
* 功能 : A7139 配置RF基礎(chǔ)頻率
* 參數(shù) : rfFreq:RF頻率,單位MHz
* 返回 : 無
* 依賴 : 底層宏定義
* 說明 : 初始化配置
*************************************************************************************************************************/
void A7139_SetBaseFreq(float RfFreq)
{
float divFreq = RfFreq / 12.800f;
u8 intFreq = (u8)(divFreq); //integer part
float fltFreq = divFreq - intFreq * 1.000f; //fraction part
u16 fpFreg = (u16)(fltFreq * 65536); //FP register val
u16 orgVal;
A7139_StrobeCmd(A7139_STBY_CMD); //enter stand-by mode
//AFC[15:15] = 0
orgVal = A7139Config[A7139_PLL3] & 0x7FFF;
A7139_WriteReg(A7139_PLL3,orgVal);
//RFC[15:12] = 0000
orgVal = A7139Config[A7139_PLL6] & 0x0FFF;
A7139_WriteReg(A7139_PLL6,orgVal);
//MD1[12:12]=0,1
if(RfFreq 《 860) //433-510
orgVal = A7139Config[A7139_PLL4] & 0xEFFF;
else //868-915
orgVal = A7139Config[A7139_PLL4] | 0x1000;
A7139_WriteReg(A7139_PLL4,orgVal);
//IP[8:0] = intg
orgVal = A7139Config[A7139_PLL1] & 0xFF00;
A7139_WriteReg(A7139_PLL1,orgVal|intFreq);
//FP[15:0] = fpFreg
A7139_WriteReg(A7139_PLL2,fpFreg);
//FPA[15:0] = 0x0000,
A7139_WritePageB(A7139_REG9_IF2,0x0000); //偏移為0
}
/*************************************************************************************************************************
* 函數(shù) : bool A7139_Cali(void)
* 功能 : A7139 校準
* 參數(shù) : 無
* 返回 : TRUE:校準成功;FALSE:校準失敗
* 依賴 : 底層宏定義
* 說明 : A7139 頻率校準
************************************************************************************************************************/
bool A7139_Cali(void)
{
u16 fbcf; //IF Filter
u16 vbcf; //VCO Current
u16 vccf; //VCO Band
u16 tmp;
//IF calibration procedure @STB state
A7139_WriteReg(A7139_MODE, A7139Config[A7139_MODE] | 0x0802); //IF Filter & VCO Current Calibration
do{
tmp = A7139_ReadReg(A7139_MODE);
}while(tmp & 0x0802);
//for check(IF Filter)
tmp = A7139_ReadReg(A7139_CALIB);
//fb = tmp & 0x0F;
//fcd = (tmp》》11) & 0x1F;
fbcf = (tmp》》4) & 0x01;
if(fbcf)
{
//FBCF:IF 濾波器自動校準標志(只讀)
return FALSE;
}
//for check(VCO Current)
tmp = A7139_ReadPageA(A7139_REG8_VCO);
//vcb = tmp & 0x0F;
vccf = (tmp》》4) & 0x01;
if(vccf)
{
return FALSE;
}
//RSSI Calibration procedure @STB state
A7139_WriteReg(A7139_ADC, 0x4C00); //set ADC average=64
A7139_WritePageA(A7139_REG8_WOR2, 0xF800); //set RSSC_D=40us and RS_DLY=80us
A7139_WritePageA(A7139_REG8_TX1, A7139Config_PageA[A7139_REG8_TX1] | 0xE000); //set RC_DLY=1.5ms
A7139_WriteReg(A7139_MODE, A7139Config[A7139_MODE] | 0x1000); //RSSI Calibration
do{
tmp = A7139_ReadReg(A7139_MODE);
}while(tmp & 0x1000);
A7139_WriteReg(A7139_ADC, A7139Config[A7139_ADC]);
A7139_WritePageA(A7139_REG8_WOR2, A7139Config_PageA[A7139_REG8_WOR2]);
A7139_WritePageA(A7139_REG8_TX1, A7139Config_PageA[A7139_REG8_TX1]);
//VCO calibration procedure @STB state
A7139_WriteReg(A7139_MODE, A7139Config[A7139_MODE] | 0x0004); //VCO Band Calibration
do{
tmp = A7139_ReadReg(A7139_MODE);
}while(tmp & 0x0004);
//for check(VCO Band)
tmp = A7139_ReadReg(A7139_CALIB);
//vb = (tmp 》》5) & 0x07;
vbcf = (tmp 》》8) & 0x01;
if(vbcf)
{
return FALSE;
}
return TRUE;
}
//PB1接收中斷程序
//警告:如果緩沖區(qū)大小設(shè)置錯誤將產(chǎn)生意想不到的混亂,造成溢出后程序?qū)⒉皇芸?/p>
//接收完畢后一定要退出接收模式,否則會一直受到FPF信號,原因是在不知道數(shù)據(jù)包大小的情況下將數(shù)據(jù)包設(shè)置為無限大小
void EXTI1_IRQHandler(void)
{
A7139_DisableNVIC(); //關(guān)閉總中斷
A7139_ClearRxInt(); //清除中斷
LED1_ON();
//uart_printf(“%d時間:%duS\r\n”,IntCnt,TIM6-》CNT);
if(isSendMode == TRUE) //發(fā)送模式
{
if(SendConfig.TranLen 《 SendConfig.SendLen) //沒發(fā)送完才發(fā)送
{
SendConfig.TranLen += A7139_WritePackToFIFO(&SendConfig.pSendData[SendConfig.TranLen], SendConfig.SendLen-SendConfig.TranLen); //發(fā)送剩下數(shù)據(jù)包
if(SendConfig.TranLen 》= SendConfig.SendLen)
{
LED1_OFF();
SendConfig.isSendOK = TRUE; //發(fā)送完成
A7139_DisableNVIC(); //總中斷關(guān)閉
A7139_ClearRxInt(); //清除中斷
return;
}
}
else //正常情況下不會執(zhí)行到此
{
LED1_OFF();
//uart_printf(“發(fā)送有錯誤\r\n”);
SendConfig.isSendError = TRUE; //發(fā)送完成
A7139_DisableNVIC(); //總中斷關(guān)閉
A7139_ClearRxInt(); //清除中斷
return;
}
}
else
{
if(RevConfig.RevLen == 0) //還沒獲取到需要接收數(shù)據(jù)長度
{
RevConfig.TranLen = A7139_ReadFistPackToFIFO(&RevConfig.pRevData[0], &RevConfig.RevLen, RevConfig.RevBuffSize);
if(RevConfig.RevLen == 0) //接收數(shù)據(jù)長度為0,無效,退出接收
{
LED1_OFF();
A7139_StrobeCmd(A7139_IDLE_CMD);
RevConfig.isRevError = TRUE; //接收有誤,結(jié)束接收
A7139_DisableNVIC(); //總中斷關(guān)閉
A7139_ClearRxInt(); //清除中斷
return;
}
}
else
{
RevConfig.TranLen += A7139_ReadPackToFIFO(&RevConfig.pRevData[RevConfig.TranLen], RevConfig.RevLen-RevConfig.TranLen, RevConfig.RevBuffSize-RevConfig.TranLen);
}
if(RevConfig.TranLen 》= RevConfig.RevBuffSize) //緩沖區(qū)滿了
{
LED1_OFF();
A7139_StrobeCmd(A7139_IDLE_CMD);
RevConfig.isRevOK = TRUE; //接收完成了,結(jié)束接收
A7139_DisableNVIC(); //總中斷關(guān)閉
A7139_ClearRxInt(); //清除中斷
return;
}
else if((RevConfig.TranLen 》= RevConfig.RevLen)&&(RevConfig.RevLen!=0)) //接收完成了
{
LED1_OFF();
A7139_StrobeCmd(A7139_IDLE_CMD);
RevConfig.isRevOK = TRUE; //接收完成了,結(jié)束接收
A7139_DisableNVIC(); //總中斷關(guān)閉
A7139_ClearRxInt(); //清除中斷
return;
}
}
LED1_OFF();
A7139_ClearRxInt(); //清除中斷
A7139_EnableNVIC(); //總中斷開啟
}
頭文件
#ifndef __A7139_H__
#define __A7139_H__
#include “system.h”
#if(BOARD_SUPPORT) //需要板級支持
#include “board.h”
#else //默認支持
//三線spi
#define A7139_DIO_OUT PBout(10)
#define A7139_DIO_IN() PBin(10)
#define A7139_CS PBout(0)
#define A7139_CLK PBout(11)
#define A7139_OutMode() GPIOx_OneInit(GPIOB,10,OUT_PP,SPEED_50M)
#define A7139_InMode() GPIOx_OneInit(GPIOB,10,IN_IPU,IN_IN)
#define A7139_GIO1 PBin(1)
#define A7139_IO_INIT() \
DeviceClockEnable(DEV_GPIOB,ENABLE);/*使能GPIOA時鐘*/\
GPIOx_Init(GPIOB,BIT0|BIT10|BIT11, OUT_PP, SPEED_50M);\
GPIOx_Init(GPIOB,BIT1, IN_IPT, IN_IN);\
#define A7139_IO_POWER_DOWN() \
DeviceClockEnable(DEV_GPIOB,ENABLE);/*使能GPIOA時鐘*/\
GPIOx_Init(GPIOB,BIT0|BIT10|BIT11, IN_IPT, IN_IN);\
//接口
//DIO
#define A7139_DIO_H() (A7139_DIO_OUT=1) //輸出1
#define A7139_DIO_L() (A7139_DIO_OUT=0) //輸出0
#define A7139_CS_H() (A7139_CS=1)
#define A7139_CS_L() (A7139_CS=0)
#define A7139_CLK_H() (A7139_CLK=1)
#define A7139_CLK_L() (A7139_CLK=0)
#define A7139_GIO1_IN() (A7139_GIO1)
//中斷
#define A7139_EnableNVIC() NVIC_IntEnable(IRQ_EXTI1,ENABLE) //總中斷開啟
#define A7139_DisableNVIC() NVIC_IntEnable(IRQ_EXTI1,DISABLE) //總中斷關(guān)閉
#define A7139_EnableInt() EXTI_IntConfig(GPIO_B,1,PosEdge) //上升沿觸發(fā)中斷
#define A7139_DisableInt() EXTI_IntConfig(GPIO_B,1,OFF_INT) //關(guān)閉接收中斷
//清除接收中斷
#define A7139_ClearRxInt() EXTI_ClearInt(1) //清除中斷
#endif
//控制寄存器
typedef enum
{
A7139_SCLOCK = 0x00, //系統(tǒng)時鐘寄存器
A7139_PLL1 = 0x01, //PLL1
A7139_PLL2 = 0x02, //PLL2
A7139_PLL3 = 0x03, //PLL3
A7139_PLL4 = 0x04, //PLL4
A7139_PLL5 = 0x05, //PLL5
A7139_PLL6 = 0x06, //PLL6
A7139_CRYSTAL = 0x07, //晶振設(shè)置
A7139_PREG8S = 0x08, //寄存器組,由CRYSTAL控制切換
A7139_PREG9S = 0x09, //寄存器組,由CRYSTAL控制切換
A7139_RX1 = 0x0A, //接收設(shè)置1
A7139_RX2 = 0x0B, //接收設(shè)置2
A7139_ADC = 0x0C, //ADC
A7139_PIN = 0x0D, //PIN
A7139_CALIB = 0x0E, //Calibration
A7139_MODE = 0x0F, //模式控制
}A7139_CREG;
//控制寄存器組A
typedef enum
{
//寄存器8
A7139_REG8_TX1 = 0, //addr8 page0,
A7139_REG8_WOR1 = 1, //addr8 page1,
A7139_REG8_WOR2 = 2, //addr8 page2,
A7139_REG8_RF = 3, //addr8 page3,
A7139_REG8_POWER = 4, //addr8 page4,
A7139_REG8_AGCRC = 5, //addr8 page5,
A7139_REG8_AGCCON1 = 6, //addr8 page6,
A7139_REG8_AGCCON2 = 7, //addr8 page7,
A7139_REG8_GPIO = 8, //addr8 page8,
A7139_REG8_CKO = 9, //addr8 page9,
A7139_REG8_VCO = 10, //addr8 page10,
A7139_REG8_CHG1 = 11, //addr8 page11,
A7139_REG8_CHG2 = 12, //addr8 page12,
A7139_REG8_FIFO = 13, //addr8 page13,
A7139_REG8_CODE = 14, //addr8 page14,
A7139_REG8_WCAL = 15, //addr8 page15,
}A7139_PAGE_A;
//控制寄存器組B
typedef enum
{
//寄存器9
A7139_REG9_TX2 = 0, //addr9 page0,
A7139_REG9_IF1 = 1, //addr9 page1,
A7139_REG9_IF2 = 2, //addr9 page2,
A7139_REG9_ACK = 3, //addr9 page3,
A7139_REG9_ART = 4, //addr9 page4,
}A7139_PAGE_B;
//Strobe命令
typedef enum
{
A7139_WCR_CMD = 0x00, //寫控制寄存器
A7139_RCR_CMD = 0x80, //讀控制寄存器
A7139_WID_CMD = 0x20, //寫ID
A7139_RID_CMD = 0xA0, //讀ID
A7139_WFIFO_CMD = 0x40, //寫FIFO
A7139_RFIFO_CMD = 0xC0, //讀FIFO
A7139_RESRF_CMD = 0x70, //復(fù)位RF
A7139_RESTFIFO_CMD = 0x60, //復(fù)位發(fā)送FIFO
A7139_RESRFIFO_CMD = 0xE0, //復(fù)位接收FIFO
A7139_SLEEP_CMD = 0x10, //SLEEP模式
A7139_IDLE_CMD = 0x12, //IDLE模式
A7139_STBY_CMD = 0x14, //Standby模式
A7139_PLL_CMD = 0x16, //PLL模式
A7139_RX_CMD = 0x18, //RX模式
A7139_TX_CMD = 0x1A, //TX模式
A7139_TSLEEP_CMD = 0x1C, //Deep sleep 模式 三態(tài)
A7139_PSLEEP_CMD = 0x1F, //Deep sleep 模式 上拉
}A7139_STROBE_CMD;
//宏定義接口
#ifdef _UCOS_II_
#include “ucos_ii.h”
#define A7139_DelayMS(x) OSTimeDlyHMSM(0,0,0,x) //ms延時,最大999ms
#else
#include “delay.h”
#define A7139_DelayMS(x) Delay_MS(x)
#endif
//相關(guān)函數(shù)
void A7139_SoftReset(void); //A7139軟復(fù)位
bool A7139_Init(u8 Channel, u16 RfID, u8 PowerSupply, u8 Rate); //A7139 初始化
void A7139_WriteReg(A7139_CREG RegAddr, u16 data); //寫入控制寄存器
u16 A7139_ReadReg(A7139_CREG RegAddr); //讀取控制寄存器
u32 A7139_ReadID(void); //讀取A7139 ID
void A7139_WriteID(u32 ID); //設(shè)置A7139 ID
u16 A7139_ReadPageA(A7139_PAGE_A RegAddr); //讀取控制寄存器組寄存器A
void A7139_WritePageA(A7139_PAGE_A RegAddr, u16 data);//寫入控制寄存器組寄存器A
u16 A7139_ReadPageB(A7139_PAGE_B RegAddr); //讀取控制寄存器組寄存器B
void A7139_WritePageB(A7139_PAGE_B RegAddr, u16 data);//寫入控制寄存器組寄存器B
void A7139_RestRxFIFO(void); //A7139復(fù)位接收FIFO指針
void A7139_RestTxFIFO(void); //A7139復(fù)位發(fā)送FIFO指針
void A7139_ReadFIFO(u8 *pData, u8 DataLen); //A7139讀取FIFO
void A7139_WriteFIFO(u8 *pData, u8 DataLen); //A7139寫FIFO
void A7139_StrobeCmd(A7139_STROBE_CMD StrobeCmd); //A7139發(fā)送Strobe命令
void A7139_Config(void); //配置A7139
void A7139_SetFreq(float RfFreq); //A7139 配置RF頻率
bool A7139_WaitRxData(u8 pData[64], u16 TimeOut); //等待接收數(shù)據(jù)
int A7139_GetRxLen(void);
bool A7139_SetRev(u8 *pRevBuff, u16 RevBuffSize);
bool A7139_SendData(u8 *pData, u16 DataLen); //A7139發(fā)送數(shù)據(jù)
void A7139_SetTxPowerSupply(u8 PowerSupply); //發(fā)射功率設(shè)置
#define A7139_ReadDeverID() (A7139_ReadPageB(A7139_REG9_TX2)) //讀取設(shè)備硬件ID,只讀
#define A7139_RestRxFIFO() A7139_StrobeCmd(A7139_RESRFIFO_CMD) //A7139復(fù)位接收FIFO指針
#define A7139_RestTxFIFO() A7139_StrobeCmd(A7139_RESTFIFO_CMD) //A7139復(fù)位發(fā)送FIFO指針
#define A7139_SoftReset() A7139_StrobeCmd(A7139_RESRF_CMD) //A7139軟復(fù)位
#endif //A7139
//發(fā)送方測試
/任務(wù)1:
//系統(tǒng)任務(wù)
u8 TempBuff[2048];
void TaskSystem(void *pdata)
{
u16 crc16;
u16 i;
//初始化相關(guān)線程
//uart_printf(“新建線程:TaskLED(%d)\r\n”,OSTaskCreate(TaskLED, (void *)0,&TASK_LED_STK[LED_STK_SIZE-1], LED_TASK_Prio));//通信
//uart_printf(“新建線程:TaskPAIR(%d)\r\n”,OSTaskCreate(TaskPAIR, (void *)0,&TASK_PAIR_STK[PAIR_STK_SIZE-1], PAIR_TASK_Prio));//配對
OSTimeDlyHMSM(0,0,0,10);
for(i = 0;i 《 2048;i ++)
{
TempBuff[i] = i&0xff;
}
i = 320;
//初始化A7139
if(A7139_Init(101, 0x0123, 0, 80) == TRUE)
{
while(1)
{
LED2_ON();
crc16 = CRC16(TempBuff, i);
uart_printf(“發(fā)送數(shù)據(jù)%dB,最后1B:0x%02X 校驗:0x%04X\r\n”,i, TempBuff[i-1], crc16);
if(A7139_SendData(TempBuff,i) == TRUE)
{
uart_printf(“發(fā)送成功\r\n”);
}
else
{
uart_printf(“發(fā)送超時\r\n”);
}
LED2_OFF();
OSTimeDlyHMSM(0,0,2,0);
IWDG_Feed();
}
}
else //初始化失敗
{
LED2_ON();
uart_printf(“通信初始化失!\r\n”);
OSTimeDlyHMSM(0,0,1,500);
LED2_OFF();
}
while(1)
{
LED2_OFF();
OSTimeDlyHMSM(0,0,0,100);
IWDG_Feed();
}
}
接收方測試
[cpp] view plain copy//初始化A7139
if(A7139_Init(101, 0x0123, 0, 80) == TRUE)
{
for(i = 0;i 《 10;i ++)
{
LED_FLASH();
OSTimeDlyHMSM(0,0,0,10);
}
LED_OFF();
if(A7139_SetRevListen(A433Buff, 6000) == FALSE) //重新初始化
{
uart_printf(“接收初始化失敗\r\n”);
}
i = 0;
while(1)
{
len = A7139_GetRxLen();
if(len 《 0) //接收錯誤
{
uart_printf(“接收錯誤\r\n”);
if(A7139_SetRevListen(A433Buff, 6000) == FALSE) //重新初始化
{
uart_printf(“接收初始化失敗\r\n”);
}
i= 0;
}
else if(len)
{
//LED_ON();
crc16 = CRC16(A433Buff, len);
uart_printf(“接收數(shù)據(jù)%dB,校驗:0x%04X\r\n”,len, crc16);
for(i = 0;i 《 len;i ++)
{
uart_printf(“%02X ”, A433Buff[i]);
}
uart_printf(“\r\n”);
//uart_printf(“接收成:%dB\r\n”, len);
OSTimeDlyHMSM(0,0,0,100);
//LED_OFF();
if(A7139_SetRevListen(A433Buff, 6000) == FALSE) //重新初始化
{
uart_printf(“接收初始化失敗\r\n”);
}
i = 0;
}
else
{
i ++;
if(i 》 50)
{
i = 0;
uart_printf(“接收超時\r\n”);
if(A7139_SetRevListen(A433Buff, 6000) == FALSE) //重新初始化
{
uart_printf(“接收初始化失敗\r\n”);
}
}
}
OSTimeDlyHMSM(0,0,0,100);
IWDG_Feed(); //喂狗
}
}
else //初始化失敗
{
LED_FLASH();
OSTimeDlyHMSM(0,0,0,100);
}
發(fā)送調(diào)試信息
接收方調(diào)試信息
評論
查看更多