A7139 无线通信驱动(STM32) 增加FIFO扩展模式,可以发送超大数据包
A7139 拥有电磁波唤醒以及10mW的发射功率,非常容易实现长距离通信,目前测试有障碍物可以轻松达到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); //频率校准
|
|