Parcourir la source

修复近距离通讯丢包问题,修改config配置表(4Mbps)

dropLin il y a 7 mois
Parent
commit
05a904d16e
8 fichiers modifiés avec 76 ajouts et 204 suppressions
  1. 5 173
      README.md
  2. 47 0
      project/system_stm32f10x.c
  3. 3 0
      project/system_stm32f10x.h
  4. 12 12
      radio/A5133Config.h
  5. 1 0
      radio/A5133_hal.c
  6. 1 9
      radio/myRadio.c
  7. 5 9
      radio/myRadio_gpio.c
  8. 2 1
      radio/myRadio_gpio.h

+ 5 - 173
README.md

@@ -1,174 +1,6 @@
-## 一、项目名称
-adapterBoardDriver
-## 二、产品类型
-演示板
-## 三、应用场景
-无线数据收发、测试通讯距离
-## 四、传感器及驱动接口
-无
-## 五、按键
-6个
-1. `S1`按键可以移动光标(选择的项会反显)向上选择设置项,或向上设置数值,可以循环移动选择
-1. `S2`按键可以返回上一个界面
-1. `S3`按键可以移动光标(选择的项会反显)向下选择设置项,或向上设置数值,可以循环移动选择
-1. `S4`按键功能待定
-1. `S5`按键,功能1:开机界面时,按下进入功能选择界面。功能2:确定选择项目。功能3:退出设置状态
-## 六、LED指示灯
-2个
-1. `D5`蓝色LED,发送成功指示灯灯
-2. `D4`红色LED,接收成功指示灯灯
-## 七、显示器类型及驱动接口 
-深圳市晶联讯电子的液晶模块`JLX19296G-382-PN`
-该液晶模块支持4线SPI串行接口和IIC接口,本项目使用IIC接口驱动,显示大小192*96 点阵
-## 八、功耗要求
-无
-## 九、供电方式
-支持三种供电
-1. USB的MICRO-B插头供电
-1. 3*5号电池供电
-1. 2pin的PH座子供电,注意电压不能超过5V
-## 十一、尺寸
-87mm*131.5mm
-## 十二、射频频段
-433MHz、490MHz、868MHz、915MHz
-## 十三、射频芯片方案
-`A7169`
-## 十四、主控芯片方案
-`AT32F413RCT7`该MCU与`STM32F103RCT6`软硬件兼容
-## 十五、认证要求
-无
-## 十六、外部连接接口
-1. `P7`串口转USB
-1. `J1``J2`MCU的GPIO口
-1. `P1`microBIT插槽,用于无线模块转接板连接
-1. `P7`MICRO-B类型USB座子,供电
-1. `P6`外部供电
-1. `P5`仿真烧录接口
-## 十七、编译器
-`MDK-ARM Standard  Version: 5.14.0.0`
-## 十八、编程语言
-C99标准
-## 十九、SDK版本
-`STM32F10x_StdPeriph_Lib_V3.5.0`
-## 二十、功能描述
-<div >
-<img src="image/mainUi.png"  height="150" width="200">
-<img src="image/select_tx.png"  height="150" width="200">
-<img src="image/packettx.png"  height="150" width="200">
-<img src="image/packetrx.png"  height="150" width="200">
-<img src="image/continuous.png"  height="150" width="200">
-</div>
 
