A7139无线驱动调试

A7139 拥有电磁波唤醒以及10mW的发射功率,非常容易实现长距离通信,目前测试有障碍物可以轻松达到300m以上.

通过几天的调试,目前可以发送任意大小的数据包,大小为1-16KB,全部使用中断收发,效率极高。

增加波特率设置2Kbps-100Kbps任意设置

增加通信信道设置0-255

增加发送功率设置0-7


底层代码

[cpp]  view plain  copy
  1. /************************************************************************************************************* 
  2.  * 文件名:     A7139.c 
  3.  * 功能:      STM32 A7139驱动 
  4.  * 作者:      cp1300@139.com 
  5.  * 创建时间:    2015-07-19 
  6.  * 最后修改时间:2015-12-30 
  7.  * 详细:      A7139驱动 
  8. *************************************************************************************************************/        
  9. #include "SYSTEM.H"  
  10. #include "GPIO_INIT.H"  
  11. #include "a7139.H"  
  12. #include "LED.H"  
  13.   
  14.   
  15.   
  16. //晶振寄存器,用于设置晶振以及PAGE地址  
  17. //用于缓存寄存器7的值  
  18. static u16 A7139_CRYSTAL_REG = 0x18;  
  19.   
  20. //单包数据发送超时时间  
  21. #define A7139_SEND_TIME_OUT     5   //单位10ms  
  22.   
  23. //基础频率,设置频率范围为420.500MHZ~452.375MHZ ,频道差为125KHZ  
  24. #define A7139_BASE_FRE          420.5f  
  25.   
  26. //调试开关  
  27. #define A7193_DBUG  1  
  28. #if A7193_DBUG  
  29.     #include "system.h"  
  30.     #define A7193_debug(format,...) uart_printf(format,##__VA_ARGS__)  
  31. #else  
  32.     #define A7193_debug(format,...) /\  
  33. /  
  34. #endif  //A7193_DBUG  
  35.   
  36. vu8 IntCnt = 0;  
  37.   
  38. //寄存器配置  
  39. typedef struct  
  40. {  
  41.     u16 SCLOCK;     //系统时钟寄存器  
  42.     u16 PLL1;       //PLL1  
  43.     u16 PLL2;       //PLL2  
  44.     u16 PLL3;       //PLL3  
  45.     u16 PLL4;       //PLL4  
  46.     u16 PLL5;       //PLL5  
  47.     u16 PLL6;       //PLL6  
  48.     u16 CRYSTAL;    //晶振设置  
  49.     u16 PREG8S;     //寄存器组,由CRYSTAL控制切换  
  50.     u16 PREG9S;     //寄存器组,由CRYSTAL控制切换  
  51.     u16 RX1;        //接收设置1  
  52.     u16 RX2;        //接收设置2  
  53.     u16 ADC;        //ADC  
  54.     u16 PIN;        //PIN  
  55.     u16 CALIB;      //Calibration  
  56.     u16 MODE;       //模式控制  
  57. } A7139_CONFIG_YPTE;  
  58.   
  59.   
  60.   
  61. const u16 A7139Config[]=          
  62. {  
  63.         0x0021,     //SYSTEM CLOCK register,  
  64.         0x0A21,     //PLL1 register,  
  65.         0xDA05,     //PLL2 register,    433.301MHz  
  66.         0x0000,     //PLL3 register,  
  67.         0x0A20,     //PLL4 register,  
  68.         0x0024,     //PLL5 register,  
  69.         0x0000,     //PLL6 register,  
  70.         0x0001,     //CRYSTAL register,  
  71.         0x0000,     //PAGEA,  
  72.         0x0000,     //PAGEB,  
  73.         0x18D4,     //RX1 register,     IFBW=100KHz, ETH=1    
  74.         0x7009,     //RX2 register,     by preamble  
  75.         0x4400,     //ADC register,  
  76.         0x0800,     //PIN CONTROL register,     Use Strobe CMD  
  77.         0x4845,     //CALIBRATION register,  
  78.         0x20C0      //MODE CONTROL register,    Use FIFO mode  
  79. };  
  80.   
  81. const u16 A7139Config_PageA[]=     
  82. {  
  83.         0xF706,     //TX1 register,     Fdev = 37.5kHz  
  84.         0x0000,     //WOR1 register,  
  85.         0xF800,     //WOR2 register,  
  86.         0x1107,     //RFI register,     Enable Tx Ramp up/down  
  87.         0x0170,     //PM register,  
  88.         0x0201,     //RTH register,  
  89.         0x400F,     //AGC1 register,  
  90.         0x2AC0,     //AGC2 register,  
  91.         0x0041,     //GIO register      GIO1->WTR GIO2->WTR   
  92.         0xD281,     //CKO register  
  93.         0x0004,     //VCB register,  
  94.         0x0A21,     //CHG1 register,    430MHz  
  95.         0x0022,     //CHG2 register,    435MHz  
  96.         0x003F,     //FIFO register,    FEP=63+1=64bytes  
  97.         0x1507,     //CODE register,    Preamble=4bytes, ID=4bytes  
  98.         0x0000      //WCAL register,  
  99. };  
  100.   
  101. const u16 A7139Config_PageB[]=     
  102. {  
  103.         0x0337,     //TX2 register,       
  104.         0x8400,     //IF1 register,     Enable Auto-IF, IF=200KHz  
  105.         0x0000,     //IF2 register,     频率偏移为0  
  106.         0x0000,     //ACK register,  
  107.         0x0000      //ART register,  
  108. };  
  109.   
  110.   
  111. //GPIO1功能设置  
  112. #define A7139_SetGIO_WTR()      A7139_WritePageA(A7139_REG8_GPIO, 0x0041)   //WTR模式,单包收发提示  
  113. #define A7139_SetGIO_FPF()      A7139_WritePageA(A7139_REG8_GPIO, 0x0035)   //FPF模式,多包收发状态提示  
  114. #define A7139_SetGIO_NULL()     A7139_WritePageA(A7139_REG8_GPIO, 0x0000)   //关闭GPIO1指示  
  115.   
  116. //发送数据结构  
  117. typedef struct  
  118. {  
  119.     u8 *pSendData;  //发送数据缓冲区指针  
  120.     u16 SendLen;    //需要发送数据长度  
  121.     u16 TranLen;    //已经发送数据长度  
  122.     bool isSendOK;  //发送完成  
  123.     bool isSendError;//发送失败  
  124. }A7139_SEND_TYPE;  
  125. volatile A7139_SEND_TYPE SendConfig;        //发送数据的信息  
  126.   
  127.   
  128. //接收数据结构  
  129. typedef struct  
  130. {  
  131.     u8 *pRevData;   //接收数据缓冲区指针  
  132.     u16 RevLen;     //需要接收数据长度  
  133.     u16 TranLen;    //已经接收数据长度  
  134.     u16 RevBuffSize;//接收缓冲区大小  
  135.     bool isRevOK;   //接收完成  
  136.     bool isRevError;//接收失败  
  137. }A7139_REV_TYPE;  
  138. volatile A7139_REV_TYPE RevConfig;      //发送数据的信息  
  139.   
  140.   
  141. //收发模式记录,用于中断处理发送或接收模式  
  142. static bool isSendMode = FALSE; //默认为接收模式  
  143. #define A7139_SendMode(x)   (isSendMode=x)  
  144.   
  145. /*命令选择 
  146. 地址格式 
  147. BIT7        BIT6-BIT4                   BIT3-BIT0 
  148. R/W         Command                     Address 
  149. 0:写     000 读写控制寄存器 
  150. 1:读     010 读写ID 
  151.             100 读写FIFO 
  152.             110 复位FIFO 
  153.             111 RF复位 
  154.  
  155. */  
  156.   
  157. void A7139_SetBaseFreq(float RfFreq);   //基础频率设置  
  158. bool A7139_Cali(void);                  //频率校准  
  159.   
  160.   
  161. /************************************************************************************************************************* 
  162. * 函数        :   void A7139_SetTrafficRate(u8 Rate) 
  163. * 功能        :   A7139设置通信速率,单位Kbps 
  164. * 参数        :   Rate:通信速率,单位Kbps 
  165. * 返回        :   无 
  166. * 依赖        :   底层宏定义 
  167. * 作者        :   cp1300@139.com 
  168. * 时间        :   2016-01-02 
  169. * 最后修改  :   2016-01-02 
  170. * 说明        :   用于设置通信速率 
  171.                 范围2-100Kbps 
  172.                 设置系统时钟2分频,设置为12.8MHZ后如果IFBW设置过小会导致初始化时自动校准失败 
  173.                 如果设置为50会出现校准失败 
  174. *************************************************************************************************************************/  
  175. void A7139_SetTrafficRate(u8 Rate)  
  176. {  
  177.     u16 SDR;  
  178.       
  179.     if(Rate < 2) Rate = 2;  
  180.     if(Rate > 100) Rate = 100;  
  181.     //IFBW设置 DMOS=1 64分频  ETH=1  CSC=0 FCSCK=12.8MHZ  
  182.     if(Rate <= 50)   //IFBW=100KHZ   
  183.     {  
  184.         A7139_WriteReg(A7139_RX1, 0x18D0 | (1<<2));  
  185.     }  
  186.     else    //IFBW=100KHZ  
  187.     {  
  188.         A7139_WriteReg(A7139_RX1, 0x18D0 | (1<<2));  
  189.     }  
  190.     SDR = 100/Rate;  
  191.     SDR -= 1;           //计算波特率分频值  
  192.   
  193.     A7139_WriteReg(A7139_SCLOCK,0x0021|(SDR<<9)); //CSC=1 GRC=1   SDR  
  194. }  
  195.   
  196.   
  197.   
  198. /************************************************************************************************************************* 
  199. * 函数        :   void A7139_SetChannel(u8 Channel) 
  200. * 功能        :   A7139设置通信信道 
  201. * 参数        :   Channel:通信信道0-255 
  202. * 返回        :   无 
  203. * 依赖        :   底层宏定义 
  204. * 作者        :   cp1300@139.com 
  205. * 时间        :   2016-01-02 
  206. * 最后修改  :   2016-01-02 
  207. * 说明        :   用于设置通信频道 
  208.                 Channel*0.125/0.0125,最小频率偏差为12.5KHZ,设置通道间隔为125KHZ(最少为100KHZ) 
  209. *************************************************************************************************************************/  
  210. void A7139_SetChannel(u8 Channel)  
  211. {  
  212.     A7139_WritePageB(A7139_REG9_IF2,Channel*10);  
  213. }  
  214.   
  215.   
  216.   
  217. /************************************************************************************************************************* 
  218. * 函数        :   void A7139_SetTxPowerSupply(u8 PowerSupply) 
  219. * 功能        :   设置A7139发射功率 
  220. * 参数        :   PowerSupply:功率等级0-7 
  221. * 返回        :   无 
  222. * 依赖        :   底层宏定义 
  223. * 作者        :   cp1300@139.com 
  224. * 时间        :   2016-01-02 
  225. * 最后修改  :   2016-01-02 
  226. * 说明        :   用于设置发射功率 
  227.                 由于不同频率下TX驱动电流与PA驱动电流并不相同,因此按照文档设置 
  228.                 目前只支持433频段设置,其它频段请按照文档进行设置。 
  229. *************************************************************************************************************************/  
  230. void A7139_SetTxPowerSupply(u8 PowerSupply)  
  231. {     
  232.     if(PowerSupply>6)PowerSupply=6;  //最大功率为6  
  233.     if(PowerSupply == 0)  
  234.     {  
  235.         A7139_WritePageB(A7139_REG9_TX2, 0x0300);   //功率最小-34dBm,PAC=0,TDC=0,TBG=增益  
  236.     }  
  237.     else  
  238.     {  
  239.         A7139_WritePageB(A7139_REG9_TX2, 0x0300|(1<<5)|(1<<3)|PowerSupply); //PAC=1,TDC=1,TBG=增益  
  240.     }  
  241. }  
  242.   
  243.   
  244.   
  245. /************************************************************************************************************************* 
  246. * 函数        :   bool A7139_Init(u8 Channel, u16 RfID, u8 PowerSupply, u8 Rate) 
  247. * 功能        :   A7139初始化 
  248. * 参数        :   Channel:通信信道0-80,RfID:RF ID,PowerSupply:发射功率0-7;Rate:通信波特率2-100Kbps 
  249. * 返回        :   TRUE:成功;FALSE:失败 
  250. * 依赖        :   底层宏定义 
  251. * 作者        :   cp1300@139.com 
  252. * 时间        :   2015-07-19 
  253. * 最后修改  :   2016-01-02 
  254. * 说明        :   RF_ID:用于区分网络 
  255.                 2-100Kbps频率间隔至少为100KHZ,150~200KHZ频道间隔必须大于200KHZ 
  256. *************************************************************************************************************************/  
  257. bool A7139_Init(u8 Channel, u16 RfID, u8 PowerSupply, u8 Rate)  
  258. {  
  259.     u32 ID;  
  260.     u32 temp;  
  261.       
  262.     if(Rate < 2) Rate = 2;  
  263.     if(Rate > 100) Rate = 100;  
  264.       
  265.     A7139_DisableInt();     //关闭中断  
  266.     A7139_DisableNVIC();    //关闭总中断  
  267.     A7139_IO_INIT();        //初始化IO  
  268.     A7139_CS_H();  
  269.     A7139_CLK_L();  
  270.     A7139_DIO_H();  
  271.       
  272.     ID = RfID;  
  273.     ID <<= 16;  
  274.     ID |= RfID;  
  275.     A7193_debug("[RF]频率:%dKHz, 通信速率:%dKbps, RFID:%X!\r\n",(u32)(A7139_BASE_FRE*1000+Channel*0.125*1000),Rate, ID);  
  276.       
  277.     A7139_CRYSTAL_REG = 0x0001;  
  278.     A7139_SoftReset();  //软复位  
  279.     if(A7139_ReadID() != 0)  
  280.     {  
  281.         A7139_SoftReset();  //软复位  
  282.     }  
  283.     A7139_DelayMS(1);  
  284.   
  285.     A7139_Config();                         //初始化寄存器  
  286.     A7139_SetBaseFreq(A7139_BASE_FRE);      //设置基础频率  
  287.     A7139_SetChannel(Channel);              //设置信道  
  288.     A7139_SetTrafficRate(Rate);             //设置通信速率  
  289.       
  290.     A7139_WriteID(ID);  //写入ID  
  291.     temp = A7139_ReadID();  //读取用户ID  
  292.     if(temp != ID)  
  293.     {  
  294.         A7193_debug("A7139 初始化失败,芯片检测错误!\r\n");  
  295.         return FALSE;  
  296.     }  
  297.     A7193_debug("A7139 用户ID:%X\t硬件ID:%X\r\n",ID, A7139_ReadDeverID());  
  298.       
  299.   
  300.     A7139_DelayMS(5);  
  301.     if(A7139_Cali()==FALSE)     //校准  
  302.     {  
  303.         A7193_debug("A7139 初始化失败,校准失败!\r\n");  
  304.         return FALSE;  
  305.     }  
  306.     A7193_debug("A7139 初始化成功!\r\n");  
  307.   
  308.       
  309.     A7139_SetTxPowerSupply(PowerSupply);        //设置发射功率  
  310.     A7139_EnableInt();                          //开启上升沿触发中断  
  311.   
  312.     return TRUE;  
  313. }  
  314.   
  315.   
  316. /************************************************************************************************************************* 
  317. * 函数        :   void A7139_WriteByte(u8 data) 
  318. * 功能        :   A7139写一字节 
  319. * 参数        :   data:需要写入的数据 
  320. * 返回        :   无 
  321. * 依赖        :   底层宏定义 
  322. * 作者        :   cp1300@139.com 
  323. * 时间        :   2015-07-19 
  324. * 最后修改  :   2015-07-19 
  325. * 说明        :   不带片选,最底层写入1B 
  326. *************************************************************************************************************************/  
  327. void A7139_WriteByte(u8 data)  
  328. {  
  329.     u8 i;  
  330.       
  331.     for(i = 0;i < 8;i ++)  
  332.     {  
  333.         if(data & 0x80)  
  334.         {  
  335.             A7139_DIO_H();  
  336.         }  
  337.         else  
  338.         {  
  339.             A7139_DIO_L();    
  340.         }  
  341.         nop;nop;  
  342.         A7139_CLK_H();  
  343.         data <<= 1;  
  344.         nop;nop;  
  345.         A7139_CLK_L();  
  346.     }  
  347. }  
  348.   
  349.   
  350.   
  351. /************************************************************************************************************************* 
  352. * 函数        :   u8 A7139_ReadByte(void) 
  353. * 功能        :   A7139读取一字节 
  354. * 参数        :   无 
  355. * 返回        :   读取的数据 
  356. * 依赖        :   底层宏定义 
  357. * 作者        :   cp1300@139.com 
  358. * 时间        :   2015-07-19 
  359. * 最后修改  :   2015-07-19 
  360. * 说明        :   不带片选,最底层读取1B 
  361. *************************************************************************************************************************/  
  362. u8 A7139_ReadByte(void)  
  363. {  
  364.     u8 i;  
  365.     u8 data = 0;  
  366.       
  367.     for(i = 0;i < 8;i ++)  
  368.     {  
  369.         A7139_CLK_H();  
  370.         data <<= 1;  
  371.         if(A7139_DIO_IN())  
  372.         {  
  373.             data |= 1;  
  374.         }  
  375.         nop;  
  376.         A7139_CLK_L();  
  377.         nop;nop;nop;  
  378.     }  
  379.       
  380.     return data;  
  381. }  
  382.   
  383.   
  384.   
  385. /************************************************************************************************************************* 
  386. * 函数        :   u16 A7139_ReadReg(A7139_CREG RegAddr) 
  387. * 功能        :   读取控制寄存器 
  388. * 参数        :   RegAddr:寄存器地址 
  389. * 返回        :   寄存器值 
  390. * 依赖        :   底层宏定义 
  391. * 作者        :   cp1300@139.com 
  392. * 时间        :   2015-07-19 
  393. * 最后修改  :   2015-07-19 
  394. * 说明        :    
  395. *************************************************************************************************************************/  
  396. u16 A7139_ReadReg(A7139_CREG RegAddr)  
  397. {  
  398.     u16 data;  
  399.       
  400.     RegAddr &= 0x0f;                        //地址限制为BIT0-BIT3  
  401.     RegAddr |= A7139_RCR_CMD;               //读命令  
  402.     A7139_CS_L();  
  403.     A7139_OutMode();  
  404.     A7139_WriteByte(RegAddr);  
  405.     A7139_InMode(); //输入  
  406.     data = A7139_ReadByte();  
  407.     data <<= 8;  
  408.     data |= A7139_ReadByte();  
  409.     A7139_CS_H();  
  410.       
  411.     return data;  
  412. }  
  413.   
  414.   
  415.   
  416. /************************************************************************************************************************* 
  417. * 函数        :   void A7139_WriteReg(u8 RegAddr, u16 data) 
  418. * 功能        :   写入控制寄存器 
  419. * 参数        :   RegAddr:寄存器地址,data:要写入的值 
  420. * 返回        :   无 
  421. * 依赖        :   底层宏定义 
  422. * 作者        :   cp1300@139.com 
  423. * 时间        :   2015-07-19 
  424. * 最后修改  :   2015-07-19 
  425. * 说明        :    
  426. *************************************************************************************************************************/  
  427. void A7139_WriteReg(A7139_CREG RegAddr, u16 data)  
  428. {  
  429.     RegAddr &= 0x0f;                        //地址限制为BIT0-BIT3  
  430.     RegAddr |= A7139_WCR_CMD;               //写命令  
  431.     A7139_CS_L();  
  432.     A7139_OutMode();  
  433.     A7139_WriteByte(RegAddr);  
  434.     A7139_WriteByte(data>>8);  
  435.     A7139_WriteByte(data);  
  436.     A7139_CS_H();  
  437. }  
  438.   
  439.   
  440.   
  441. /************************************************************************************************************************* 
  442. * 函数        :   u16 A7139_ReadPageA(A7139_PAGE_A RegAddr) 
  443. * 功能        :   读取控制寄存器组寄存器A 
  444. * 参数        :   RegAddr:寄存器组地址 
  445. * 返回        :   寄存器值 
  446. * 依赖        :   底层宏定义 
  447. * 作者        :   cp1300@139.com 
  448. * 时间        :   2015-07-19 
  449. * 最后修改  :   2015-07-19 
  450. * 说明        :   寄存器组8 
  451. *************************************************************************************************************************/  
  452. u16 A7139_ReadPageA(A7139_PAGE_A RegAddr)  
  453. {  
  454.     u16 data;  
  455.   
  456.     //先选择组  
  457.     A7139_CRYSTAL_REG &= ~(0xf << 12);        //清除寄存器组8地址  
  458.     A7139_CRYSTAL_REG |= (RegAddr << 12); //存储寄存器组8地址  
  459.     A7139_WriteReg(A7139_CRYSTAL, A7139_CRYSTAL_REG);   //重新设置此存器组8地址  
  460.     data = A7139_ReadReg(A7139_PREG8S);     //读取寄存器组数据  
  461.       
  462.     return data;  
  463. }  
  464.   
  465.   
  466.   
  467. /************************************************************************************************************************* 
  468. * 函数        :   void A7139_WritePageA(A7139_PAGE_A RegAddr, u16 data) 
  469. * 功能        :   写入控制寄存器组寄存器 
  470. * 参数        :   RegAddr:寄存器组地址,data:寄存器值 
  471. * 返回        :   寄存器值 
  472. * 依赖        :   底层宏定义 
  473. * 作者        :   cp1300@139.com 
  474. * 时间        :   2015-07-19 
  475. * 最后修改  :   2015-07-19 
  476. * 说明        :   寄存器组8 
  477. *************************************************************************************************************************/  
  478. void A7139_WritePageA(A7139_PAGE_A RegAddr, u16 data)  
  479. {  
  480.     //先选择组  
  481.     A7139_CRYSTAL_REG &= ~(0xf << 12);        //清除寄存器组8地址  
  482.     A7139_CRYSTAL_REG |= (RegAddr << 12); //存储寄存器组8地址  
  483.     A7139_WriteReg(A7139_CRYSTAL, A7139_CRYSTAL_REG);   //重新设置此存器组8地址  
  484.     A7139_WriteReg(A7139_PREG8S, data); //设置寄存器组数据  
  485. }  
  486.   
  487.   
  488.   
  489. /************************************************************************************************************************* 
  490. * 函数        :   u16 A7139_ReadPageB(A7139_PAGE_B RegAddr) 
  491. * 功能        :   读取控制寄存器组寄存器 
  492. * 参数        :   RegAddr:寄存器组地址 
  493. * 返回        :   寄存器值 
  494. * 依赖        :   底层宏定义 
  495. * 作者        :   cp1300@139.com 
  496. * 时间        :   2015-07-19 
  497. * 最后修改  :   2015-07-19 
  498. * 说明        :   寄存器组9 
  499. *************************************************************************************************************************/  
  500. u16 A7139_ReadPageB(A7139_PAGE_B RegAddr)  
  501. {  
  502.     u16 data;  
  503.       
  504.     A7139_CRYSTAL_REG &= ~(0x7 << 7);                 //清除寄存器组9地址  
  505.     A7139_CRYSTAL_REG |= ((RegAddr&0x7) << 7);            //存储寄存器组9地址  
  506.     A7139_WriteReg(A7139_CRYSTAL, A7139_CRYSTAL_REG);   //重新设置此存器组9地址  
  507.     data = A7139_ReadReg(A7139_PREG9S);                 //读取寄存器组数据  
  508.       
  509.     return data;  
  510. }  
  511.   
  512.   
  513.   
  514. /************************************************************************************************************************* 
  515. * 函数        :   void A7139_WritePageB(A7139_PAGE_B RegAddr, u16 data) 
  516. * 功能        :   写入控制寄存器组寄存器 
  517. * 参数        :   RegAddr:寄存器组地址,data:寄存器值 
  518. * 返回        :   寄存器值 
  519. * 依赖        :   底层宏定义 
  520. * 作者        :   cp1300@139.com 
  521. * 时间        :   2015-07-19 
  522. * 最后修改  :   2015-07-19 
  523. * 说明        :   寄存器组9 
  524. *************************************************************************************************************************/  
  525. void A7139_WritePageB(A7139_PAGE_B RegAddr, u16 data)  
  526. {  
  527.     //先选择组  
  528.     A7139_CRYSTAL_REG &= ~(0x7 << 7);                 //清除寄存器组9地址  
  529.     A7139_CRYSTAL_REG |= ((RegAddr&0x7) << 7);            //存储寄存器组9地址  
  530.     A7139_WriteReg(A7139_CRYSTAL, A7139_CRYSTAL_REG);   //重新设置此存器组9地址  
  531.     A7139_WriteReg(A7139_PREG9S, data);                 //设置寄存器组数据  
  532. }  
  533.   
  534. /************************************************************************************************************************* 
  535. * 函数        :   u32 A7139_ReadID(void) 
  536. * 功能        :   读取A7139 ID 
  537. * 参数        :   无 
  538. * 返回        :   ID值 
  539. * 依赖        :   底层宏定义 
  540. * 作者        :   cp1300@139.com 
  541. * 时间        :   2015-07-19 
  542. * 最后修改  :   2015-07-19 
  543. * 说明        :   读取ID 
  544. *************************************************************************************************************************/  
  545. u32 A7139_ReadID(void)  
  546. {  
  547.     u32 data;  
  548.     u8 i;  
  549.       
  550.     A7139_CS_L();  
  551.     A7139_OutMode();  
  552.     A7139_WriteByte(A7139_RID_CMD);         //读ID命令  
  553.     A7139_InMode(); //输入  
  554.     data = 0;  
  555.     for(i = 0;i < 4;i ++)  
  556.     {  
  557.         data <<= 8;  
  558.         data |= A7139_ReadByte();  
  559.     }  
  560.     A7139_CS_H();  
  561.       
  562.     return data;  
  563. }  
  564.   
  565.   
  566. /************************************************************************************************************************* 
  567. * 函数        :   void A7139_WriteID(u32 ID) 
  568. * 功能        :   设置A7139 ID 
  569. * 参数        :   无ID值 
  570. * 返回        :   无 
  571. * 依赖        :   底层宏定义 
  572. * 作者        :   cp1300@139.com 
  573. * 时间        :   2015-07-19 
  574. * 最后修改  :   2015-07-19 
  575. * 说明        :   设置ID 
  576. *************************************************************************************************************************/  
  577. void A7139_WriteID(u32 ID)  
  578. {  
  579.     A7139_CS_L();  
  580.     A7139_OutMode();  
  581.     A7139_WriteByte(A7139_WID_CMD);         //写ID命令  
  582.     A7139_WriteByte(ID >> 24);  
  583.     A7139_WriteByte(ID >> 16);  
  584.     A7139_WriteByte(ID >> 8);  
  585.     A7139_WriteByte(ID >> 0);  
  586.     A7139_CS_H();  
  587. }  
  588.   
  589.   
  590.   
  591. /************************************************************************************************************************* 
  592. * 函数        :   void A7139_StrobeCmd(A7139_STROBE_CMD StrobeCmd) 
  593. * 功能        :   A7139发送Strobe命令 
  594. * 参数        :   无 
  595. * 返回        :   无 
  596. * 依赖        :   底层宏定义 
  597. * 作者        :   cp1300@139.com 
  598. * 时间        :   2015-07-19 
  599. * 最后修改  :   2015-07-19 
  600. * 说明        :    
  601. *************************************************************************************************************************/  
  602. void A7139_StrobeCmd(A7139_STROBE_CMD StrobeCmd)  
  603. {  
  604.     A7139_CS_L();  
  605.     A7139_OutMode();  
  606.     A7139_WriteByte(StrobeCmd);  
  607.     A7139_CS_H();  
  608. }  
  609.   
  610.   
  611.   
  612. /************************************************************************************************************************* 
  613. * 函数        :   void A7139_ReadFIFO(u8 *pData, u8 DataLen) 
  614. * 功能        :   A7139读取FIFO 
  615. * 参数        :   无 
  616. * 返回        :   无 
  617. * 依赖        :   底层宏定义 
  618. * 作者        :   cp1300@139.com 
  619. * 时间        :   2015-07-19 
  620. * 最后修改  :   2015-07-19 
  621. * 说明        :    
  622. *************************************************************************************************************************/  
  623. void A7139_ReadFIFO(u8 *pData, u8 DataLen)  
  624. {  
  625.     u8 i;  
  626.       
  627.     A7139_CS_L();  
  628.     A7139_OutMode();  
  629.     A7139_WriteByte(A7139_RFIFO_CMD);  
  630.     A7139_InMode();  
  631.     //循环读取FIFO  
  632.     for(i = 0;i < DataLen;i ++)  
  633.     {  
  634.         pData[i] = A7139_ReadByte();  
  635.     }  
  636.     A7139_CS_H();  
  637. }  
  638.   
  639.   
  640. /************************************************************************************************************************* 
  641. * 函数        :   void A7139_WriteFIFO(u8 *pData, u8 DataLen) 
  642. * 功能        :   A7139写FIFO 
  643. * 参数        :   无 
  644. * 返回        :   无 
  645. * 依赖        :   底层宏定义 
  646. * 作者        :   cp1300@139.com 
  647. * 时间        :   2015-07-19 
  648. * 最后修改  :   2015-07-19 
  649. * 说明        :    
  650. *************************************************************************************************************************/  
  651. void A7139_WriteFIFO(u8 *pData, u8 DataLen)  
  652. {  
  653.     u8 i;  
  654.       
  655.     A7139_CS_L();  
  656.     A7139_OutMode();  
  657.     A7139_WriteByte(A7139_WFIFO_CMD);  
  658.     //循环写入FIFO  
  659.     for(i = 0;i < DataLen;i ++)  
  660.     {  
  661.         A7139_WriteByte(pData[i]);  
  662.     }  
  663.     A7139_CS_H();  
  664. }  
  665.   
  666.   
  667.   
  668.   
  669.   
  670. /************************************************************************************************************************* 
  671. * 函数        :   void A7139_Config(void) 
  672. * 功能        :   A7139 配置 
  673. * 参数        :   无 
  674. * 返回        :   无 
  675. * 依赖        :   底层宏定义 
  676. * 作者        :   cp1300@139.com 
  677. * 时间        :   2015-07-19 
  678. * 最后修改  :   2015-07-19 
  679. * 说明        :   初始化配置 
  680. *************************************************************************************************************************/  
  681. void A7139_Config(void)  
  682. {  
  683.     u8 i;  
  684.       
  685.     for(i=0; i<8; i++)  
  686.         A7139_WriteReg((A7139_CREG)i, A7139Config[i]);  
  687.     for(i=10; i<16; i++)  
  688.         A7139_WriteReg((A7139_CREG)i, A7139Config[i]);  
  689.      for(i=0; i<16; i++)  
  690.         A7139_WritePageA((A7139_PAGE_A)i, A7139Config_PageA[i]);  
  691.     for(i=0; i<5; i++)  
  692.         A7139_WritePageB((A7139_PAGE_B)i, A7139Config_PageB[i]);  
  693. }  
  694.   
  695.   
  696. /************************************************************************************************************************* 
  697. * 函数        :   void A7139_SetSendDataLen(u16 DataLen) 
  698. * 功能        :   A7139 设置发送数据长度(只针对FIFO外延模式有效) 
  699. * 参数        :   DataLen:数据长度,最大16KB 
  700. * 返回        :   无 
  701. * 依赖        :   底层宏定义 
  702. * 作者        :   cp1300@139.com 
  703. * 时间        :   2015-12-29 
  704. * 最后修改  :   2015-12-29 
  705. * 说明        :   用于FIFO外延模式下设置发送数据长度 
  706. *************************************************************************************************************************/  
  707. void A7139_SetSendDataLen(u16 DataLen)  
  708. {  
  709.     if(DataLen > 16*1024) DataLen = 16*1024;                     //限制最大长度为16KB  
  710.       
  711.     //将要发送的数据长度写入到FEP[13:0]寄存器中  
  712.     A7139_WritePageA(A7139_REG8_VCO, (DataLen&0x3F00) | 0x04);      //FEP【13:8】  
  713.     A7139_WritePageA(A7139_REG8_FIFO, (3<<14) | (DataLen&0xFF));  //FPM=3;PSA=0,FEP【7:0】  
  714. }  
  715.   
  716.   
  717.   
  718. /************************************************************************************************************************* 
  719. * 函数        :   u8 A7139_WriteFistPackToFIFO(u8 *pData, u16 SnedDataLen) 
  720. * 功能        :   FIFO外延模式发送首包数据 
  721. * 参数        :   pData:数据缓冲区;SnedDataLen:需要发送的数据总长度(不是当前包长度) 
  722. * 返回        :   发送的数据长度 
  723. * 依赖        :   底层宏定义 
  724. * 作者        :   cp1300@139.com 
  725. * 时间        :   2015-12-30 
  726. * 最后修改  :   2015-12-30 
  727. * 说明        :   用于FIFO外延模式发送第一包,前面2个字节为总包长度,后面62B为数据包有效大小 
  728.                 如果数据包小于62B后面补充无效数据0x00 
  729.                 FIFO外延模式,64B...48B...48B... 
  730. *************************************************************************************************************************/  
  731. u8 A7139_WriteFistPackToFIFO(u8 *pData, u16 SnedDataLen)  
  732. {  
  733.     u16 i;  
  734.     u8 temp;  
  735.       
  736.     A7139_CS_L();  
  737.     A7139_OutMode();  
  738.     A7139_WriteByte(A7139_WFIFO_CMD);  
  739.     //循环写入FIFO  
  740.     A7139_WriteByte(0xA5);                  //数据包起始字节1  
  741.     A7139_WriteByte(0xB6);                  //数据包起始字节2  
  742.     A7139_WriteByte(SnedDataLen>>8);      //数据包总长度,高位  
  743.     A7139_WriteByte(SnedDataLen);           //数据包总长度,低位  
  744.     if(SnedDataLen < 60)                 //不足一包,需要填充  
  745.     {  
  746.         for(i = 0;i < SnedDataLen;i ++)          //发送数据包  
  747.         {  
  748.             A7139_WriteByte(pData[i]);  
  749.         }  
  750.         for(i = 0;i < (60-SnedDataLen);i ++) //填充不足的字节数  
  751.         {  
  752.             A7139_WriteByte(0x00);      //填充  
  753.         }  
  754.     }  
  755.     else    //超出一包数据  
  756.     {  
  757.         for(i = 0;i < 60;i ++)           //发送数据包  
  758.         {  
  759.             A7139_WriteByte(pData[i]);  
  760.         }  
  761.         SnedDataLen = 60;               //返回发送的数据长度  
  762.     }  
  763.       
  764.     A7139_CS_H();  
  765.     return SnedDataLen;             //返回发送的数据长度  
  766. }  
  767.   
  768.   
  769.   
  770. /************************************************************************************************************************* 
  771. * 函数        :   u8 A7139_WritePackToFIFO(u8 *pData, u16 ResidueDataLen) 
  772. * 功能        :   FIFO外延模式发送后续数据包(不能是第一包) 
  773. * 参数        :   pData:数据缓冲区;ResidueDataLen:剩余需要发送的数长度(不是当前包长度) 
  774. * 返回        :   发送的数据长度 
  775. * 依赖        :   底层宏定义 
  776. * 作者        :   cp1300@139.com 
  777. * 时间        :   2015-12-30 
  778. * 最后修改  :   2015-12-30 
  779. * 说明        :   如果剩余数据小于48B后面补充无效数据0x00 
  780.                 FIFO外延模式,64B...48B...48B... 
  781.                 BUG:如果外延模式下,写数据中断触发后立即写数据则会再次产生一次写数据中断 
  782. *************************************************************************************************************************/  
  783. u8 A7139_WritePackToFIFO(u8 *pData, u16 ResidueDataLen)  
  784. {  
  785.     u8 i;  
  786.       
  787.     if(ResidueDataLen == 0) return 0;  
  788.       
  789.   
  790.     A7139_CS_L();  
  791.     A7139_OutMode();  
  792.     A7139_WriteByte(A7139_WFIFO_CMD);  
  793.   
  794.     //循环写入FIFO  
  795.     if(ResidueDataLen < 48)                          //不足一包,需要填充  
  796.     {  
  797.         for(i = 0;i < ResidueDataLen;i ++)           //发送数据包  
  798.         {  
  799.             A7139_WriteByte(pData[i]);  
  800.         }  
  801.         for(i = 0;i < (48-ResidueDataLen);i ++)      //填充不足的字节数  
  802.         {  
  803.             A7139_WriteByte(0x00);                  //填充  
  804.         }  
  805.     }  
  806.     else    //超出一包数据  
  807.     {  
  808.         for(i = 0;i < 48;i ++)                       //发送数据包  
  809.         {  
  810.             A7139_WriteByte(pData[i]);  
  811.         }  
  812.         ResidueDataLen = 48;                                    //返回发送的数据长度  
  813.     }  
  814.       
  815.     A7139_CS_H();  
  816.     return ResidueDataLen;                      //返回发送的数据长度  
  817. }  
  818.   
  819.   
  820.   
  821. /************************************************************************************************************************* 
  822. * 函数        :   u8 A7139_ReadFistPackToFIFO(u8 *pDataBuff, u16 *pRevDataLen, u16 ResidueBuffSize) 
  823. * 功能        :   FIFO外延模式读取首包数据 
  824. * 参数        :   pDataBuff:接收数据缓冲区;pRevDataLen:需要接收的数据总长度(不是当前包长度);ResidueBuffSize:剩余接收数据缓冲区大小 
  825. * 返回        :   接收到的数据长度(当前接收的) 
  826. * 依赖        :   底层宏定义 
  827. * 作者        :   cp1300@139.com 
  828. * 时间        :   2015-12-30 
  829. * 最后修改  :   2015-12-30 
  830. * 说明        :   用于FIFO外延模式接收第一包,前面2个字节为总包长度,后面48-2B为数据包有效大小 
  831.                 如果数据包小于48-2B后面数据将丢弃 
  832.                 FIFO外延模式,48B...48B...48B... 
  833. *************************************************************************************************************************/  
  834. vu8 A7139_ReadFistPackToFIFO(vu8 *pDataBuff, vu16 *pRevDataLen, vu16 ResidueBuffSize)  
  835. {  
  836.     u8 i;  
  837.     u16 len;  
  838.       
  839.     A7139_CS_L();  
  840.     A7139_OutMode();  
  841.     A7139_WriteByte(A7139_RFIFO_CMD);  
  842.     A7139_InMode();  
  843.     //循环读取FIFO  
  844.     if((A7139_ReadByte()!=0xA5) || ((A7139_ReadByte()!=0xB6)))  
  845.     {  
  846.         uart_printf("帧头错误\r\n");  
  847.         *pRevDataLen = 0;           //获取需要接收的总长度  
  848.         return 0;  
  849.     }  
  850.     len = A7139_ReadByte();     //高位  
  851.     len <<= 8;  
  852.     len |= A7139_ReadByte();    //低位  
  853.     *pRevDataLen = len;         //获取需要接收的总长度  
  854.     if(len == 0)   
  855.     {  
  856.         uart_printf("长度错误\r\n");  
  857.         return 0;       //长度错误  
  858.     }  
  859.     if(len < ResidueBuffSize)    //数据缓冲区足够大  
  860.     {  
  861.         if(len < 44) //不足一包  
  862.         {  
  863.             for(i = 0;i < len;i ++)    
  864.             {  
  865.                 pDataBuff[i] = A7139_ReadByte();    //读取有效数据  
  866.             }  
  867.             for(i = 0;i < (44-len);i ++)         //丢弃  
  868.             {  
  869.                 A7139_ReadByte();     
  870.             }  
  871.         }  
  872.         else    //超过一包  
  873.         {  
  874.             for(i = 0;i < 44;i ++)     
  875.             {  
  876.                 pDataBuff[i] = A7139_ReadByte();    //读取有效数据  
  877.             }  
  878.             len = 44;  
  879.         }  
  880.     }  
  881.     else    //缓冲区不够  
  882.     {  
  883.         if(ResidueBuffSize < 44) //不足一包  
  884.         {  
  885.             for(i = 0;i < ResidueBuffSize;i ++)    
  886.             {  
  887.                 pDataBuff[i] = A7139_ReadByte();    //读取有效数据  
  888.             }  
  889.             for(i = 0;i < (44-ResidueBuffSize);i ++)         //丢弃  
  890.             {  
  891.                 A7139_ReadByte();     
  892.             }  
  893.             len = ResidueBuffSize;  
  894.         }  
  895.         else    //超过一包  
  896.         {  
  897.             for(i = 0;i < 44;i ++)     
  898.             {  
  899.                 pDataBuff[i] = A7139_ReadByte();    //读取有效数据  
  900.             }  
  901.             len = 44;  
  902.         }  
  903.     }  
  904.       
  905.     A7139_CS_H();  
  906.     return len;             //返回发送的数据长度  
  907. }  
  908.   
  909.   
  910.   
  911. /************************************************************************************************************************* 
  912. * 函数        :   u8 A7139_ReadPackToFIFO(u8 *pDataBuff, u16 ResidueDataLen, u16 ResidueBuffSize) 
  913. * 功能        :   FIFO外延模式读取后续数据(非首包) 
  914. * 参数        :   pDataBuff:接收数据缓冲区;ResidueDataLen:未接受的数据长度;ResidueBuffSize:剩余接收数据缓冲区大小 
  915. * 返回        :   接收到的数据长度(当前接收的) 
  916. * 依赖        :   底层宏定义 
  917. * 作者        :   cp1300@139.com 
  918. * 时间        :   2015-12-30 
  919. * 最后修改  :   2015-12-30 
  920. * 说明        :   如果数据包小于48后面数据将丢弃 
  921.                 FIFO外延模式,48B...48B...48B... 
  922. *************************************************************************************************************************/  
  923. vu8 A7139_ReadPackToFIFO(vu8 *pDataBuff, vu16 ResidueDataLen, vu16 ResidueBuffSize)  
  924. {  
  925.     u8 i;  
  926.       
  927.     A7139_CS_L();  
  928.     A7139_OutMode();  
  929.     A7139_WriteByte(A7139_RFIFO_CMD);  
  930.     A7139_InMode();  
  931.     //循环读取FIFO  
  932.     if(ResidueDataLen < ResidueBuffSize) //数据缓冲区足够大  
  933.     {  
  934.         if(ResidueDataLen < 48)  //不足一包  
  935.         {  
  936.             for(i = 0;i < ResidueDataLen;i ++)     
  937.             {  
  938.                 pDataBuff[i] = A7139_ReadByte();    //读取有效数据  
  939.             }  
  940.             for(i = 0;i < (48-ResidueDataLen);i ++)          //丢弃  
  941.             {  
  942.                 A7139_ReadByte();     
  943.             }  
  944.         }  
  945.         else    //超过一包  
  946.         {  
  947.             for(i = 0;i < 48;i ++)     
  948.             {  
  949.                 pDataBuff[i] = A7139_ReadByte();    //读取有效数据  
  950.             }  
  951.             ResidueDataLen = 48;  
  952.         }  
  953.     }  
  954.     else    //缓冲区不够  
  955.     {  
  956.         if(ResidueBuffSize < 48) //不足一包  
  957.         {  
  958.             for(i = 0;i < ResidueBuffSize;i ++)    
  959.             {  
  960.                 pDataBuff[i] = A7139_ReadByte();    //读取有效数据  
  961.             }  
  962.             for(i = 0;i < (48-ResidueBuffSize);i ++)         //丢弃  
  963.             {  
  964.                 A7139_ReadByte();     
  965.             }  
  966.             ResidueDataLen = ResidueBuffSize;  
  967.         }  
  968.         else    //超过一包  
  969.         {  
  970.             for(i = 0;i < 48;i ++)     
  971.             {  
  972.                 pDataBuff[i] = A7139_ReadByte();    //读取有效数据  
  973.             }  
  974.             ResidueDataLen = 48;  
  975.         }  
  976.     }  
  977.       
  978.     A7139_CS_H();  
  979.     return ResidueDataLen;              //返回发送的数据长度  
  980. }  
  981.   
  982.   
  983. /************************************************************************************************************************* 
  984. * 函数        :   bool A7139_SendData(u8 *pData, u16 DataLen) 
  985. * 功能        :   A7139 发送数据(FIFO外延模式最大16KB-4) 
  986. * 参数        :   pData:发送数据缓冲区,最大16KB-4;DataLen:发送数据长度 
  987. * 返回        :   TRUE:发送成功;FALSE:发送失败 
  988. * 依赖        :   底层宏定义 
  989. * 作者        :   cp1300@139.com 
  990. * 时间        :   2015-12-29 
  991. * 最后修改  :   2015-12-29 
  992. * 说明        :   用于FIFO外延模式下发送数据 
  993.                 FIFO外延模式,64B...48B...48B... 
  994.                 至少需要发送64B以上的数据 
  995. *************************************************************************************************************************/  
  996. bool A7139_SendData(u8 *pData, u16 DataLen)  
  997. {  
  998.     u8 retry = 0;  
  999.     u16 len = 0;  
  1000.       
  1001.     A7139_DisableNVIC();        //总中断关闭  
  1002.     if(DataLen > (16*1024-4)) DataLen = (16*1024-4); //限制最大长度为(16KB-4)  
  1003.       
  1004.     if(DataLen <= 60)   
  1005.     {  
  1006.         A7139_SetSendDataLen(64-1);     //设置发送数据长度  
  1007.     }  
  1008.     else  
  1009.     {  
  1010.         len = ((DataLen-60)%48)?((DataLen-60)/48*48+48):((DataLen-60)/48*48);  
  1011.         A7139_SetSendDataLen(64+len-1);     //设置发送数据长度  
  1012.     }  
  1013.     A7139_StrobeCmd(A7139_STBY_CMD);  
  1014.     A7139_DelayMS(1);  
  1015.     A7139_StrobeCmd(A7139_RESTFIFO_CMD);  
  1016.     A7139_DelayMS(1);  
  1017.     A7139_SetGIO_FPF();                 //FPF模式  
  1018.     A7139_SendMode(TRUE);               //发送模式  
  1019.     SendConfig.isSendError = FALSE;     //清除发送错误状态  
  1020.     SendConfig.isSendOK = FALSE;        //清除发送成功状态  
  1021.     SendConfig.pSendData = pData;       //设置发送数据缓冲区  
  1022.     SendConfig.SendLen = DataLen;       //设置发送数据长度  
  1023.     SendConfig.TranLen = A7139_WriteFistPackToFIFO(&SendConfig.pSendData[0], SendConfig.SendLen);   //发送首包数据  
  1024.     A7139_StrobeCmd(A7139_TX_CMD);      //发送命令牌,使A7139进入“发送”状态,其后A7139会将数据打包后自动发送  
  1025. //  //定时器主要用来进行调试,可以计算进入中断的时间,进而查出问题所在  
  1026. //  DeviceClockEnable(DEV_TIM6, ENABLE);    //使能定时器6时钟  
  1027. //  TIM6->CNT = 0;  
  1028. //  TIM6->ARR=60000;                         //设定计数器自动重装值  
  1029. //  TIM6->PSC=SYSTEM_GetClkSpeed()/1000000-1;  //预分频器  
  1030. //  TIM6->SR = 0;        //清除中断标志位                         
  1031. //  TIM6->CR1|=0x01;    //使能定时器6  
  1032. //  IntCnt = 0;  
  1033.       
  1034.     if(SendConfig.TranLen >= SendConfig.SendLen)  
  1035.     {  
  1036.         SendConfig.isSendOK = TRUE;     //发送完成  
  1037.     }  
  1038.     else  
  1039.     {  
  1040.         A7139_ClearRxInt();  
  1041.         A7139_EnableNVIC();             //总中断开启  
  1042.         while(SendConfig.isSendOK != TRUE)  
  1043.         {  
  1044.             A7139_DelayMS(10);  
  1045.             retry ++;  
  1046.             if(retry > 200)   
  1047.             {  
  1048.                 A7139_DisableNVIC();//总中断关闭  
  1049.                 return FALSE;  
  1050.             }  
  1051.         }  
  1052.         A7139_DisableNVIC();//总中断关闭  
  1053.     }  
  1054.       
  1055.   
  1056.     //需要等待最后一包数据发送完毕,一般需要等待至少3ms以上  
  1057.     A7139_DelayMS(1);  
  1058.   
  1059.     return TRUE;  
  1060. }  
  1061.   
  1062.   
  1063.   
  1064.   
  1065. /************************************************************************************************************************* 
  1066. * 函数        :   bool A7139_SetRevListen(u8 *pRevBuff, u16 RevBuffSize) 
  1067. * 功能        :   A7139 进入数据监听状态(FIFO外延模式最大16KB) 
  1068. * 参数        :   pRevBuff:接收数据缓冲区,最大16KB;RevBuffSize:接收数据缓冲区大小 
  1069. * 返回        :   无 
  1070. * 依赖        :   底层宏定义 
  1071. * 作者        :   cp1300@139.com 
  1072. * 时间        :   2015-12-29 
  1073. * 最后修改  :   2015-12-29 
  1074. * 说明        :   用于FIFO外延模式下接收数据 
  1075.                 FIFO外延模式,48B...48B...48B... 
  1076. *************************************************************************************************************************/  
  1077. bool A7139_SetRevListen(u8 *pRevBuff, u16 RevBuffSize)  
  1078. {  
  1079.     A7139_SetGIO_FPF();                 //FPF模式,FPF信号空闲为低电平  
  1080.     A7139_DisableNVIC();                //总中断关闭  
  1081.     A7139_SetSendDataLen(0x3fff);       //设置发送数据长度  
  1082.     A7139_StrobeCmd(A7139_IDLE_CMD);  
  1083.     A7139_DelayMS(1);  
  1084.     A7139_StrobeCmd(A7139_RESRFIFO_CMD);  
  1085.     A7139_DelayMS(1);  
  1086.     A7139_StrobeCmd(A7139_RX_CMD);  
  1087.   
  1088.     RevConfig.pRevData = pRevBuff;      //接收数据缓冲区指针  
  1089.     RevConfig.TranLen = 0;              //已经接收数据长度  
  1090.     RevConfig.RevLen = 0;               //需接收数据长度为0  
  1091.     RevConfig.RevBuffSize = RevBuffSize;//接收缓冲区大小  
  1092.     RevConfig.isRevOK = FALSE;          //接收完成无效  
  1093.     RevConfig.isRevError = FALSE;       //接收失败无效  
  1094.     A7139_SendMode(FALSE);              //接收模式  
  1095.   
  1096.     A7139_ClearRxInt();  
  1097.     A7139_EnableNVIC();                 //总中断开启  
  1098.       
  1099.     uart_printf("接收监控模式!\r\n");  
  1100.     return TRUE;  
  1101. }  
  1102.   
  1103.   
  1104.   
  1105.   
  1106.   
  1107.   
  1108. /************************************************************************************************************************* 
  1109. * 函数        :   int A7139_GetRxLen(void) 
  1110. * 功能        :   获取接收数据长度 
  1111. * 参数        :   无 
  1112. * 返回        :   -1:接收错误,>0接收到的数据长度 
  1113. * 依赖        :   底层宏定义 
  1114. * 作者        :   cp1300@139.com 
  1115. * 时间        :   2016-01-02 
  1116. * 最后修改  :   2016-01-02 
  1117. * 说明        :   A7139 进入接收模式后,使用中断进行接收 
  1118. *************************************************************************************************************************/  
  1119. int A7139_GetRxLen(void)  
  1120. {  
  1121.     if(RevConfig.isRevError == TRUE) return -1;  
  1122.     else if(RevConfig.isRevOK == TRUE) return RevConfig.TranLen;  
  1123.     else return 0;  
  1124.       
  1125. }  
  1126.   
  1127.   
  1128.   
  1129.   
  1130. /************************************************************************************************************************* 
  1131. * 函数        :   void A7139_SetBaseFreq(float RfFreq) 
  1132. * 功能        :   A7139 配置RF基础频率 
  1133. * 参数        :   rfFreq:RF频率,单位MHz 
  1134. * 返回        :   无 
  1135. * 依赖        :   底层宏定义 
  1136. * 作者        :   cp1300@139.com 
  1137. * 时间        :   2015-07-19 
  1138. * 最后修改  :   2015-07-19 
  1139. * 说明        :   初始化配置 
  1140. *************************************************************************************************************************/  
  1141. void A7139_SetBaseFreq(float RfFreq)  
  1142. {  
  1143.      float  divFreq = RfFreq / 12.800f;    
  1144.      u8  intFreq = (u8)(divFreq); //integer part  
  1145.      float  fltFreq = divFreq - intFreq * 1.000f; //fraction part  
  1146.      u16 fpFreg = (u16)(fltFreq * 65536);  //FP register val  
  1147.      u16 orgVal;  
  1148.       
  1149.      A7139_StrobeCmd(A7139_STBY_CMD); //enter stand-by mode  
  1150.              //AFC[15:15] = 0  
  1151.      orgVal = A7139Config[A7139_PLL3] & 0x7FFF;  
  1152.      A7139_WriteReg(A7139_PLL3,orgVal);  
  1153.             //RFC[15:12] = 0000  
  1154.      orgVal = A7139Config[A7139_PLL6] & 0x0FFF;  
  1155.      A7139_WriteReg(A7139_PLL6,orgVal);  
  1156.         //MD1[12:12]=0,1  
  1157.      if(RfFreq < 860)    //433-510  
  1158.         orgVal = A7139Config[A7139_PLL4] & 0xEFFF;  
  1159.      else    //868-915  
  1160.         orgVal = A7139Config[A7139_PLL4] | 0x1000;  
  1161.      A7139_WriteReg(A7139_PLL4,orgVal);  
  1162.             //IP[8:0] = intg  
  1163.      orgVal = A7139Config[A7139_PLL1] & 0xFF00;  
  1164.      A7139_WriteReg(A7139_PLL1,orgVal|intFreq);  
  1165.             //FP[15:0] =  fpFreg  
  1166.      A7139_WriteReg(A7139_PLL2,fpFreg);   
  1167.     //FPA[15:0] = 0x0000,  
  1168.      A7139_WritePageB(A7139_REG9_IF2,0x0000);   //偏移为0  
  1169. }  
  1170.   
  1171.   
  1172.   
  1173. /************************************************************************************************************************* 
  1174. * 函数        :   bool A7139_Cali(void) 
  1175. * 功能        :   A7139 校准 
  1176. * 参数        :   无 
  1177. * 返回        :   TRUE:校准成功;FALSE:校准失败 
  1178. * 依赖        :   底层宏定义 
  1179. * 作者        :   cp1300@139.com 
  1180. * 时间        :   2015-07-19 
  1181. * 最后修改  :   2015-01-02 
  1182. * 说明        :   A7139 频率校准 
  1183. *************************************************************************************************************************/  
  1184. bool A7139_Cali(void)  
  1185. {  
  1186.     u16  fbcf;  //IF Filter  
  1187.     u16  vbcf;  //VCO Current  
  1188.     u16  vccf;  //VCO Band  
  1189.     u16 tmp;  
  1190.       
  1191.     //IF calibration procedure @STB state  
  1192.     A7139_WriteReg(A7139_MODE, A7139Config[A7139_MODE] | 0x0802);           //IF Filter & VCO Current Calibration  
  1193.      do{  
  1194.         tmp = A7139_ReadReg(A7139_MODE);  
  1195.      }while(tmp & 0x0802);  
  1196.     //for check(IF Filter)  
  1197.      tmp = A7139_ReadReg(A7139_CALIB);  
  1198.      //fb = tmp & 0x0F;  
  1199.      //fcd = (tmp>>11) & 0x1F;  
  1200.      fbcf = (tmp>>4) & 0x01;  
  1201.      if(fbcf)  
  1202.      {  
  1203.          //FBCF:IF 滤波器自动校准标志(只读)  
  1204.         return FALSE;  
  1205.      }  
  1206.     //for check(VCO Current)  
  1207.      tmp = A7139_ReadPageA(A7139_REG8_VCO);  
  1208.     //vcb = tmp & 0x0F;  
  1209.     vccf = (tmp>>4) & 0x01;  
  1210.     if(vccf)  
  1211.     {  
  1212.         return FALSE;  
  1213.      }  
  1214.     //RSSI Calibration procedure @STB state  
  1215.     A7139_WriteReg(A7139_ADC, 0x4C00);                                  //set ADC average=64  
  1216.      A7139_WritePageA(A7139_REG8_WOR2, 0xF800);                             //set RSSC_D=40us and RS_DLY=80us  
  1217.     A7139_WritePageA(A7139_REG8_TX1, A7139Config_PageA[A7139_REG8_TX1] | 0xE000);   //set RC_DLY=1.5ms  
  1218.      A7139_WriteReg(A7139_MODE, A7139Config[A7139_MODE] | 0x1000);          //RSSI Calibration  
  1219.      do{  
  1220.         tmp = A7139_ReadReg(A7139_MODE);  
  1221.      }while(tmp & 0x1000);  
  1222.     A7139_WriteReg(A7139_ADC, A7139Config[A7139_ADC]);  
  1223.      A7139_WritePageA(A7139_REG8_WOR2, A7139Config_PageA[A7139_REG8_WOR2]);  
  1224.     A7139_WritePageA(A7139_REG8_TX1, A7139Config_PageA[A7139_REG8_TX1]);  
  1225.     //VCO calibration procedure @STB state  
  1226.     A7139_WriteReg(A7139_MODE, A7139Config[A7139_MODE] | 0x0004);       //VCO Band Calibration  
  1227.     do{  
  1228.         tmp = A7139_ReadReg(A7139_MODE);  
  1229.     }while(tmp & 0x0004);  
  1230.         //for check(VCO Band)  
  1231.     tmp = A7139_ReadReg(A7139_CALIB);  
  1232.     //vb = (tmp >>5) & 0x07;  
  1233.     vbcf = (tmp >>8) & 0x01;  
  1234.     if(vbcf)  
  1235.     {  
  1236.         return FALSE;  
  1237.     }  
  1238.       
  1239.     return TRUE;  
  1240. }  
  1241.   
  1242.   
  1243.   
  1244.   
  1245.   
  1246. //PB1接收中断程序  
  1247. //警告:如果缓冲区大小设置错误将产生意想不到的混乱,造成溢出后程序将不受控  
  1248. //接收完毕后一定要退出接收模式,否则会一直受到FPF信号,原因是在不知道数据包大小的情况下将数据包设置为无限大小  
  1249. void EXTI1_IRQHandler(void)  
  1250. {  
  1251.     A7139_DisableNVIC();    //关闭总中断  
  1252.     A7139_ClearRxInt();     //清除中断  
  1253.     LED1_ON();  
  1254.       
  1255.     //uart_printf("%d时间:%duS\r\n",IntCnt,TIM6->CNT);  
  1256.       
  1257.     if(isSendMode == TRUE)  //发送模式  
  1258.     {  
  1259.         if(SendConfig.TranLen < SendConfig.SendLen)  //没发送完才发送  
  1260.         {  
  1261.             SendConfig.TranLen += A7139_WritePackToFIFO(&SendConfig.pSendData[SendConfig.TranLen], SendConfig.SendLen-SendConfig.TranLen);      //发送剩下数据包  
  1262.             if(SendConfig.TranLen >= SendConfig.SendLen)  
  1263.             {  
  1264.                 LED1_OFF();  
  1265.                 SendConfig.isSendOK = TRUE;     //发送完成  
  1266.                 A7139_DisableNVIC();            //总中断关闭  
  1267.                 A7139_ClearRxInt();             //清除中断  
  1268.                 return;  
  1269.             }  
  1270.         }  
  1271.         else    //正常情况下不会执行到此  
  1272.         {  
  1273.             LED1_OFF();  
  1274.             //uart_printf("发送有错误\r\n");  
  1275.             SendConfig.isSendError = TRUE;      //发送完成  
  1276.             A7139_DisableNVIC();                //总中断关闭  
  1277.             A7139_ClearRxInt();                 //清除中断  
  1278.             return;  
  1279.         }  
  1280.           
  1281.     }  
  1282.     else  
  1283.     {  
  1284.         if(RevConfig.RevLen == 0)       //还没获取到需要接收数据长度  
  1285.         {  
  1286.             RevConfig.TranLen = A7139_ReadFistPackToFIFO(&RevConfig.pRevData[0], &RevConfig.RevLen, RevConfig.RevBuffSize);  
  1287.             if(RevConfig.RevLen == 0)   //接收数据长度为0,无效,退出接收  
  1288.             {  
  1289.                 LED1_OFF();  
  1290.                 A7139_StrobeCmd(A7139_IDLE_CMD);  
  1291.                 RevConfig.isRevError = TRUE;    //接收有误,结束接收  
  1292.                 A7139_DisableNVIC();                //总中断关闭  
  1293.                 A7139_ClearRxInt();                 //清除中断  
  1294.                 return;  
  1295.   
  1296.             }  
  1297.         }  
  1298.         else  
  1299.         {  
  1300.             RevConfig.TranLen += A7139_ReadPackToFIFO(&RevConfig.pRevData[RevConfig.TranLen], RevConfig.RevLen-RevConfig.TranLen, RevConfig.RevBuffSize-RevConfig.TranLen);  
  1301.         }  
  1302.           
  1303.         if(RevConfig.TranLen >= RevConfig.RevBuffSize)   //缓冲区满了  
  1304.         {  
  1305.             LED1_OFF();  
  1306.             A7139_StrobeCmd(A7139_IDLE_CMD);  
  1307.             RevConfig.isRevOK = TRUE;       //接收完成了,结束接收  
  1308.             A7139_DisableNVIC();            //总中断关闭  
  1309.             A7139_ClearRxInt();             //清除中断  
  1310.             return;  
  1311.         }  
  1312.         else if((RevConfig.TranLen >= RevConfig.RevLen)&&(RevConfig.RevLen!=0))  //接收完成了  
  1313.         {  
  1314.             LED1_OFF();  
  1315.             A7139_StrobeCmd(A7139_IDLE_CMD);  
  1316.             RevConfig.isRevOK = TRUE;       //接收完成了,结束接收  
  1317.             A7139_DisableNVIC();                //总中断关闭  
  1318.             A7139_ClearRxInt();                 //清除中断  
  1319.             return;  
  1320.         }  
  1321.           
  1322.     }  
  1323.   
  1324.     LED1_OFF();  
  1325.     A7139_ClearRxInt();     //清除中断  
  1326.     A7139_EnableNVIC();     //总中断开启  
  1327. }  

