打印
[应用相关]

A7139 无线通信驱动(STM32) 增加FIFO扩展模式,可以发送超大...

[复制链接]
1022|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heimaojingzhang|  楼主 | 2021-8-2 13:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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);                                        //频率校准


使用特权

评论回复
沙发
heimaojingzhang|  楼主 | 2021-8-2 13:54 | 只看该作者

/*************************************************************************************************************************
* 函数                :        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
}


使用特权

评论回复
板凳
heimaojingzhang|  楼主 | 2021-8-2 13:54 | 只看该作者

/*************************************************************************************************************************
* 函数                :        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=增益
        }
}




使用特权

评论回复
地板
heimaojingzhang|  楼主 | 2021-8-2 13:54 | 只看该作者

/*************************************************************************************************************************
* 函数                :        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!\r\n",(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 初始化失败,芯片检测错误!\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);                //设置发射功率
        A7139_EnableInt();                                                        //开启上升沿触发中断

        return TRUE;
}



使用特权

评论回复
5
heimaojingzhang|  楼主 | 2021-8-2 13:54 | 只看该作者
/*************************************************************************************************************************
* 函数                :        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();
        }
}



使用特权

评论回复
6
heimaojingzhang|  楼主 | 2021-8-2 13:55 | 只看该作者
/*************************************************************************************************************************
* 函数                :        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;
}



使用特权

评论回复
7
heimaojingzhang|  楼主 | 2021-8-2 13:55 | 只看该作者

/*************************************************************************************************************************
* 函数                :        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;
}


使用特权

评论回复
8
heimaojingzhang|  楼主 | 2021-8-2 13:55 | 只看该作者

/*************************************************************************************************************************
* 函数                :        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();
}



使用特权

评论回复
9
heimaojingzhang|  楼主 | 2021-8-2 13:55 | 只看该作者
/*************************************************************************************************************************
* 函数                :        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;
}



使用特权

评论回复
10
heimaojingzhang|  楼主 | 2021-8-2 13:55 | 只看该作者
/*************************************************************************************************************************
* 函数                :        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);        //设置寄存器组数据
}



使用特权

评论回复
11
heimaojingzhang|  楼主 | 2021-8-2 13:56 | 只看该作者

/*************************************************************************************************************************
* 函数                :        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;
}



使用特权

评论回复
12
heimaojingzhang|  楼主 | 2021-8-2 13:58 | 只看该作者
/*************************************************************************************************************************
* 函数                :        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);                                        //设置寄存器组数据
}



使用特权

评论回复
13
heimaojingzhang|  楼主 | 2021-8-2 13:58 | 只看该作者

/*************************************************************************************************************************
* 函数                :        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;
}



使用特权

评论回复
14
heimaojingzhang|  楼主 | 2021-8-2 13:58 | 只看该作者
/*************************************************************************************************************************
* 函数                :        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();
}



使用特权

评论回复
15
heimaojingzhang|  楼主 | 2021-8-2 14:01 | 只看该作者
/*************************************************************************************************************************
* 函数                :        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();
}



使用特权

评论回复
16
heimaojingzhang|  楼主 | 2021-8-2 14:01 | 只看该作者

/*************************************************************************************************************************
* 函数                :        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 = A7139_ReadByte();
        }
        A7139_CS_H();
}



使用特权

评论回复
17
heimaojingzhang|  楼主 | 2021-8-2 14:02 | 只看该作者
/*************************************************************************************************************************
* 函数                :        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);
        }
        A7139_CS_H();
}


使用特权

评论回复
18
heimaojingzhang|  楼主 | 2021-8-2 14:03 | 只看该作者

/*************************************************************************************************************************
* 函数                :        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);
        for(i=10; i<16; i++)
        A7139_WriteReg((A7139_CREG)i, A7139Config);
     for(i=0; i<16; i++)
        A7139_WritePageA((A7139_PAGE_A)i, A7139Config_PageA);
        for(i=0; i<5; i++)
        A7139_WritePageB((A7139_PAGE_B)i, A7139Config_PageB);
}


使用特权

评论回复
19
heimaojingzhang|  楼主 | 2021-8-2 14:04 | 只看该作者
/*************************************************************************************************************************
* 函数                :        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】
}



使用特权

评论回复
20
heimaojingzhang|  楼主 | 2021-8-2 14:08 | 只看该作者

/*************************************************************************************************************************
* 函数                :        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);
                }
                for(i = 0;i < (60-SnedDataLen);i ++)        //填充不足的字节数
                {
                        A7139_WriteByte(0x00);                //填充
                }
        }
        else        //超出一包数据
        {
                for(i = 0;i < 60;i ++)                        //发送数据包
                {
                        A7139_WriteByte(pData);
                }
                SnedDataLen = 60;                                //返回发送的数据长度
        }
       
        A7139_CS_H();
        return SnedDataLen;                                //返回发送的数据长度
}



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

3962

帖子

4

粉丝