-### 数据包收发测试
-#### 发送测试
-`主界面`<img src="image/mainUi.png"  height="60" width="85">-->按键`S5`-->功能选择`Enter RF Transmiter`<img src="image/select_tx.png"  height="60" width="85">-->按键`S5`-->进入`Packet Tx`<img src="image/packetTx.png"  height="60" width="85">-->按键`S5`-->开始发送,同时`START`会闪烁显示
-发送完成后,6S内收到ACK,会立即触发重新发送,同时会重新设置重发超时时间(从开始发送到接收到ACK的时间),超时后自动重发,超时重发10次后,重发超时时间自动切换回6S。
-发送成功`D5`蓝色LED灯闪烁一下。
-
-如图<img src="image/packetTx.png"  height="160" width="195">
-1. `413ms`为从开始发送到无线收到对方回复的应答所消耗的时间,若该处显示`OUT`,则表示接收等待ACK超时。
-2. `100%`为统计的丢包率,重新按下按键`S5`重新计数
-3. `hello world?`为无线收到的数据包,其中的`?`位置的字符每次都会不一样
-4. `-004dBm`为最新一次无线收到的数据包的信号强度
-#### 接收测试
-`主界面`<img src="image/mainUi.png"  height="60" width="85">-->按键`S5`-->功能选择`Enter RF Receiver`<img src="image/select_rx.png"  height="60" width="85">-->按键`S5`-->进入`Packet Rx`<img src="image/packetRx.png"  height="60" width="85">-->按键`S5`-->开始接收,同时`START`会闪烁显示
-收到数据后`D4`红色LED灯闪烁一下
-
-如图<img src="image/packetRx.png"  height="160" width="195">
-1. `11.67mA`为当前无线模组的工作电流
-1. `-13dBm`为最新一次无线收到的数据包的信号强度
-1. `hello world2`、`hello world3`、`hello world4`为无线收到的3个数据包,收到新的数据包时显示会向上滚动
-
-### 功能参数设置
-<div align="center">
-<img src="image/setting.png"  height="150" width="200">
-</div>
-
-`主界面`<img src="image/mainUi.png"  height="60" width="85">-->按键`S5`-->功能选择`Enter RF Setting`<img src="image/select_set.png"  height="60" width="85">-->按键`S5`-->进入`Setting`<img src="image/setting.png"  height="60" width="85">,按下`S1`或者`S3`切换设置项目,确定需要设置的项目后,按下`S5`进行参数设置,该项的光标会闪烁显示,此时可通过按键`S1`或者`S3`上下调节参数。再按下`S5`退出设置,即可选择其他选项设置。
-1. `Type`,设置选择对应的模组型号,当前demo板的固件可能会兼容多个型号的模组,比如以下型号的模组可以共用一套驱动固件
-   1. VG4139S433N0S1
-   2. VG4139S490N0S1
-   3. VG4139S868N0S1
-   4. VG4139S915N0S1
-   5. VG4142S170N0S1
-   6. VG4142S433N0S1
-   7. VG4142S490N0S1
-   8. VG4142S868N0S1
-   9. VG4142S915N0S1
-2. `Chnl`,设置当前模组的无线信道,信道对应的无线率会根据`Type`类型和`Step`信道间隔的设置而改变
-3. `Step`,信道间隔,即每个信道之间的频率带宽,该设置需根据实际情况而定,不宜太小,过小的间隔可能会造成不同信道的设备串频造成干扰。
-4. `TxPower`,无线发射功率。发射功率越大,功耗越高,相应的通讯距离也会越远
-5. `RfBr`,无线波特率。无线波特率的大小即传输速率的大小,无线波特率越大,传输消耗时间越小,相应的传输距离越短,反之则越远。最终的通讯距离,在排除外在因素的情况下,可以从无线发射功率和无线波特率这两个参数评估
-## 二十一、备注说明
-### 射频驱动移植
-1. 需要将文件夹`radio`中的API全部移植,与硬件相关的已全部定义在`radio/myRadio_gpio.c`中,若目标平台也是C语言环境,将文件夹`radio`中的文件拷贝过来后,只需对应的修改`radio/myRadio_gpio.c`文件中的GPIO定义既可,由于`myRadio_gpio.c`中用到的GPIO是宏定义在`project/board.h`,所以也需要将`radio/board.h`中的定义移植过来。如果MCU平台也是相近的,只需修改`project/board.h`中对应的宏定义即可。
-2. 本公司为了统一demo程序,将射频相关的操作重新定义了一层,详见`radio/myRadio.c`,无线应用开发,可以参考借鉴。
-### 射频芯片驱动IO口说明
-驱动IO口均定义在`project/board.h`中
- 1. BOARD_GPIO_SPI_CLK
- 2. BOARD_GPIO_SPI_MISO
- 3. BOARD_GPIO_SPI_MOSI
- 4. BOARD_GPIO_SPI_CSN
- 5. BOARD_GPIO_SPI_GPIOA -> 直连射频芯片的`RST`引脚,上电初始化需要用到
- 6. BOARD_GPIO_SPI_GPIOB -> 直连射频芯片的`IO1`引脚,用于接收芯片操作的中断响应输出指示,本工程该引脚用于做发送接收中断响应指示,用户可以配置中断映射功能
- 7. BOARD_GPIO_SPI_GPIOC -> 直连射频芯片的`IO3`引脚,用于接收芯片操作的中断响应输出指示,本工程该引脚未使用,用户可以配置中断映射功能
- 8. BOARD_GPIO_SPI_GPIOD -> 直连射频芯片的`busy`引脚,用于检测射频芯片工作状态是否忙状态,
- 9. 其他IO口未使用,可根据实际情况移植
-### 无线应用开发注意事项
-#### 无线频率
-1. 避免使用中心频率为射频芯片使用的晶体频率整数倍的,比如晶体频率为32MHz,就需要避免使用`448MHz`的中心频点
-#### 驱动调试
-1. 首先保证SPI通讯正常,具体SPI时序需根据射频芯片要求设置,可通过示波器或者逻辑分析仪进行硬件分析
-2. SPI通讯正常后,进一步调试查看寄存器操作,读写寄存器,若能正常操作,基本可判定移植成功了
-#### 通讯距离
-影响无线传输距离的因素
-1. 无线电频谱,包括使用的无线频段和无线波特率
-2. 发射功率
-3. 天线增益,不同增益的天线对无线信号的接收效果影响很大
-4. 路径损耗,主要是包括无线使用的周围环境,比如楼宇、树木山峰遮挡
-5. 其他的无线信号干扰
-## 二十二、软件开发
-### template Version
-    V04
-### A7169寄存器解释
-规格书的章节`9.1 Control Register Table`的寄存器分为3部分,
-1. 基础寄存器,地址:0x00~0x0f,`Systemclock`--
-2. PAGEA寄存器,地址:0x00~0x0f
-3. PAGEB寄存器,地址:0x00~0x34
-### A739电流功耗
-1.  `SLEEP`:1.5uA
-2.  `DEEP SLEEP`:0.5uA
-3.  `Stand`:0.45mA
-4.  `RX`:3.8mA
-5.  `TX`:xmA
-### SPI
-RF芯片在下降沿的时候改变数据状态
-MCU可以在上升沿后读取spi数据
-
-RF在上升沿的时候读取SDIO的状态
-
-### 工程文件架构
-```c
-..\adapterBoardDriver_xxxxxxxxxxxxxxx_Vxx
-├──app \\常用应用模块封装
-|  └──
-├──core    \\MCU内核文件
-|  └──
-├──STM32F10x_FWLib \\MCU官方库函数
-   └──
-├──image   \\md文件显示用的图片
-|  └──
-├──keil_v5 \\keil编译器工程文件,包含编译生成的HEX文件
-|  └──Object  \\编译生成的HEX文件在此文件夹
-├──peripheral  \\项目用到的MCU外设
-|  └──
-├──project \\项目的主函数和GPIO定义包含文件
-|  └──
-├──radio   \\射频底层驱动文件
-|  ├──myRadio_gpio.c  \\射频驱动接口硬件初始化
-|  └──myRadio.c   \\为无线应用通用封装API
-```
 ### 无线应用通用封装API-radio/myRadio.c