头文件

[cpp]  view plain  copy
  1. /************************************************************************************************************* 
  2.  * 文件名:     A7139.h 
  3.  * 功能:      STM32 A7139驱动 
  4.  * 作者:      cp1300@139.com 
  5.  * 创建时间:    2015-07-19 
  6.  * 最后修改时间:2015-07-19 
  7.  * 详细:      A7139驱动 
  8. *************************************************************************************************************/        
  9. #ifndef __A7139_H__  
  10. #define __A7139_H__  
  11. #include "system.h"  
  12.   
  13.   
  14. #if(BOARD_SUPPORT)  //需要板级支持  
  15.   
  16. #include "board.h"   
  17.   
  18. #else               //默认支持  
  19.   
  20. //三线spi  
  21. #define A7139_DIO_OUT       PBout(10)  
  22. #define A7139_DIO_IN()      PBin(10)  
  23. #define A7139_CS            PBout(0)  
  24. #define A7139_CLK           PBout(11)  
  25. #define A7139_OutMode()     GPIOx_OneInit(GPIOB,10,OUT_PP,SPEED_50M)  
  26. #define A7139_InMode()      GPIOx_OneInit(GPIOB,10,IN_IPU,IN_IN)  
  27. #define A7139_GIO1          PBin(1)   
  28.   
  29.   
  30. #define A7139_IO_INIT() \  
  31.     DeviceClockEnable(DEV_GPIOB,ENABLE);/*使能GPIOA时钟*/\  
  32.     GPIOx_Init(GPIOB,BIT0|BIT10|BIT11, OUT_PP, SPEED_50M);\  
  33.     GPIOx_Init(GPIOB,BIT1, IN_IPT, IN_IN);\  
  34.       
  35. #define A7139_IO_POWER_DOWN()   \  
  36.     DeviceClockEnable(DEV_GPIOB,ENABLE);/*使能GPIOA时钟*/\  
  37.     GPIOx_Init(GPIOB,BIT0|BIT10|BIT11,  IN_IPT, IN_IN);\  
  38.   
  39.       
  40.   
  41.   
  42. //接口  
  43. //DIO  
  44. #define A7139_DIO_H()           (A7139_DIO_OUT=1)   //输出1  
  45. #define A7139_DIO_L()           (A7139_DIO_OUT=0)   //输出0  
  46. #define A7139_CS_H()            (A7139_CS=1)  
  47. #define A7139_CS_L()            (A7139_CS=0)  
  48. #define A7139_CLK_H()           (A7139_CLK=1)  
  49. #define A7139_CLK_L()           (A7139_CLK=0)  
  50. #define A7139_GIO1_IN()         (A7139_GIO1)  
  51. //中断  
  52. #define A7139_EnableNVIC()      NVIC_IntEnable(IRQ_EXTI1,ENABLE)            //总中断开启  
  53. #define A7139_DisableNVIC()     NVIC_IntEnable(IRQ_EXTI1,DISABLE)           //总中断关闭  
  54. #define A7139_EnableInt()       EXTI_IntConfig(GPIO_B,1,PosEdge)            //上升沿触发中断  
  55. #define A7139_DisableInt()      EXTI_IntConfig(GPIO_B,1,OFF_INT)            //关闭接收中断  
  56.   
  57. //清除接收中断  
  58. #define A7139_ClearRxInt()      EXTI_ClearInt(1)                        //清除中断  
  59.   
  60. #endif  
  61.   
  62. //控制寄存器  
  63. typedef enum   
  64. {  
  65.     A7139_SCLOCK    =   0x00,       //系统时钟寄存器  
  66.     A7139_PLL1      =   0x01,       //PLL1  
  67.     A7139_PLL2      =   0x02,       //PLL2  
  68.     A7139_PLL3      =   0x03,       //PLL3  
  69.     A7139_PLL4      =   0x04,       //PLL4  
  70.     A7139_PLL5      =   0x05,       //PLL5  
  71.     A7139_PLL6      =   0x06,       //PLL6  
  72.     A7139_CRYSTAL   =   0x07,       //晶振设置  
  73.     A7139_PREG8S    =   0x08,       //寄存器组,由CRYSTAL控制切换  
  74.     A7139_PREG9S    =   0x09,       //寄存器组,由CRYSTAL控制切换  
  75.     A7139_RX1       =   0x0A,       //接收设置1  
  76.     A7139_RX2       =   0x0B,       //接收设置2  
  77.     A7139_ADC       =   0x0C,       //ADC  
  78.     A7139_PIN       =   0x0D,       //PIN  
  79.     A7139_CALIB     =   0x0E,       //Calibration  
  80.     A7139_MODE      =   0x0F,       //模式控制  
  81. }A7139_CREG;  
  82.   
  83. //控制寄存器组A  
  84. typedef enum  
  85. {  
  86.     //寄存器8  
  87.     A7139_REG8_TX1      =   0,          //addr8 page0,   
  88.     A7139_REG8_WOR1     =   1,          //addr8 page1,   
  89.     A7139_REG8_WOR2     =   2,          //addr8 page2,   
  90.     A7139_REG8_RF       =   3,          //addr8 page3,   
  91.     A7139_REG8_POWER    =   4,          //addr8 page4,   
  92.     A7139_REG8_AGCRC    =   5,          //addr8 page5,   
  93.     A7139_REG8_AGCCON1  =   6,          //addr8 page6,   
  94.     A7139_REG8_AGCCON2  =   7,          //addr8 page7,   
  95.     A7139_REG8_GPIO     =   8,          //addr8 page8,   
  96.     A7139_REG8_CKO      =   9,          //addr8 page9,   
  97.     A7139_REG8_VCO      =   10,         //addr8 page10,  
  98.     A7139_REG8_CHG1     =   11,         //addr8 page11,  
  99.     A7139_REG8_CHG2     =   12,         //addr8 page12,  
  100.     A7139_REG8_FIFO     =   13,         //addr8 page13,  
  101.     A7139_REG8_CODE     =   14,         //addr8 page14,  
  102.     A7139_REG8_WCAL     =   15,         //addr8 page15,  
  103. }A7139_PAGE_A;  
  104.   
  105.   
  106. //控制寄存器组B  
  107. typedef enum  
  108. {  
  109.     //寄存器9  
  110.     A7139_REG9_TX2      =   0,      //addr9 page0,   
  111.     A7139_REG9_IF1      =   1,      //addr9 page1,  
  112.     A7139_REG9_IF2      =   2,      //addr9 page2,  
  113.     A7139_REG9_ACK      =   3,      //addr9 page3,  
  114.     A7139_REG9_ART      =   4,      //addr9 page4,  
  115. }A7139_PAGE_B;  
  116.   
  117.   
  118. //Strobe命令  
  119. typedef enum  
  120. {  
  121.     A7139_WCR_CMD       =   0x00,   //写控制寄存器  
  122.     A7139_RCR_CMD       =   0x80,   //读控制寄存器  
  123.     A7139_WID_CMD       =   0x20,   //写ID  
  124.     A7139_RID_CMD       =   0xA0,   //读ID  
  125.     A7139_WFIFO_CMD     =   0x40,   //写FIFO  
  126.     A7139_RFIFO_CMD     =   0xC0,   //读FIFO   
  127.     A7139_RESRF_CMD     =   0x70,   //复位RF  
  128.     A7139_RESTFIFO_CMD  =   0x60,   //复位发送FIFO  
  129.     A7139_RESRFIFO_CMD  =   0xE0,   //复位接收FIFO  
  130.     A7139_SLEEP_CMD     =   0x10,   //SLEEP模式  
  131.     A7139_IDLE_CMD      =   0x12,   //IDLE模式  
  132.     A7139_STBY_CMD      =   0x14,   //Standby模式  
  133.     A7139_PLL_CMD       =   0x16,   //PLL模式  
  134.     A7139_RX_CMD        =   0x18,   //RX模式  
  135.     A7139_TX_CMD        =   0x1A,   //TX模式  
  136.     A7139_TSLEEP_CMD    =   0x1C,   //Deep sleep 模式 三态  
  137.     A7139_PSLEEP_CMD    =   0x1F,   //Deep sleep 模式 上拉  
  138. }A7139_STROBE_CMD;  
  139.   
  140.   
  141.   
  142.   
  143. //宏定义接口  
  144. #ifdef _UCOS_II_  
  145. #include "ucos_ii.h"  
  146. #define A7139_DelayMS(x)        OSTimeDlyHMSM(0,0,0,x)  //ms延时,最大999ms  
  147. #else  
  148. #include "delay.h"  
  149. #define A7139_DelayMS(x)        Delay_MS(x)  
  150. #endif  
  151.   
  152.   
  153. //相关函数  
  154. void A7139_SoftReset(void);                             //A7139软复位  
  155. bool A7139_Init(u8 Channel, u16 RfID, u8 PowerSupply, u8 Rate);                 //A7139 初始化  
  156. void A7139_WriteReg(A7139_CREG RegAddr, u16 data);  //写入控制寄存器  
  157. u16 A7139_ReadReg(A7139_CREG RegAddr);  //读取控制寄存器  
  158. u32 A7139_ReadID(void);                 //读取A7139 ID  
  159. void A7139_WriteID(u32 ID);             //设置A7139 ID  
  160. u16 A7139_ReadPageA(A7139_PAGE_A RegAddr);  //读取控制寄存器组寄存器A  
  161. void A7139_WritePageA(A7139_PAGE_A RegAddr, u16 data);//写入控制寄存器组寄存器A  
  162. u16 A7139_ReadPageB(A7139_PAGE_B RegAddr);  //读取控制寄存器组寄存器B  
  163. void A7139_WritePageB(A7139_PAGE_B RegAddr, u16 data);//写入控制寄存器组寄存器B  
  164. void A7139_RestRxFIFO(void);        //A7139复位接收FIFO指针  
  165. void A7139_RestTxFIFO(void);        //A7139复位发送FIFO指针  
  166. void A7139_ReadFIFO(u8 *pData, u8 DataLen);     //A7139读取FIFO  
  167. void A7139_WriteFIFO(u8 *pData, u8 DataLen);    //A7139写FIFO  
  168. void A7139_StrobeCmd(A7139_STROBE_CMD StrobeCmd);   //A7139发送Strobe命令  
  169. void A7139_Config(void);        //配置A7139  
  170. void A7139_SetFreq(float RfFreq);   //A7139 配置RF频率  
  171. bool A7139_WaitRxData(u8 pData[64], u16 TimeOut);   //等待接收数据  
  172. int A7139_GetRxLen(void);  
  173. bool A7139_SetRev(u8 *pRevBuff, u16 RevBuffSize);  
  174. bool A7139_SendData(u8 *pData, u16 DataLen);        //A7139发送数据  
  175. void A7139_SetTxPowerSupply(u8 PowerSupply);    //发射功率设置  
  176.   
  177.   
  178. #define A7139_ReadDeverID()     (A7139_ReadPageB(A7139_REG9_TX2))   //读取设备硬件ID,只读  
  179. #define A7139_RestRxFIFO()      A7139_StrobeCmd(A7139_RESRFIFO_CMD) //A7139复位接收FIFO指针  
  180. #define A7139_RestTxFIFO()      A7139_StrobeCmd(A7139_RESTFIFO_CMD) //A7139复位发送FIFO指针  
  181. #define A7139_SoftReset()       A7139_StrobeCmd(A7139_RESRF_CMD)    //A7139软复位  
  182.   
  183.   
  184.   
  185.   
  186. #endif //A7139  

