zoukankan      html  css  js  c++  java
  • A7139 无线通信驱动(STM32) 添加FIFO扩展模式,能够发送超大数据包

    A7139 拥有电磁波唤醒以及10mW的发射功率,很easy实现长距离通信,眼下測试有障碍物能够轻松达到300m以上.

    通过几天的调试,眼下能够发送随意大小的数据包,大小为1-16KB。所有使用中断收发,效率极高。

    添加波特率设置2Kbps-100Kbps随意设置

    添加通信信道设置0-255

    添加发送功率设置0-7


    底层代码

    /*************************************************************************************************************
     * 文件名称:		A7139.c
     * 功能:		STM32 A7139驱动
     * 作者:		cp1300@139.com
     * 创建时间:	2015-07-19
     * 最后改动时间:2015-12-30
     * 具体:		A7139驱动
    *************************************************************************************************************/		
    #include "SYSTEM.H"
    #include "GPIO_INIT.H"
    #include "a7139.H"
    #include "LED.H"
    
    
    
    //晶振寄存器,用于设置晶振以及PAGE地址
    //用于缓存寄存器7的值
    static u16 A7139_CRYSTAL_REG = 0x18;
    
    //单包数据发送超时时间
    #define A7139_SEND_TIME_OUT		5	//单位10ms
    
    //基础频率,设置频率范围为420.500MHZ~452.375MHZ ,频道差为125KHZ
    #define A7139_BASE_FRE			420.5f
    
    //调试开关
    #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;		//系统时钟寄存器
    	u16 PLL1;		//PLL1
    	u16 PLL2;		//PLL2
    	u16 PLL3;		//PLL3
    	u16 PLL4;		//PLL4
    	u16 PLL5;		//PLL5
    	u16 PLL6;		//PLL6
    	u16 CRYSTAL;	//晶振设置
    	u16 PREG8S;		//寄存器组,由CRYSTAL控制切换
    	u16 PREG9S;		//寄存器组,由CRYSTAL控制切换
    	u16 RX1;		//接收设置1
    	u16 RX2;		//接收设置2
    	u16 ADC;		//ADC
    	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功能设置
    #define A7139_SetGIO_WTR()		A7139_WritePageA(A7139_REG8_GPIO, 0x0041)	//WTR模式,单包收发提示
    #define A7139_SetGIO_FPF()		A7139_WritePageA(A7139_REG8_GPIO, 0x0035)	//FPF模式,多包收发状态提示
    #define A7139_SetGIO_NULL()		A7139_WritePageA(A7139_REG8_GPIO, 0x0000)	//关闭GPIO1指示
    
    //发送数据结构
    typedef struct
    {
    	u8 *pSendData;	//发送数据缓冲区指针
    	u16 SendLen;	//须要发送数据长度
    	u16 TranLen;	//已经发送数据长度
    	bool isSendOK;	//发送完毕
    	bool isSendError;//发送失败
    }A7139_SEND_TYPE;
    volatile A7139_SEND_TYPE SendConfig;		//发送数据的信息
    
    
    //接收数据结构
    typedef struct
    {
    	u8 *pRevData;	//接收数据缓冲区指针
    	u16 RevLen;		//须要接收数据长度
    	u16 TranLen;	//已经接收数据长度
    	u16 RevBuffSize;//接收缓冲区大小
    	bool isRevOK;	//接收完毕
    	bool isRevError;//接收失败
    }A7139_REV_TYPE;
    volatile A7139_REV_TYPE RevConfig;		//发送数据的信息
    
    
    //收发模式记录,用于中断处理发送或接收模式
    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	复位FIFO
    			111	RF复位
    
    */
    
    void A7139_SetBaseFreq(float RfFreq);	//基础频率设置
    bool A7139_Cali(void);					//频率校准
    
    
    /*************************************************************************************************************************
    * 函数		:	void A7139_SetTrafficRate(u8 Rate)
    * 功能		:	A7139设置通信速率。单位Kbps
    * 參数		:	Rate:通信速率。单位Kbps
    * 返回		:	无
    * 依赖		:	底层宏定义
    * 作者		:	cp1300@139.com
    * 时间		:	2016-01-02
    * 最后改动	: 	2016-01-02
    * 说明		: 	用于设置通信速率
    				范围2-100Kbps
    				设置系统时钟2分频。设置为12.8MHZ后假设IFBW设置过小会导致初始化时自己主动校准失败
    				假设设置为50会出现校准失败
    *************************************************************************************************************************/
    void A7139_SetTrafficRate(u8 Rate)
    {
    	u16 SDR;
    	
    	if(Rate < 2) Rate = 2;
    	if(Rate > 100) Rate = 100;
    	//IFBW设置 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
    }
    
    
    
    /*************************************************************************************************************************
    * 函数		:	void A7139_SetChannel(u8 Channel)
    * 功能		:	A7139设置通信信道
    * 參数		:	Channel:通信信道0-255
    * 返回		:	无
    * 依赖		:	底层宏定义
    * 作者		:	cp1300@139.com
    * 时间		:	2016-01-02
    * 最后改动	: 	2016-01-02
    * 说明		: 	用于设置通信频道
    				Channel*0.125/0.0125,最小频率偏差为12.5KHZ。设置通道间隔为125KHZ(最少为100KHZ)
    *************************************************************************************************************************/
    void A7139_SetChannel(u8 Channel)
    {
    	A7139_WritePageB(A7139_REG9_IF2,Channel*10);
    }
    
    
    
    /*************************************************************************************************************************
    * 函数		:	void A7139_SetTxPowerSupply(u8 PowerSupply)
    * 功能		:	设置A7139发射功率
    * 參数		:	PowerSupply:功率等级0-7
    * 返回		:	无
    * 依赖		:	底层宏定义
    * 作者		:	cp1300@139.com
    * 时间		:	2016-01-02
    * 最后改动	: 	2016-01-02
    * 说明		: 	用于设置发射功率
    				因为不同频率下TX驱动电流与PA驱动电流并不同样,因此依照文档设置
    				眼下仅仅支持433频段设置。其他频段请依照文档进行设置。

    *************************************************************************************************************************/ 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=增益 } } /************************************************************************************************************************* * 函数 : bool A7139_Init(u8 Channel, u16 RfID, u8 PowerSupply, u8 Rate) * 功能 : A7139初始化 * 參数 : Channel:通信信道0-80。RfID:RF ID,PowerSupply:发射功率0-7;Rate:通信波特率2-100Kbps * 返回 : TRUE:成功;FALSE:失败 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2016-01-02 * 说明 : RF_ID:用于区分网络 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(); //关闭中断 A7139_DisableNVIC(); //关闭总中断 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! ",(u32)(A7139_BASE_FRE*1000+Channel*0.125*1000),Rate, ID); A7139_CRYSTAL_REG = 0x0001; A7139_SoftReset(); //软复位 if(A7139_ReadID() != 0) { A7139_SoftReset(); //软复位 } A7139_DelayMS(1); A7139_Config(); //初始化寄存器 A7139_SetBaseFreq(A7139_BASE_FRE); //设置基础频率 A7139_SetChannel(Channel); //设置信道 A7139_SetTrafficRate(Rate); //设置通信速率 A7139_WriteID(ID); //写入ID temp = A7139_ReadID(); //读取用户ID if(temp != ID) { A7193_debug("A7139 初始化失败,芯片检測错误! "); return FALSE; } A7193_debug("A7139 用户ID:%X 硬件ID:%X ",ID, A7139_ReadDeverID()); A7139_DelayMS(5); if(A7139_Cali()==FALSE) //校准 { A7193_debug("A7139 初始化失败,校准失败! "); return FALSE; } A7193_debug("A7139 初始化成功! "); A7139_SetTxPowerSupply(PowerSupply); //设置发射功率 A7139_EnableInt(); //开启上升沿触发中断 return TRUE; } /************************************************************************************************************************* * 函数 : void A7139_WriteByte(u8 data) * 功能 : A7139写一字节 * 參数 : data:须要写入的数据 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : 不带片选,最底层写入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(); } } /************************************************************************************************************************* * 函数 : u8 A7139_ReadByte(void) * 功能 : A7139读取一字节 * 參数 : 无 * 返回 : 读取的数据 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : 不带片选,最底层读取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; } /************************************************************************************************************************* * 函数 : u16 A7139_ReadReg(A7139_CREG RegAddr) * 功能 : 读取控制寄存器 * 參数 : RegAddr:寄存器地址 * 返回 : 寄存器值 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : *************************************************************************************************************************/ 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; } /************************************************************************************************************************* * 函数 : void A7139_WriteReg(u8 RegAddr, u16 data) * 功能 : 写入控制寄存器 * 參数 : RegAddr:寄存器地址,data:要写入的值 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : *************************************************************************************************************************/ 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(); } /************************************************************************************************************************* * 函数 : u16 A7139_ReadPageA(A7139_PAGE_A RegAddr) * 功能 : 读取控制寄存器组寄存器A * 參数 : RegAddr:寄存器组地址 * 返回 : 寄存器值 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : 寄存器组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); //又一次设置此存器组8地址 data = A7139_ReadReg(A7139_PREG8S); //读取寄存器组数据 return data; } /************************************************************************************************************************* * 函数 : void A7139_WritePageA(A7139_PAGE_A RegAddr, u16 data) * 功能 : 写入控制寄存器组寄存器 * 參数 : RegAddr:寄存器组地址,data:寄存器值 * 返回 : 寄存器值 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : 寄存器组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); //又一次设置此存器组8地址 A7139_WriteReg(A7139_PREG8S, data); //设置寄存器组数据 } /************************************************************************************************************************* * 函数 : u16 A7139_ReadPageB(A7139_PAGE_B RegAddr) * 功能 : 读取控制寄存器组寄存器 * 參数 : RegAddr:寄存器组地址 * 返回 : 寄存器值 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : 寄存器组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); //又一次设置此存器组9地址 data = A7139_ReadReg(A7139_PREG9S); //读取寄存器组数据 return data; } /************************************************************************************************************************* * 函数 : void A7139_WritePageB(A7139_PAGE_B RegAddr, u16 data) * 功能 : 写入控制寄存器组寄存器 * 參数 : RegAddr:寄存器组地址,data:寄存器值 * 返回 : 寄存器值 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : 寄存器组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); //又一次设置此存器组9地址 A7139_WriteReg(A7139_PREG9S, data); //设置寄存器组数据 } /************************************************************************************************************************* * 函数 : u32 A7139_ReadID(void) * 功能 : 读取A7139 ID * 參数 : 无 * 返回 : ID值 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : 读取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; } /************************************************************************************************************************* * 函数 : void A7139_WriteID(u32 ID) * 功能 : 设置A7139 ID * 參数 : 无ID值 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : 设置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(); } /************************************************************************************************************************* * 函数 : void A7139_StrobeCmd(A7139_STROBE_CMD StrobeCmd) * 功能 : A7139发送Strobe命令 * 參数 : 无 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : *************************************************************************************************************************/ void A7139_StrobeCmd(A7139_STROBE_CMD StrobeCmd) { A7139_CS_L(); A7139_OutMode(); A7139_WriteByte(StrobeCmd); A7139_CS_H(); } /************************************************************************************************************************* * 函数 : void A7139_ReadFIFO(u8 *pData, u8 DataLen) * 功能 : A7139读取FIFO * 參数 : 无 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : *************************************************************************************************************************/ void A7139_ReadFIFO(u8 *pData, u8 DataLen) { u8 i; A7139_CS_L(); A7139_OutMode(); A7139_WriteByte(A7139_RFIFO_CMD); A7139_InMode(); //循环读取FIFO for(i = 0;i < DataLen;i ++) { pData[i] = A7139_ReadByte(); } A7139_CS_H(); } /************************************************************************************************************************* * 函数 : void A7139_WriteFIFO(u8 *pData, u8 DataLen) * 功能 : A7139写FIFO * 參数 : 无 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : *************************************************************************************************************************/ void A7139_WriteFIFO(u8 *pData, u8 DataLen) { u8 i; A7139_CS_L(); A7139_OutMode(); A7139_WriteByte(A7139_WFIFO_CMD); //循环写入FIFO for(i = 0;i < DataLen;i ++) { A7139_WriteByte(pData[i]); } A7139_CS_H(); } /************************************************************************************************************************* * 函数 : void A7139_Config(void) * 功能 : A7139 配置 * 參数 : 无 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : 初始化配置 *************************************************************************************************************************/ 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]); } /************************************************************************************************************************* * 函数 : void A7139_SetSendDataLen(u16 DataLen) * 功能 : A7139 设置发送数据长度(仅仅针对FIFO外延模式有效) * 參数 : DataLen:数据长度,最大16KB * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-12-29 * 最后改动 : 2015-12-29 * 说明 : 用于FIFO外延模式下设置发送数据长度 *************************************************************************************************************************/ void A7139_SetSendDataLen(u16 DataLen) { if(DataLen > 16*1024) DataLen = 16*1024; //限制最大长度为16KB //将要发送的数据长度写入到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。FEP【7:0】 } /************************************************************************************************************************* * 函数 : u8 A7139_WriteFistPackToFIFO(u8 *pData, u16 SnedDataLen) * 功能 : FIFO外延模式发送首包数据 * 參数 : pData:数据缓冲区;SnedDataLen:须要发送的数据总长度(不是当前包长度) * 返回 : 发送的数据长度 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-12-30 * 最后改动 : 2015-12-30 * 说明 : 用于FIFO外延模式发送第一包。前面2个字节为总包长度。后面62B为数据包有效大小 假设数据包小于62B后面补充无效数据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); //循环写入FIFO A7139_WriteByte(0xA5); //数据包起始字节1 A7139_WriteByte(0xB6); //数据包起始字节2 A7139_WriteByte(SnedDataLen>>8); //数据包总长度,高位 A7139_WriteByte(SnedDataLen); //数据包总长度,低位 if(SnedDataLen < 60) //不足一包,须要填充 { for(i = 0;i < SnedDataLen;i ++) //发送数据包 { A7139_WriteByte(pData[i]); } for(i = 0;i < (60-SnedDataLen);i ++) //填充不足的字节数 { A7139_WriteByte(0x00); //填充 } } else //超出一包数据 { for(i = 0;i < 60;i ++) //发送数据包 { A7139_WriteByte(pData[i]); } SnedDataLen = 60; //返回发送的数据长度 } A7139_CS_H(); return SnedDataLen; //返回发送的数据长度 } /************************************************************************************************************************* * 函数 : u8 A7139_WritePackToFIFO(u8 *pData, u16 ResidueDataLen) * 功能 : FIFO外延模式发送兴许数据包(不能是第一包) * 參数 : pData:数据缓冲区;ResidueDataLen:剩余须要发送的数长度(不是当前包长度) * 返回 : 发送的数据长度 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-12-30 * 最后改动 : 2015-12-30 * 说明 : 假设剩余数据小于48B后面补充无效数据0x00 FIFO外延模式,64B...48B...48B... BUG:假设外延模式下,写数据中断触发后马上写数据则会再次产生一次写数据中断 *************************************************************************************************************************/ u8 A7139_WritePackToFIFO(u8 *pData, u16 ResidueDataLen) { u8 i; if(ResidueDataLen == 0) return 0; A7139_CS_L(); A7139_OutMode(); A7139_WriteByte(A7139_WFIFO_CMD); //循环写入FIFO if(ResidueDataLen < 48) //不足一包,须要填充 { for(i = 0;i < ResidueDataLen;i ++) //发送数据包 { A7139_WriteByte(pData[i]); } for(i = 0;i < (48-ResidueDataLen);i ++) //填充不足的字节数 { A7139_WriteByte(0x00); //填充 } } else //超出一包数据 { for(i = 0;i < 48;i ++) //发送数据包 { A7139_WriteByte(pData[i]); } ResidueDataLen = 48; //返回发送的数据长度 } A7139_CS_H(); return ResidueDataLen; //返回发送的数据长度 } /************************************************************************************************************************* * 函数 : u8 A7139_ReadFistPackToFIFO(u8 *pDataBuff, u16 *pRevDataLen, u16 ResidueBuffSize) * 功能 : FIFO外延模式读取首包数据 * 參数 : pDataBuff:接收数据缓冲区;pRevDataLen:须要接收的数据总长度(不是当前包长度)。ResidueBuffSize:剩余接收数据缓冲区大小 * 返回 : 接收到的数据长度(当前接收的) * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-12-30 * 最后改动 : 2015-12-30 * 说明 : 用于FIFO外延模式接收第一包,前面2个字节为总包长度,后面48-2B为数据包有效大小 假设数据包小于48-2B后面数据将丢弃 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(); //循环读取FIFO if((A7139_ReadByte()!=0xA5) || ((A7139_ReadByte()!=0xB6))) { uart_printf("帧头错误 "); *pRevDataLen = 0; //获取须要接收的总长度 return 0; } len = A7139_ReadByte(); //高位 len <<= 8; len |= A7139_ReadByte(); //低位 *pRevDataLen = len; //获取须要接收的总长度 if(len == 0) { uart_printf("长度错误 "); return 0; //长度错误 } if(len < ResidueBuffSize) //数据缓冲区足够大 { if(len < 44) //不足一包 { for(i = 0;i < len;i ++) { pDataBuff[i] = A7139_ReadByte(); //读取有效数据 } for(i = 0;i < (44-len);i ++) //丢弃 { A7139_ReadByte(); } } else //超过一包 { for(i = 0;i < 44;i ++) { pDataBuff[i] = A7139_ReadByte(); //读取有效数据 } len = 44; } } else //缓冲区不够 { if(ResidueBuffSize < 44) //不足一包 { for(i = 0;i < ResidueBuffSize;i ++) { pDataBuff[i] = A7139_ReadByte(); //读取有效数据 } for(i = 0;i < (44-ResidueBuffSize);i ++) //丢弃 { A7139_ReadByte(); } len = ResidueBuffSize; } else //超过一包 { for(i = 0;i < 44;i ++) { pDataBuff[i] = A7139_ReadByte(); //读取有效数据 } len = 44; } } A7139_CS_H(); return len; //返回发送的数据长度 } /************************************************************************************************************************* * 函数 : u8 A7139_ReadPackToFIFO(u8 *pDataBuff, u16 ResidueDataLen, u16 ResidueBuffSize) * 功能 : FIFO外延模式读取兴许数据(非首包) * 參数 : pDataBuff:接收数据缓冲区;ResidueDataLen:未接受的数据长度;ResidueBuffSize:剩余接收数据缓冲区大小 * 返回 : 接收到的数据长度(当前接收的) * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-12-30 * 最后改动 : 2015-12-30 * 说明 : 假设数据包小于48后面数据将丢弃 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(); //循环读取FIFO if(ResidueDataLen < ResidueBuffSize) //数据缓冲区足够大 { if(ResidueDataLen < 48) //不足一包 { for(i = 0;i < ResidueDataLen;i ++) { pDataBuff[i] = A7139_ReadByte(); //读取有效数据 } for(i = 0;i < (48-ResidueDataLen);i ++) //丢弃 { A7139_ReadByte(); } } else //超过一包 { for(i = 0;i < 48;i ++) { pDataBuff[i] = A7139_ReadByte(); //读取有效数据 } ResidueDataLen = 48; } } else //缓冲区不够 { if(ResidueBuffSize < 48) //不足一包 { for(i = 0;i < ResidueBuffSize;i ++) { pDataBuff[i] = A7139_ReadByte(); //读取有效数据 } for(i = 0;i < (48-ResidueBuffSize);i ++) //丢弃 { A7139_ReadByte(); } ResidueDataLen = ResidueBuffSize; } else //超过一包 { for(i = 0;i < 48;i ++) { pDataBuff[i] = A7139_ReadByte(); //读取有效数据 } ResidueDataLen = 48; } } A7139_CS_H(); return ResidueDataLen; //返回发送的数据长度 } /************************************************************************************************************************* * 函数 : bool A7139_SendData(u8 *pData, u16 DataLen) * 功能 : A7139 发送数据(FIFO外延模式最大16KB-4) * 參数 : pData:发送数据缓冲区,最大16KB-4;DataLen:发送数据长度 * 返回 : TRUE:发送成功;FALSE:发送失败 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-12-29 * 最后改动 : 2015-12-29 * 说明 : 用于FIFO外延模式下发送数据 FIFO外延模式,64B...48B...48B... 至少须要发送64B以上的数据 *************************************************************************************************************************/ bool A7139_SendData(u8 *pData, u16 DataLen) { u8 retry = 0; u16 len = 0; A7139_DisableNVIC(); //总中断关闭 if(DataLen > (16*1024-4)) DataLen = (16*1024-4); //限制最大长度为(16KB-4) if(DataLen <= 60) { A7139_SetSendDataLen(64-1); //设置发送数据长度 } else { len = ((DataLen-60)%48)?((DataLen-60)/48*48+48):((DataLen-60)/48*48); A7139_SetSendDataLen(64+len-1); //设置发送数据长度 } A7139_StrobeCmd(A7139_STBY_CMD); A7139_DelayMS(1); A7139_StrobeCmd(A7139_RESTFIFO_CMD); A7139_DelayMS(1); A7139_SetGIO_FPF(); //FPF模式 A7139_SendMode(TRUE); //发送模式 SendConfig.isSendError = FALSE; //清除发送错误状态 SendConfig.isSendOK = FALSE; //清除发送成功状态 SendConfig.pSendData = pData; //设置发送数据缓冲区 SendConfig.SendLen = DataLen; //设置发送数据长度 SendConfig.TranLen = A7139_WriteFistPackToFIFO(&SendConfig.pSendData[0], SendConfig.SendLen); //发送首包数据 A7139_StrobeCmd(A7139_TX_CMD); //发送命令牌,使A7139进入“发送”状态,其后A7139会将数据打包后自己主动发送 // //定时器主要用来进行调试,能够计算进入中断的时间,进而查出问题所在 // DeviceClockEnable(DEV_TIM6, ENABLE); //使能定时器6时钟 // TIM6->CNT = 0; // TIM6->ARR=60000; //设定计数器自己主动重装值 // TIM6->PSC=SYSTEM_GetClkSpeed()/1000000-1; //预分频器 // TIM6->SR = 0; //清除中断标志位 // TIM6->CR1|=0x01; //使能定时器6 // IntCnt = 0; if(SendConfig.TranLen >= SendConfig.SendLen) { SendConfig.isSendOK = TRUE; //发送完毕 } else { A7139_ClearRxInt(); A7139_EnableNVIC(); //总中断开启 while(SendConfig.isSendOK != TRUE) { A7139_DelayMS(10); retry ++; if(retry > 200) { A7139_DisableNVIC();//总中断关闭 return FALSE; } } A7139_DisableNVIC();//总中断关闭 } //须要等待最后一包数据发送完毕,一般须要等待至少3ms以上 A7139_DelayMS(1); return TRUE; } /************************************************************************************************************************* * 函数 : bool A7139_SetRevListen(u8 *pRevBuff, u16 RevBuffSize) * 功能 : A7139 进入数据监听状态(FIFO外延模式最大16KB) * 參数 : pRevBuff:接收数据缓冲区,最大16KB;RevBuffSize:接收数据缓冲区大小 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-12-29 * 最后改动 : 2015-12-29 * 说明 : 用于FIFO外延模式下接收数据 FIFO外延模式,48B...48B...48B... *************************************************************************************************************************/ bool A7139_SetRevListen(u8 *pRevBuff, u16 RevBuffSize) { A7139_SetGIO_FPF(); //FPF模式,FPF信号空暇为低电平 A7139_DisableNVIC(); //总中断关闭 A7139_SetSendDataLen(0x3fff); //设置发送数据长度 A7139_StrobeCmd(A7139_IDLE_CMD); A7139_DelayMS(1); A7139_StrobeCmd(A7139_RESRFIFO_CMD); A7139_DelayMS(1); A7139_StrobeCmd(A7139_RX_CMD); RevConfig.pRevData = pRevBuff; //接收数据缓冲区指针 RevConfig.TranLen = 0; //已经接收数据长度 RevConfig.RevLen = 0; //需接收数据长度为0 RevConfig.RevBuffSize = RevBuffSize;//接收缓冲区大小 RevConfig.isRevOK = FALSE; //接收完毕无效 RevConfig.isRevError = FALSE; //接收失败无效 A7139_SendMode(FALSE); //接收模式 A7139_ClearRxInt(); A7139_EnableNVIC(); //总中断开启 uart_printf("接收监控模式! "); return TRUE; } /************************************************************************************************************************* * 函数 : int A7139_GetRxLen(void) * 功能 : 获取接收数据长度 * 參数 : 无 * 返回 : -1:接收错误,>0接收到的数据长度 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2016-01-02 * 最后改动 : 2016-01-02 * 说明 : A7139 进入接收模式后,使用中断进行接收 *************************************************************************************************************************/ int A7139_GetRxLen(void) { if(RevConfig.isRevError == TRUE) return -1; else if(RevConfig.isRevOK == TRUE) return RevConfig.TranLen; else return 0; } /************************************************************************************************************************* * 函数 : void A7139_SetBaseFreq(float RfFreq) * 功能 : A7139 配置RF基础频率 * 參数 : rfFreq:RF频率,单位MHz * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-07-19 * 说明 : 初始化配置 *************************************************************************************************************************/ 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 } /************************************************************************************************************************* * 函数 : bool A7139_Cali(void) * 功能 : A7139 校准 * 參数 : 无 * 返回 : TRUE:校准成功;FALSE:校准失败 * 依赖 : 底层宏定义 * 作者 : cp1300@139.com * 时间 : 2015-07-19 * 最后改动 : 2015-01-02 * 说明 : 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接收中断程序 //警告:假设缓冲区大小设置错误将产生意想不到的混乱。造成溢出后程序将不受控 //接收完毕后一定要退出接收模式。否则会一直受到FPF信号,原因是在不知道数据包大小的情况下将数据包设置为无限大小 void EXTI1_IRQHandler(void) { A7139_DisableNVIC(); //关闭总中断 A7139_ClearRxInt(); //清除中断 LED1_ON(); //uart_printf("%d时间:%duS ",IntCnt,TIM6->CNT); if(isSendMode == TRUE) //发送模式 { if(SendConfig.TranLen < SendConfig.SendLen) //没发送完才发送 { SendConfig.TranLen += A7139_WritePackToFIFO(&SendConfig.pSendData[SendConfig.TranLen], SendConfig.SendLen-SendConfig.TranLen); //发送剩下数据包 if(SendConfig.TranLen >= SendConfig.SendLen) { LED1_OFF(); SendConfig.isSendOK = TRUE; //发送完毕 A7139_DisableNVIC(); //总中断关闭 A7139_ClearRxInt(); //清除中断 return; } } else //正常情况下不会运行到此 { LED1_OFF(); //uart_printf("发送有错误 "); SendConfig.isSendError = TRUE; //发送完毕 A7139_DisableNVIC(); //总中断关闭 A7139_ClearRxInt(); //清除中断 return; } } else { if(RevConfig.RevLen == 0) //还没获取到须要接收数据长度 { RevConfig.TranLen = A7139_ReadFistPackToFIFO(&RevConfig.pRevData[0], &RevConfig.RevLen, RevConfig.RevBuffSize); if(RevConfig.RevLen == 0) //接收数据长度为0,无效。退出接收 { LED1_OFF(); A7139_StrobeCmd(A7139_IDLE_CMD); RevConfig.isRevError = TRUE; //接收有误,结束接收 A7139_DisableNVIC(); //总中断关闭 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) //缓冲区满了 { LED1_OFF(); A7139_StrobeCmd(A7139_IDLE_CMD); RevConfig.isRevOK = TRUE; //接收完毕了,结束接收 A7139_DisableNVIC(); //总中断关闭 A7139_ClearRxInt(); //清除中断 return; } else if((RevConfig.TranLen >= RevConfig.RevLen)&&(RevConfig.RevLen!=0)) //接收完毕了 { LED1_OFF(); A7139_StrobeCmd(A7139_IDLE_CMD); RevConfig.isRevOK = TRUE; //接收完毕了,结束接收 A7139_DisableNVIC(); //总中断关闭 A7139_ClearRxInt(); //清除中断 return; } } LED1_OFF(); A7139_ClearRxInt(); //清除中断 A7139_EnableNVIC(); //总中断开启 }


    头文件

    /*************************************************************************************************************
     * 文件名称:		A7139.h
     * 功能:		STM32 A7139驱动
     * 作者:		cp1300@139.com
     * 创建时间:	2015-07-19
     * 最后改动时间:2015-07-19
     * 具体:		A7139驱动
    *************************************************************************************************************/		
    #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)			//总中断关闭
    #define A7139_EnableInt()		EXTI_IntConfig(GPIO_B,1,PosEdge)			//上升沿触发中断
    #define A7139_DisableInt()		EXTI_IntConfig(GPIO_B,1,OFF_INT)			//关闭接收中断
    
    //清除接收中断
    #define A7139_ClearRxInt()		EXTI_ClearInt(1)						//清除中断
    
    #endif
    
    //控制寄存器
    typedef enum 
    {
    	A7139_SCLOCK	=	0x00,		//系统时钟寄存器
    	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,		//晶振设置
    	A7139_PREG8S	=	0x08,		//寄存器组,由CRYSTAL控制切换
    	A7139_PREG9S	=	0x09,		//寄存器组,由CRYSTAL控制切换
    	A7139_RX1		=	0x0A,		//接收设置1
    	A7139_RX2		=	0x0B,		//接收设置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,	//复位RF
    	A7139_RESTFIFO_CMD	=	0x60,	//复位发送FIFO
    	A7139_RESRFIFO_CMD	=	0xE0,	//复位接收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 模式 三态
    	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
    
    
    //相关函数
    void A7139_SoftReset(void);								//A7139软复位
    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);				//设置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复位接收FIFO指针
    void A7139_RestTxFIFO(void);		//A7139复位发送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发送Strobe命令
    void A7139_Config(void);		//配置A7139
    void A7139_SetFreq(float RfFreq);	//A7139 配置RF频率
    bool A7139_WaitRxData(u8 pData[64], u16 TimeOut);	//等待接收数据
    int A7139_GetRxLen(void);
    bool A7139_SetRev(u8 *pRevBuff, u16 RevBuffSize);
    bool A7139_SendData(u8 *pData, u16 DataLen);		//A7139发送数据
    void A7139_SetTxPowerSupply(u8 PowerSupply);	//发射功率设置
    
    
    #define A7139_ReadDeverID()		(A7139_ReadPageB(A7139_REG9_TX2))	//读取设备硬件ID,仅仅读
    #define A7139_RestRxFIFO()		A7139_StrobeCmd(A7139_RESRFIFO_CMD)	//A7139复位接收FIFO指针
    #define A7139_RestTxFIFO()		A7139_StrobeCmd(A7139_RESTFIFO_CMD)	//A7139复位发送FIFO指针
    #define A7139_SoftReset()		A7139_StrobeCmd(A7139_RESRF_CMD)	//A7139软复位
    
    
    
    
    #endif //A7139
    

    //发送方測试

    /任务1:
    //系统任务
    u8 TempBuff[2048];
    void TaskSystem(void *pdata)
    {
    	u16 crc16;
    	u16 i;
    	
    	//初始化相关线程
    	//uart_printf("新建线程:TaskLED(%d)
    ",OSTaskCreate(TaskLED, (void *)0,&TASK_LED_STK[LED_STK_SIZE-1], LED_TASK_Prio));//通信
    	//uart_printf("新建线程:TaskPAIR(%d)
    ",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("发送数据%dB。最后1B:0x%02X 校验:0x%04X
    ",i, TempBuff[i-1], crc16);
    			if(A7139_SendData(TempBuff,i) == TRUE)
    			{
    				uart_printf("发送成功
    ");
    			}
    			else
    			{
    				uart_printf("发送超时
    ");
    			}
    			LED2_OFF();
    			OSTimeDlyHMSM(0,0,2,0);
    			IWDG_Feed();
    		}
    	}
    	else	//初始化失败
    	{
    		LED2_ON();
    		uart_printf("通信初始化失。
    ");
    		OSTimeDlyHMSM(0,0,1,500);
    		LED2_OFF();
    	}
    	while(1)
    	{
    		LED2_OFF();
    		OSTimeDlyHMSM(0,0,0,100);
    		IWDG_Feed();
    	}
    }

    接收方測试

    //初始化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("接收初始化失败
    ");
    		}
    		i = 0;
    		while(1)
    		{
    			len = A7139_GetRxLen();
    			if(len < 0)	//接收错误
    			{
    				uart_printf("接收错误
    ");
    				if(A7139_SetRevListen(A433Buff, 6000) == FALSE)	//又一次初始化
    				{
    					uart_printf("接收初始化失败
    ");
    				}
    				i= 0;
    			}
    			else if(len)
    			{
    				//LED_ON();
    				crc16 = CRC16(A433Buff, len);
    				uart_printf("接收数据%dB,校验:0x%04X
    ",len,  crc16);
    				for(i = 0;i < len;i ++)
    				{
    					uart_printf("%02X ", A433Buff[i]);
    				}
    				uart_printf("
    ");
    				//uart_printf("接收成:%dB
    ", len);
    				OSTimeDlyHMSM(0,0,0,100);
    				//LED_OFF();
    				if(A7139_SetRevListen(A433Buff, 6000) == FALSE)	//又一次初始化
    				{
    					uart_printf("接收初始化失败
    ");
    				}
    				i = 0;
    			}
    			else 
    			{
    				i ++;
    				if(i >  50)
    				{
    					 i = 0;
    					uart_printf("接收超时
    ");
    					if(A7139_SetRevListen(A433Buff, 6000) == FALSE)	//又一次初始化
    					{
    						uart_printf("接收初始化失败
    ");
    					}
    				}
    			}
    			OSTimeDlyHMSM(0,0,0,100);
    			IWDG_Feed();								//喂狗
    		}
    		
    	}
    	else	//初始化失败
    	{
    		LED_FLASH();
    		OSTimeDlyHMSM(0,0,0,100);
    	}

    发送调试信息


    接收方调试信息



  • 相关阅读:
    mysql 存储过程
    python 模块 SQLalchemy
    python 模块 DButils
    转:6410中断控制详解
    ARM中MMU地址转换理解
    ok6410内存初始化
    ARM时钟初始化
    ARM处理器启动流程
    uboot启动流程
    ARM处理器启动流程
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6891095.html
Copyright © 2011-2022 走看看