+
 1. **初始化**-`void myRadio_init(int agr0, void *agr1_ptr)`
  	射频芯片驱动IO口初始化-`myRadio_gpio_init()`
  	射频基本参数初始化
@@ -190,11 +22,11 @@ RF在上升沿的时候读取SDIO的状态
 13. **射频中断回调函数**`void myRadio_gpioCallback(uint8_t index)`
     外部中断检测定义在`myRadio_gpio.c`
 14. 其他,官方未定义,属于第三方定义的常用API,不同厂家的射频方案不一定都能用
+
 ### 版本更新
-#### V03
-- 优化大功率模块PA控制信号,发送接收完后自动关闭PA,避免PA长时间工作导致过热
-#### V11
-- 增加串口实现无线无线数据收发
+
+2024年7月16日
+    - 修复近距离通讯丢包问题,修改config配置表(4Mbps)
 
 ## 二十三、免责说明
 1、本工程驱动软件只提供做演示项目使用,未经过大批量项目验证,客户需谨慎使用,如果使用在正式项目中引发的所有问题,本司概不负责。使用过程若发现任何问题,可及时与本司相关人员联系。

+ 47 - 0
project/system_stm32f10x.c

@@ -1080,6 +1080,53 @@ static void SetSysClockTo72(void)
 }
 #endif
 