//发送方测试

[cpp]  view plain  copy
  1. /任务1:  
  2. //系统任务  
  3. u8 TempBuff[2048];  
  4. void TaskSystem(void *pdata)  
  5. {  
  6.     u16 crc16;  
  7.     u16 i;  
  8.       
  9.     //初始化相关线程  
  10.     //uart_printf("新建线程:TaskLED(%d)\r\n",OSTaskCreate(TaskLED, (void *)0,&TASK_LED_STK[LED_STK_SIZE-1], LED_TASK_Prio));//通信  
  11.     //uart_printf("新建线程:TaskPAIR(%d)\r\n",OSTaskCreate(TaskPAIR, (void *)0,&TASK_PAIR_STK[PAIR_STK_SIZE-1], PAIR_TASK_Prio));//配对  
  12.     OSTimeDlyHMSM(0,0,0,10);      
  13.   
  14.     for(i = 0;i < 2048;i ++)  
  15.     {  
  16.         TempBuff[i] = i&0xff;  
  17.     }  
  18.     i = 320;  
  19.     //初始化A7139  
  20.     if(A7139_Init(101, 0x0123, 0, 80) == TRUE)  
  21.     {  
  22.         while(1)  
  23.         {  
  24.             LED2_ON();  
  25.             crc16 = CRC16(TempBuff, i);  
  26.             uart_printf("发送数据%dB,最后1B:0x%02X 校验:0x%04X\r\n",i, TempBuff[i-1], crc16);  
  27.             if(A7139_SendData(TempBuff,i) == TRUE)  
  28.             {  
  29.                 uart_printf("发送成功\r\n");  
  30.             }  
  31.             else  
  32.             {  
  33.                 uart_printf("发送超时\r\n");  
  34.             }  
  35.             LED2_OFF();  
  36.             OSTimeDlyHMSM(0,0,2,0);  
  37.             IWDG_Feed();  
  38.         }  
  39.     }  
  40.     else    //初始化失败  
  41.     {  
  42.         LED2_ON();  
  43.         uart_printf("通信初始化失!\r\n");  
  44.         OSTimeDlyHMSM(0,0,1,500);  
  45.         LED2_OFF();  
  46.     }  
  47.     while(1)  
  48.     {  
  49.         LED2_OFF();  
  50.         OSTimeDlyHMSM(0,0,0,100);  
  51.         IWDG_Feed();  
  52.     }  
  53. }  