+static uint8_t  fac_us=0;//us延时倍乘数
+static uint16_t fac_ms=0;//ms延时倍乘数
+//初始化延迟函数
+//SYSTICK的时钟固定为HCLK时钟的1/8
+//SYSCLK:系统时钟
+void delay_init(uint8_t SYSCLK)
+{
+	SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟  HCLK/8
+	fac_us=SYSCLK/8;		    
+	fac_ms=(uint16_t)fac_us*1000;
+}								    
+//延时nms
+//注意nms的范围
+//SysTick->LOAD为24位寄存器,所以,最大延时为:
+//nms<=0xffffff*8*1000/SYSCLK
+//SYSCLK单位为Hz,nms单位为ms
+//对72M条件下,nms<=1864 
+void delay_ms(uint16_t nms)
+{	 		  	  
+	u32 temp;		   
+	SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
+	SysTick->VAL =0x00;           //清空计数器
+	SysTick->CTRL=0x01 ;          //开始倒数  
+	do
+	{
+		temp=SysTick->CTRL;
+	}
+	while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
+	SysTick->CTRL=0x00;       //关闭计数器
+	SysTick->VAL =0X00;       //清空计数器	  	    
+}   
+//延时nus
+//nus为要延时的us数.		    								   
+void delay_us(uint32_t nus)
+{		
+	u32 temp;	    	 
+	SysTick->LOAD=nus*fac_us; //时间加载	  		 
+	SysTick->VAL=0x00;        //清空计数器
+	SysTick->CTRL=0x01 ;      //开始倒数 	 
+	do
+	{
+		temp=SysTick->CTRL;
+	}
+	while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
+	SysTick->CTRL=0x00;       //关闭计数器
+	SysTick->VAL =0X00;       //清空计数器	 
+}
 /**
   * @}
   */

+ 3 - 0
project/system_stm32f10x.h

@@ -78,6 +78,9 @@ extern uint32_t SystemCoreClock;          /*!< System Clock Frequency (Core Cloc
   
 extern void SystemInit(void);
 extern void SystemCoreClockUpdate(void);
+void delay_init(uint8_t SYSCLK);
+void delay_ms(uint16_t nms);  								   
+void delay_us(uint32_t nus);
 /**
   * @}
   */

+ 12 - 12
radio/A5133Config.h

@@ -37,8 +37,8 @@ const uint8_t A5133_RFConfigTab_Main[]=
 	0x59, //PLL3 register,
 	0x74, //PLL4 register,
 	0x01, //PLL5 register,
-	0x32, //ChannelGroup1 register,
-	0x64, //ChannelGroup1 register,
+	0x28, //ChannelGroup1 register,2024年7月16日
+	0x50, //ChannelGroup1 register,2024年7月16日
 	0x2D, //TX1 register, 				
 	0x40, //TX2 register,
 	0x1B, //DELAY1 register,
@@ -49,7 +49,7 @@ const uint8_t A5133_RFConfigTab_Main[]=
 	0x3C, //RXGAIN3 register,
 	0xCA, //RXGAIN4 register,
 	0x00, //RSSI register,
-	0xC9, //ADC register,
+	0xC1, //ADC register,2024年7月16日
 	0x00, //CODE1 register,
 	0x00, //CODE2 register, 				
 	0x00, //CODE3 register,
@@ -59,11 +59,11 @@ const uint8_t A5133_RFConfigTab_Main[]=
 	0xC0, //VCOCAL1 register,
 	0x80, //VCOCAL2 register,
 	0x30, //VCO deviation 1 register,
-	0x00, //VCO deviation 2 register,
+	0x40, //VCO deviation 2 register,
 	0x00, //DSA register,
 	0xFF, //VCO Modulation delay register,	
 	0x40, //BATTERY register,	 
-	0x64, //TXTEST register,
+	0xA7, //TXTEST register,2024年7月16日
 	0x57, //RXDEM1 register,
 	0x74, //RXDEM2 register,
 	0xF3, //CPC1 register,
@@ -109,13 +109,13 @@ const uint8_t A5133_RFConfigTab_Addr0x21[]=
 	0x00, //page3,
 	0x00, //page4,
 	0x00, //page5,
-	0xE4, //page6,
+	0xE0, //page6,2024年7月16日
 	0x00, //page7,
-	0x7C, //page8,
+	0x2C, //page8,2024年7月16日
 	0x4F, //page9,
 	0x01, //page10
-	0x43, //page11
-	0x3C  //page12 crystal type 3225, CL=9pF, CSXTL=108
+	0x42, //page11,2024年7月16日
+	0x56  //page12 crystal type 3225, CL=9pF, CSXTL=108,2024年7月16日
 };
 
 const uint8_t A5133_RFConfigTab_Addr0x22[]=
@@ -136,7 +136,7 @@ const uint8_t A5133_RFConfigTab_Addr0x2A[]=
 	0x80, //page3,
 	0x80, //page4,
 	0x48, //page5,
-	0x07, //page6,
+	0x03, //page6,2024年7月16日
 	0xC0, //page7,
 	0x3A, //page8,
 	0x3E, //page9,
@@ -148,11 +148,11 @@ const uint8_t A5133_RFConfigTab_Addr0x2A[]=
 const uint8_t A5133_RFConfigTab_Addr0x38[]=
 {
 	0x80, //page0,
-	0x56, //page1,
+	0x50, //page1,2024年7月16日
 	0x20, //page2,
 	0x64, //page3,
 	0x20, //page4,
-	0x00, //page5, //fps=0,7
+	0x40, //page5, //fps=0,7,2024年7月16日
 	0x60, //page6,
 	0x04, //page7,
 	0x00, //page8,

+ 1 - 0
radio/A5133_hal.c

@@ -536,6 +536,7 @@ void RF_TrimmedValue_Init(void)
     // trimValue[7]=Checksum for customer
 
     RF_WritePage(ROMP_REG, A5133_RFConfigTab_Addr0x38[9] | 0xA0, 9); // enable EFSW=1, EFRE=1
+    gpio_delayMs(5);
     BOARD_A5133_SCS_L();
     myRadioSpi_wByte(USID_REG | 0x40);
     for (i = 0; i < 8; i++)

+ 1 - 9
radio/myRadio.c

@@ -66,15 +66,7 @@ uint8_t getRfPowerTabIndex(int8_t power);
 /**-------------------------radio params end----------------------------------**/
 void myRadio_delay(uint32_t time_ms)
 {
-    uint32_t i, j;
-    i = time_ms;
-    while (i--)
-    {
-        for (j = 0; j < 1000; j++)
-        {
-            ;
-        }
-    }
+    delay_ms(time_ms);
 }
 /**
  * @brief IO口中断回调

+ 5 - 9
radio/myRadio_gpio.c

@@ -10,15 +10,11 @@ uint8_t sdioMode = 255;
 
 void gpio_delayUs(uint32_t time)
 {
-    uint32_t i, j;
-    i = time;
-    while (i--)
-    {
-        for (j = 0; j < 1; j++)
-        {
-            ;
-        }
-    }
+    delay_us(time);
+}
+void gpio_delayMs(uint32_t time)
+{
+    delay_ms(time);
 }
 //---------------------------射频SPI驱动部分---------------------
 void BOARD_A5133_SCS_H(void)

+ 2 - 1
radio/myRadio_gpio.h

@@ -84,7 +84,8 @@ uint8_t myRadioSpi_rwByte(uint8_t byteToWrite);
 void myRadioSpi_wBuffer(uint8_t* pData, uint8_t len);
 void myRadioSpi_rBuffer(uint8_t* pData, uint8_t len);
 void myRadioSpi_rwBuffer(uint8_t* pDataR, uint8_t* pDataW, uint8_t len);
-
+void gpio_delayUs(uint32_t time);
+void gpio_delayMs(uint32_t time);
 #define SpiReadWrite(p)                 myRadioSpi_rwByte(p)
 #define SpiWriteData(p1, p2)            myRadioSpi_wBuffer(p1, p2)
 #define SpiReadData(p1, p2)             myRadioSpi_rBuffer(p1, p2)