接收方测试

[cpp]  view plain  copy
  1. //初始化A7139  
  2.     if(A7139_Init(101, 0x0123, 0, 80) == TRUE)  
  3.     {  
  4.         for(i = 0;i < 10;i ++)  
  5.         {  
  6.             LED_FLASH();  
  7.             OSTimeDlyHMSM(0,0,0,10);  
  8.         }  
  9.         LED_OFF();  
  10.           
  11.         if(A7139_SetRevListen(A433Buff, 6000) == FALSE) //重新初始化  
  12.         {  
  13.             uart_printf("接收初始化失败\r\n");  
  14.         }  
  15.         i = 0;  
  16.         while(1)  
  17.         {  
  18.             len = A7139_GetRxLen();  
  19.             if(len < 0)  //接收错误  
  20.             {  
  21.                 uart_printf("接收错误\r\n");  
  22.                 if(A7139_SetRevListen(A433Buff, 6000) == FALSE) //重新初始化  
  23.                 {  
  24.                     uart_printf("接收初始化失败\r\n");  
  25.                 }  
  26.                 i= 0;  
  27.             }  
  28.             else if(len)  
  29.             {  
  30.                 //LED_ON();  
  31.                 crc16 = CRC16(A433Buff, len);  
  32.                 uart_printf("接收数据%dB,校验:0x%04X\r\n",len,  crc16);  
  33.                 for(i = 0;i < len;i ++)  
  34.                 {  
  35.                     uart_printf("%02X ", A433Buff[i]);  
  36.                 }  
  37.                 uart_printf("\r\n");  
  38.                 //uart_printf("接收成:%dB\r\n", len);  
  39.                 OSTimeDlyHMSM(0,0,0,100);  
  40.                 //LED_OFF();  
  41.                 if(A7139_SetRevListen(A433Buff, 6000) == FALSE) //重新初始化  
  42.                 {  
  43.                     uart_printf("接收初始化失败\r\n");  
  44.                 }  
  45.                 i = 0;  
  46.             }  
  47.             else   
  48.             {  
  49.                 i ++;  
  50.                 if(i >  50)  
  51.                 {  
  52.                      i = 0;  
  53.                     uart_printf("接收超时\r\n");  
  54.                     if(A7139_SetRevListen(A433Buff, 6000) == FALSE) //重新初始化  
  55.                     {  
  56.                         uart_printf("接收初始化失败\r\n");  
  57.                     }  
  58.                 }  
  59.             }  
  60.             OSTimeDlyHMSM(0,0,0,100);  
  61.             IWDG_Feed();                                //喂狗  
  62.         }  
  63.           
  64.     }  
  65.     else    //初始化失败  
  66.     {  
  67.         LED_FLASH();  
  68.         OSTimeDlyHMSM(0,0,0,100);  
  69.     }  

发送调试信息


接收方调试信息



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值