简介
; _1 N' S9 `4 z3 @( G% n# @% a官方只提供了STM32WL55JC和STM32WL55JC1的相关应用demo,由于封装不通我们并不能直接使用相关程序,需要移植才能使用。本次我们移植pingpong通信demo
4 Y3 t# i, d4 C/ g6 Z& n( j5 E& G" K2 C4 E$ D( y: J
一、工程移植
, r0 H! F( S" N( C! F' a/ Y4 m7 ?1、打开STM32CubeMX,选择start My projext from MCU开始工程
/ E3 E- m0 ^$ M+ b
* x9 i" e8 }4 R2 E0 x
/ u8 ]. D3 S" L; O4 q8 e
, r6 [& l5 \/ s6 w; |. Q f2、在MCU/MPU处选择使用STM32WLE5CCU62 Q% w0 E- Q7 o* t3 x0 D' N
/ d/ T: A7 M$ D2 Z' R# X
, U3 [& W+ N- W/ m% G' O: a6 ]% \5 w3 ~0 F T" \
3、在File->import project导入pingpong例程,选择导入工程为C"\Users\用户\STM32Cube\Repository\STM32CuBE_FW_WLV1.2.0\Projects\NUCLEO-WL55JC\Applications\SubGHz_Phy\SubGHz_Phy_PingPong\SubGHz_Phy_PingPong.ioc
* u4 k! ?5 h. o* U4 W" q3 R+ H用户为自己实际的用户名
* r1 l# ~& V+ R- Z u
* y, A: {% s% \3 M* [
% [) a5 |% ^1 Q6 l' O. [
2 @3 p% R' a# j6 c2 h导入后会有些报错,是因为原来WL55JC是BGA的封装引脚要多一些,而stm32wle5ccu6没有
9 H' m) U- U2 T7 W2 W0 E
1 B2 C9 {/ v6 b, d4、在Project Manager->Project中设置工程名和存放路径,Toolchain/IDE设置为MDK-ARM;Code Generator设置为Copy all used libraries into the project folder- O' O+ ?) b( ^( ?9 `
2 g3 ~) R9 d, a& C# s; B$ h: a/ v% o
# J! u8 H/ r/ U- @. R8 r. M1 I* o+ P+ {9 Z
7 w9 C6 @8 [! [- A
. a% V" Z* R5 q& H5 S: L
5、时钟输入配置,HSE和LSE都配置为Crystal/Ceramic Resonator
: _- t, l0 c- Q$ A# d! R2 @+ i8 P/ r3 J- Q
) m# j3 ?. s; v. H/ c
2 p" b/ ` |. g* [8 ^
e! ]% u( r; g( ^5 y6、RTC开启Alarm A并且使能中断
& |7 _0 g4 E8 W/ M E* A) C6 W) X. J; M1 ^8 v* b
8 B1 }: k' d* h) M9 c5 s/ [
! X& f9 U5 k' f5 B
" @, s+ _" E) Q0 T7、SubGHz_Phy设置如下
0 X2 g7 b7 b3 O( i' z( _3 _! O/ _9 A$ K1 t3 X
& a' z/ v% r' S. ? C3 e
; Y/ s+ U7 {" b9 a
1 |5 s! N4 {$ f2 p$ i
X! Z2 v+ ^. E, P8、时钟树配置,RTC使用LSE
4 F/ [6 W+ H5 |4 G9 W! S
; \' p( G0 z7 z5 E; B/ V# O
7 h( \+ D; N( k- s* w1 a
( g% s! D1 s0 ?2 j1 f* A5 j6 s
9、点击GENERATE CODE生成代码,打开keil工程然后编译会报以下错误,是由于我们没有添加BSP包3 Y. |. P" T" @4 Z) x |. t
; d* ^) r% E' n3 n
6 a! ^; ]: t$ s! r M) j- {. H* e
10、把下载的软件包C:\Users\用户\STM32Cube\Repository\STM32Cube_FW_WL_V1.2.0\Drivers中的BSP包拷贝到当前工程下。然后在keil中添加文件和其所在目录索引。
/ {0 S9 _- \! p$ u* j* W11、然后编译工程,0 error 0 waring8 L1 ]. \" F0 F8 E
# D9 i3 Y% |, L$ [/ F# F$ G( k
5 x( _2 n, K- M9 i ^8 T
4 R- K( z0 p7 e1 H, M: C二、应用移植
- x9 w; Y& W6 `1、修改BSP中关于射频开关部分的引脚定义,我们使用的亿佰特的E77模块,所以射频开关为PA6和PA7
" d" C3 Z3 ?0 q `) b& Ostm32wlxx_nucleo_radio.h修改为下面这样,我们只使用了RF_SW_CTRL3_PIN、RF_SW_CTRL1_PIN 两个脚,另一个不用管。
; \- v% ?& y3 a% k- y' Y+ e- E) G! ^9 A$ h, [# n; M/ u
- <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL3_PIN GPIO_PIN_6</font>4 |" W) F5 r" B2 D& v
- <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL3_GPIO_PORT GPIOA</font>
% v& U% `. K" V& X- F8 J - <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL3_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()</font>! _6 A0 }4 }3 p
- <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL3_GPIO_CLK_DISABLE() __HAL_RCC_GPIOC_CLK_DISABLE()</font>
1 m5 k: H6 t" A0 E$ u$ D
3 Z/ N' |2 }! g0 Y0 H8 H- <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL1_PIN GPIO_PIN_7</font>2 U8 E. w) A8 N2 E1 }: B7 o; t7 ?
- <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL1_GPIO_PORT GPIOA</font># \3 G4 ~ [1 B/ t5 @7 k/ }5 u
- <font color="#000000" face="Tahoma" size="3">#define RF_SW_CTRL1_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()</font>
7 {- |! F `" N) j# N - <font color="#000000" face="Tahoma" size="3">#define RF_SW_RX_GPIO_CLK_DISABLE() __HAL_RCC_GPIOC_CLK_DISABLE()</font>
复制代码
- W+ P9 |: h. K( y. T' G. n+ y由于射频开关不同,射频控制逻辑也需要修改,把stm32wlxx_nucleo_radio.c中射频开关修改如下所示5 f* U" R3 [% Y4 k0 P; z
6 m1 ~) e" |( L* j+ |6 k: k2 k ~. N
- <font color="#000000" face="Tahoma" size="3">int32_t BSP_RADIO_ConfigRFSwitch(BSP_RADIO_Switch_TypeDef Config)</font>- E( `: D: ~' {. F" J' E% E
- <font color="#000000" face="Tahoma" size="3">{</font>
W5 b& |, }* b# j8 ` - <font color="#000000" face="Tahoma" size="3"> switch (Config)</font>1 y- x9 V7 r* B7 F( X9 O
- <font color="#000000" face="Tahoma" size="3"> {</font>; K* E0 i, N+ |% ?
- <font color="#000000" face="Tahoma" size="3"> case RADIO_SWITCH_OFF:</font>
- v' B# q K3 v - <font color="#000000" face="Tahoma" size="3"> {</font>& y* d- j h+ t2 x- j
- <font color="#000000" face="Tahoma" size="3"> /* Turn off switch */</font>
1 J H% o2 o2 \: t$ } - <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_RESET);</font>
0 ~# ^* A% I$ Q' ?) s+ Z - <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET);</font>
9 u( L% r5 ]) |9 w+ { - <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET);</font>
! P+ i/ N7 o+ \4 a) T& _8 Q - <font color="#000000" face="Tahoma" size="3"> break; </font># s4 C1 h$ p5 `1 k
- <font color="#000000" face="Tahoma" size="3"> }</font>: K. R- n* [5 u+ p5 D
- <font color="#000000" face="Tahoma" size="3"> case RADIO_SWITCH_RX:</font>
! u8 y: P' d; r) G: n4 `7 L - <font color="#000000" face="Tahoma" size="3"> {</font>
! V: V0 c6 n7 \ J* m' }# e; I - <font color="#000000" face="Tahoma" size="3"> /*Turns On in Rx Mode the RF Switch */</font>+ j0 G; f; g- m4 N# T, _$ [
- <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_RESET);</font>6 I1 B# I. r4 }8 I% g" n8 k( ?
- <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_SET); </font>
) N2 {7 w3 w* S - <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET); </font>3 E" T1 y7 b8 `& i1 f
- <font color="#000000" face="Tahoma" size="3"> break;</font>& [* C# i7 ]+ O: q1 }/ r# M% {
- <font color="#000000" face="Tahoma" size="3"> }</font>
6 ] @0 n1 o1 D9 S: J* q9 W* \- w - <font color="#000000" face="Tahoma" size="3"> case RADIO_SWITCH_RFO_LP:</font>
- O3 d3 u2 [) o( u4 D, @9 C8 i - <font color="#000000" face="Tahoma" size="3"> {</font>, E7 L' w0 B* [. r: T
- <font color="#000000" face="Tahoma" size="3"> /*Turns On in Tx Low Power the RF Switch */</font>0 Z# a7 m3 Y. d3 u b! t
- <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_SET);</font>
" `1 i) P5 a2 D - <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET); </font>0 k) d' q& [0 s% I- D
- <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_SET); </font>
8 z2 y6 Q' o* v - <font color="#000000" face="Tahoma" size="3"> break;</font>
# T( @! |. h7 g& C - <font color="#000000" face="Tahoma" size="3"> }</font>
5 A( ~) l" \3 V3 K/ A9 D - <font color="#000000" face="Tahoma" size="3"> case RADIO_SWITCH_RFO_HP:</font>: i: ^) P. K. i2 { F4 k: N
- <font color="#000000" face="Tahoma" size="3"> {</font>: f4 c l6 g9 |1 z
- <font color="#000000" face="Tahoma" size="3"> /*Turns On in Tx High Power the RF Switch */</font>: G! K& U! x( E" w4 E, ?, p' r
- <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(RF_SW_CTRL3_GPIO_PORT, RF_SW_CTRL3_PIN, GPIO_PIN_SET);</font>; |2 p5 g1 z/ e% N9 O
- <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET); </font>, a' H4 Z# I* L l" x
- <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_SET); </font># h: D: c5 v; [( h/ }' x; y0 }, c
- <font color="#000000" face="Tahoma" size="3"> break;</font>
1 q0 n! b7 [8 K3 y* V+ c' l& F; _: O# ~ - <font color="#000000" face="Tahoma" size="3"> }</font>
4 a! h S/ `0 t( E6 O' U6 P - <font color="#000000" face="Tahoma" size="3"> default:</font>
" X( C' i# l& P: t. ~& o - <font color="#000000" face="Tahoma" size="3"> break; </font>9 P& l E/ T: k0 M2 G( N C
- <font color="#000000" face="Tahoma" size="3"> } </font>
0 Q O; e' m: l4 L: o5 S
, M. g5 d9 W* h- <font color="#000000" face="Tahoma" size="3"> return BSP_ERROR_NONE;</font>6 \3 L M2 Q3 B# h! T/ a4 i5 `
- <font color="#000000" face="Tahoma" size="3">}</font>
5 z8 B0 C6 w, N. ^; Q/ g" F4 s - 5 r" U' i( J! W# v; _' y" G
- <font color="#000000" face="Tahoma" size="3">int32_t BSP_RADIO_GetTxConfig(void)</font>. T6 ~$ @. G# t0 B1 n! O4 x; O
- <font color="#000000" face="Tahoma" size="3">{</font> O% A. F3 f& D8 A. h# A. R- A
- <font color="#000000" face="Tahoma" size="3"> //return RADIO_CONF_RFO_LP_HP;</font>
9 E5 F3 q. |( J, Z: U* r3 y8 P9 Q - <font color="#000000" face="Tahoma" size="3"> return RADIO_CONF_RFO_HP;</font>0 S( l) d) P1 |0 L4 M# n
- <font color="#000000" face="Tahoma" size="3">}</font>
; F3 p& ^7 T/ s$ n) V' n* q9 [
; q( W7 r0 d9 A) q- <font color="#000000" face="Tahoma" size="3">//</font>
+ t4 y c$ ?% ~: c% ~ - <font color="#000000" face="Tahoma" size="3">//使用无源晶振</font>
N# ?) ^$ B/ B: x" h+ O+ g* F9 _1 O - <font color="#000000" face="Tahoma" size="3">/**</font>, f& m% S: B) X Q0 a
- <font color="#000000" face="Tahoma" size="3"> * @brief Get If TCXO is to be present on board</font>
' r# _" A; k& l( s) _& Z$ c - <font color="#000000" face="Tahoma" size="3"> * @note never remove called by MW,</font>
# N& D* V7 E3 c$ U, F - <font color="#000000" face="Tahoma" size="3"> * @retval</font>$ G9 f$ r* R/ [/ N
- <font color="#000000" face="Tahoma" size="3"> * RADIO_CONF_TCXO_NOT_SUPPORTED</font>2 |4 \8 a6 P1 c7 m# F9 ^) g5 a
- <font color="#000000" face="Tahoma" size="3"> * RADIO_CONF_TCXO_SUPPORTED</font>" [0 i, h L: a( ~6 e1 R+ e
- <font color="#000000" face="Tahoma" size="3"> */</font>
3 t/ }* `* r0 }* Y; W$ u5 R! w3 Y - <font color="#000000" face="Tahoma" size="3">int32_t BSP_RADIO_IsTCXO(void)</font>
4 v! N! T8 H7 U: I" ?- ?2 u; d - <font color="#000000" face="Tahoma" size="3">{</font>
4 x0 D, f0 w& w# D - <font color="#000000" face="Tahoma" size="3"> //return RADIO_CONF_TCXO_SUPPORTED;</font>
3 I, a% r# G0 T& r/ ^/ I( w - <font color="#000000" face="Tahoma" size="3"> return RADIO_CONF_TCXO_NOT_SUPPORTED</font>
; t2 U& p+ S8 I" z9 H K - <font color="#000000" face="Tahoma" size="3">}</font># k6 ?: |9 \7 O3 O9 b
- <font color="#000000" face="Tahoma" size="3">由于亿佰特的E77模块使用的是无源晶振,所以需要调整晶振负载电容以保证晶振精度</font>% A, v. @- @0 }) g3 m: o2 T7 h
- <font color="#000000" face="Tahoma" size="3">(这里不调整也可,因为是两个模块互通,但考虑后面lorawan工程还是调整为好),采用</font>& s6 M" J ?8 W Q
- <font color="#000000" face="Tahoma" size="3">模块厂商推荐值0x0B</font>) R5 ]) E3 [! z. e
- <font color="#000000" face="Tahoma" size="3">//#define XTAL_DEFAULT_CAP_VALUE ( 0x20UL )</font>9 {! \4 Z; `4 q
- <font color="#000000" face="Tahoma" size="3">#define XTAL_DEFAULT_CAP_VALUE ( 0x0BUL )</font>
复制代码 y2 k0 a& W X2 Y6 i/ f8 k, O: u
2、修改subghz_phy_app.c文件,CubeMx刚生成工程是没有应用程序的。我们只需要从STM32Cube_FW_WL_V1.2.0软件包中去找到对应的工程文件然后修改,修改后的subghz_phy_appp.c如下。
: O. U) Y7 \& I8 E$ W
7 B" [3 K( `$ A8 m+ Z) G- <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN Header */</font>; u* n) M2 J# i" s4 @( [* o! y
- <font color="#000000" face="Tahoma" size="3">/**</font>
+ r& x+ |6 h1 M, X2 e - <font color="#000000" face="Tahoma" size="3"> ******************************************************************************</font>: l$ w* K8 [2 v- m- H
- <font color="#000000" face="Tahoma" size="3"> * @file subghz_phy_app.c</font>( h! ~0 c2 x: Q3 V1 J
- <font color="#000000" face="Tahoma" size="3"> * @author MCD Application Team</font>
% r8 }# @1 q9 u' U+ F - <font color="#000000" face="Tahoma" size="3"> * @brief Application of the SubGHz_Phy Middleware</font>% I0 D1 \* w& p: H6 K- ]; T* e
- <font color="#000000" face="Tahoma" size="3"> ******************************************************************************</font>9 r+ A: t) `! p+ Y7 g
- <font color="#000000" face="Tahoma" size="3"> * @attention</font>- S% E9 }# R- l
- <font color="#000000" face="Tahoma" size="3"> *</font>
- n9 ]1 X1 h" \. y2 x - <font color="#000000" face="Tahoma" size="3"> * Copyright (c) 2022 STMicroelectronics.</font>
6 }! ~: k5 ?0 r+ d - <font color="#000000" face="Tahoma" size="3"> * All rights reserved.</font>
/ N8 @. d6 _* I: X/ G5 I - <font color="#000000" face="Tahoma" size="3"> *</font>* n" ^& T- `' O: K( g
- <font color="#000000" face="Tahoma" size="3"> * This software is licensed under terms that can be found in the LICENSE file</font>& I4 j5 E# R) H- K+ t L C
- <font color="#000000" face="Tahoma" size="3"> * in the root directory of this software component.</font>
) ?0 U: c2 [% I R! q4 N& E8 _ - <font color="#000000" face="Tahoma" size="3"> * If no LICENSE file comes with this software, it is provided AS-IS.</font>3 k" L" R, [% @1 d6 a
- <font color="#000000" face="Tahoma" size="3"> *</font>1 |2 Y) E" L1 ^" d0 L' u2 r7 k
- <font color="#000000" face="Tahoma" size="3"> ******************************************************************************</font>; I7 v1 P9 } R! A' T; c% w w
- <font color="#000000" face="Tahoma" size="3"> */</font>
6 v+ m- u0 ]- S6 o! ~" w! @, e - <font color="#000000" face="Tahoma" size="3">/* USER CODE END Header */</font>
5 ^2 |- i/ j* z1 f4 V
( j) o$ m) V! ]+ a. k4 T' k- <font color="#000000" face="Tahoma" size="3">/* Includes ------------------------------------------------------------------*/</font>
) }2 g0 C9 N: F - <font color="#000000" face="Tahoma" size="3">#include "platform.h"</font>* n3 C# p z6 Q# Z1 z
- <font color="#000000" face="Tahoma" size="3">#include "sys_app.h"</font>
7 [, [. k% E* ` @9 H - <font color="#000000" face="Tahoma" size="3">#include "subghz_phy_app.h"</font>
. t( m2 @6 c$ L/ y2 Y0 p& ` - <font color="#000000" face="Tahoma" size="3">#include "radio.h"</font>& E q+ o3 X% ` g
6 c' G9 M5 [" r! V- <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN Includes */</font>3 c8 y* c' O1 j4 o+ t* O V# {
- <font color="#000000" face="Tahoma" size="3">#include "stm32_timer.h"</font>* G1 @: l$ e/ Z" ~3 H- k a: J
- <font color="#000000" face="Tahoma" size="3">#include "stm32_seq.h"</font>
. }: k# j1 ]) q) m1 e" `/ L - <font color="#000000" face="Tahoma" size="3">#include "utilities_def.h"</font>9 z; ]- [ B) Z' ]1 I
- <font color="#000000" face="Tahoma" size="3">#include "app_version.h"</font>. u: w5 ~( @1 U B, M" P
- <font color="#000000" face="Tahoma" size="3">#include "subghz_phy_version.h"</font>& V6 ^' o' l8 H$ D& v4 w$ }4 A
- <font color="#000000" face="Tahoma" size="3">/* USER CODE END Includes */</font>$ ~' {! {9 ] ]
/ @- d% z- S) q+ O5 }8 l- <font color="#000000" face="Tahoma" size="3">/* External variables ---------------------------------------------------------*/</font>* i/ ?- h6 `- N/ Y, O3 H6 |
- <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN EV */</font>- b& y) W3 w: ?
- $ p' h' @* `( @+ i" ?5 h2 ]9 ^( K2 l
- <font color="#000000" face="Tahoma" size="3">/* USER CODE END EV */</font>
8 E, t+ |3 @7 j) u9 P' v4 j - 0 I1 P1 ^& z& ]2 e+ i, I* w
- <font color="#000000" face="Tahoma" size="3">/* Private typedef -----------------------------------------------------------*/</font>& O/ Y, p3 `2 V, n/ W# l' E# Z
$ v4 r) y( u' ?8 ?5 P- Y, i* V, J- <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PTD */</font>( q3 z1 I, F S0 `% C: }
- <font color="#000000" face="Tahoma" size="3">typedef enum</font>
: c+ J' F) j8 }. j' i# N - <font color="#000000" face="Tahoma" size="3">{</font>
3 a& W& q7 Q8 w/ P5 Z1 }: l) O - <font color="#000000" face="Tahoma" size="3"> RX,</font>' p& Z2 U% a0 |
- <font color="#000000" face="Tahoma" size="3"> RX_TIMEOUT,</font>
. f0 a$ E2 q9 ] } - <font color="#000000" face="Tahoma" size="3"> RX_ERROR,</font> P" c5 f$ q( d! l; t
- <font color="#000000" face="Tahoma" size="3"> TX,</font>8 [: T' R/ D8 C! i/ w2 D; C! r
- <font color="#000000" face="Tahoma" size="3"> TX_TIMEOUT,</font>" [" i) l2 l) U. n( J
- <font color="#000000" face="Tahoma" size="3">} States_t;</font> C/ U% w4 n( ~- S' X9 c
- <font color="#000000" face="Tahoma" size="3">/* USER CODE END PTD */</font># G% {* a+ F$ l1 H2 C* l
- . y: A! S7 i3 p v
- <font color="#000000" face="Tahoma" size="3">/* Private define ------------------------------------------------------------*/</font>( h' L% K- p% x6 ]' X/ t
- <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PD */</font>8 l# }" }2 z m5 w. Z1 X
- <font color="#000000" face="Tahoma" size="3">/* Configurations */</font>, C5 a- L+ V3 U" w$ Q7 @4 l
- <font color="#000000" face="Tahoma" size="3">/*Timeout*/</font>) R# E5 D7 P5 ^9 \
- <font color="#000000" face="Tahoma" size="3">#define RX_TIMEOUT_VALUE 3000</font>
" a: r8 N- ~5 |7 v+ q- f$ | - <font color="#000000" face="Tahoma" size="3">#define TX_TIMEOUT_VALUE 3000</font>- t6 M1 j+ [: t: E y
- <font color="#000000" face="Tahoma" size="3">/* PING string*/</font>! b1 v G, Y9 l' M
- <font color="#000000" face="Tahoma" size="3">#define PING "PING"</font>, X7 U H/ ^8 ^
- <font color="#000000" face="Tahoma" size="3">/* PONG string*/</font>
0 S6 p$ r& ^0 V. { - <font color="#000000" face="Tahoma" size="3">#define PONG "PONG"</font>
7 d9 Z' J6 ]+ J4 f9 H - <font color="#000000" face="Tahoma" size="3">/*Size of the payload to be sent*/</font>) v! e5 x$ c; v/ z
- <font color="#000000" face="Tahoma" size="3">/* Size must be greater of equal the PING and PONG*/</font>; ^1 w( }2 n: I6 ^, G
- <font color="#000000" face="Tahoma" size="3">#define MAX_APP_BUFFER_SIZE 255</font>1 |* z" x( V# J4 m& ^: F9 ~1 `
- <font color="#000000" face="Tahoma" size="3">#if (PAYLOAD_LEN > MAX_APP_BUFFER_SIZE)</font>
2 i; {/ |5 T: a- w5 |) _- T - <font color="#000000" face="Tahoma" size="3">#error PAYLOAD_LEN must be less or equal than MAX_APP_BUFFER_SIZE</font>8 G/ O/ f1 `' l
- <font color="#000000" face="Tahoma" size="3">#endif /* (PAYLOAD_LEN > MAX_APP_BUFFER_SIZE) */</font>
; y# C$ A8 _7 X: { - <font color="#000000" face="Tahoma" size="3">/* wait for remote to be in Rx, before sending a Tx frame*/</font>
. m0 P, \8 e. ?# I8 ?8 `! q: P - <font color="#000000" face="Tahoma" size="3">#define RX_TIME_MARGIN 200</font>
) V% B% r! L( b, ~$ h - <font color="#000000" face="Tahoma" size="3">/* Afc bandwidth in Hz */</font>
, Q0 Z% S( f7 q( ]" A - <font color="#000000" face="Tahoma" size="3">#define FSK_AFC_BANDWIDTH 83333</font>
& O1 H/ z X8 D9 g% P5 ] - <font color="#000000" face="Tahoma" size="3">/* LED blink Period*/</font>
* Z1 Y+ p- Z1 R7 e2 {: v V( _2 J - <font color="#000000" face="Tahoma" size="3">#define LED_PERIOD_MS 200</font>6 z; M5 a7 r/ M( x" @2 r0 ]2 T3 f
- <font color="#000000" face="Tahoma" size="3">/* USER CODE END PD */</font>
$ ?! Z: d; ?( A, r - / r( O* }; \$ j j3 u% d
- <font color="#000000" face="Tahoma" size="3">/* Private macro -------------------------------------------------------------*/</font>$ B# H# c4 O2 a* `2 H6 ^
- <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PM */</font>
! j( s' R5 c1 c# H% X# K; [8 j
) Z, ?6 _/ W- O. {, K- <font color="#000000" face="Tahoma" size="3">/* USER CODE END PM */</font>
: {0 q8 D- m# [, n4 c* w
3 X6 ]; I/ g, i- N6 W, S0 c9 I- <font color="#000000" face="Tahoma" size="3">/* Private variables ---------------------------------------------------------*/</font>
. e. @ i) Q, h4 s' J, o. V# Y - <font color="#000000" face="Tahoma" size="3">/* Radio events function pointer */</font>
0 f% l# T& v! _7 [- C - <font color="#000000" face="Tahoma" size="3">static RadioEvents_t RadioEvents;</font>, a% t" X+ E% g2 o6 R2 ~
- <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PV */</font>
8 K; n, x8 q5 R4 F - <font color="#000000" face="Tahoma" size="3">/*Ping Pong FSM states */</font>6 C1 `! Y0 X! W2 j8 k5 X! k
- <font color="#000000" face="Tahoma" size="3">static States_t State = RX;</font>
0 Q/ q8 T9 h, v" j - <font color="#000000" face="Tahoma" size="3">/* App Rx Buffer*/</font>
* J+ u- U( \7 Z/ ?% E. v - <font color="#000000" face="Tahoma" size="3">static uint8_t BufferRx[MAX_APP_BUFFER_SIZE];</font>
4 T- X6 ?2 l/ d+ S# l; q - <font color="#000000" face="Tahoma" size="3">/* App Tx Buffer*/</font>6 h8 a5 u- i5 l% X' w- P4 W# B8 o1 _
- <font color="#000000" face="Tahoma" size="3">static uint8_t BufferTx[MAX_APP_BUFFER_SIZE];</font>0 s; G3 V& S! b( t, @0 J
- <font color="#000000" face="Tahoma" size="3">/* Last Received Buffer Size*/</font>
6 H9 ]1 v/ @" Q$ l8 \( [! T - <font color="#000000" face="Tahoma" size="3">uint16_t RxBufferSize = 0;</font>
- Z. `7 p t3 w6 f1 f- n: l0 @/ m j - <font color="#000000" face="Tahoma" size="3">/* Last Received packer Rssi*/</font>: S8 j# T) ^8 A; j
- <font color="#000000" face="Tahoma" size="3">int8_t RssiValue = 0;</font>6 m% }$ l3 R: K, o" ~8 h
- <font color="#000000" face="Tahoma" size="3">/* Last Received packer SNR (in Lora modulation)*/</font>
3 k8 L, U7 {- S - <font color="#000000" face="Tahoma" size="3">int8_t SnrValue = 0;</font>
+ I+ G: K$ T) { | - <font color="#000000" face="Tahoma" size="3">/* Led Timers objects*/</font>& n' a" C3 E+ D/ K% S- r) h
- <font color="#000000" face="Tahoma" size="3">static UTIL_TIMER_Object_t timerLed;</font>" M1 R- Y1 M* Z8 s) ]9 U
- <font color="#000000" face="Tahoma" size="3">/* device state. Master: true, Slave: false*/</font>3 Q' {' y9 h7 ^0 ]
- <font color="#000000" face="Tahoma" size="3">bool isMaster = true;</font>' J- z) q! O3 u6 T6 \1 T
- <font color="#000000" face="Tahoma" size="3">/* random delay to make sure 2 devices will sync*/</font>
c8 Z# d S% J" n4 Q5 a - <font color="#000000" face="Tahoma" size="3">/* the closest the random delays are, the longer it will</font>8 M0 P- I$ v% m$ |
- <font color="#000000" face="Tahoma" size="3"> take for the devices to sync when started simultaneously*/</font>& A2 ?1 z: y3 T5 m, U
- <font color="#000000" face="Tahoma" size="3">static int32_t random_delay;</font>
1 o4 x( Q' _$ @1 x2 E/ n( H - <font color="#000000" face="Tahoma" size="3">/* USER CODE END PV */</font>
* m" @& {/ |1 Q+ I - " r6 `9 f: {/ D; y# h, w; b
- <font color="#000000" face="Tahoma" size="3">/* Private function prototypes -----------------------------------------------*/</font>- l" B+ B% K$ K$ ~4 v
- <font color="#000000" face="Tahoma" size="3">/*!</font>6 @4 x. Q+ r l# C' B6 p
- <font color="#000000" face="Tahoma" size="3"> * @brief Function to be executed on Radio Tx Done event</font>6 X7 N! |- V) p( C# V, }/ T! D1 O
- <font color="#000000" face="Tahoma" size="3"> */</font>, M' g. O, E1 q. H
- <font color="#000000" face="Tahoma" size="3">static void OnTxDone(void);</font>
9 e/ e8 h6 O, z6 Y/ i - # d% H3 b. N/ H
- <font color="#000000" face="Tahoma" size="3">/**</font>
& q: S& n* R/ d, g0 J - <font color="#000000" face="Tahoma" size="3"> * @brief Function to be executed on Radio Rx Done event</font>+ f8 [: o) M5 g0 @- F4 E
- <font color="#000000" face="Tahoma" size="3"> * @param payload ptr of buffer received</font>
$ b8 P! g( q, ?' e/ p* | - <font color="#000000" face="Tahoma" size="3"> * @param size buffer size</font>; l0 I; i: x% ^' n, R
- <font color="#000000" face="Tahoma" size="3"> * @param rssi</font> i8 w1 E* @6 c1 Q M2 b
- <font color="#000000" face="Tahoma" size="3"> * @param LoraSnr_FskCfo</font>
5 Z. w0 P: V& Y2 n @1 j - <font color="#000000" face="Tahoma" size="3"> */</font>) ]: n( v8 i: u2 _ Z$ S8 l
- <font color="#000000" face="Tahoma" size="3">static void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t LoraSnr_FskCfo);</font>: b2 c+ Z% X' \: M. p2 f! v v2 j/ k
- 8 d' E$ C* i, \- A
- <font color="#000000" face="Tahoma" size="3">/**</font>
, l/ N4 o) D0 t& ] - <font color="#000000" face="Tahoma" size="3"> * @brief Function executed on Radio Tx Timeout event</font>
* D% H) w/ L- N9 H4 z. A - <font color="#000000" face="Tahoma" size="3"> */</font>
* w# v2 g8 I1 _* Q: V - <font color="#000000" face="Tahoma" size="3">static void OnTxTimeout(void);</font>
e1 G$ ]3 x9 H. W c8 C# ` - & [# B: Y: ^- J5 l( k4 J
- <font color="#000000" face="Tahoma" size="3">/**</font>1 `( W% S+ s, G1 N5 ` n% k) o% B
- <font color="#000000" face="Tahoma" size="3"> * @brief Function executed on Radio Rx Timeout event</font>
- I1 j! E4 q8 x& p$ W/ ?) i6 K - <font color="#000000" face="Tahoma" size="3"> */</font>" k$ Q# G$ q/ w
- <font color="#000000" face="Tahoma" size="3">static void OnRxTimeout(void);</font>
5 T4 `- S: Z+ P; f% Y! x. s- G' B* r - 7 T) B) b# R1 W' C1 C2 C
- <font color="#000000" face="Tahoma" size="3">/**</font>
$ p! V' O. \5 F0 x4 y - <font color="#000000" face="Tahoma" size="3"> * @brief Function executed on Radio Rx Error event</font>; B/ H$ w7 W1 {, k4 F+ |$ |8 }
- <font color="#000000" face="Tahoma" size="3"> */</font>! w6 X- z5 [2 j' q% k
- <font color="#000000" face="Tahoma" size="3">static void OnRxError(void);</font>% q, v2 Y, n: Y4 G* l1 a( A! J$ y
# [) S* A) X. { Q+ S+ o- <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PFP */</font>! o5 H; h: Y7 R" J' t7 K2 ?
- <font color="#000000" face="Tahoma" size="3">/**</font>8 d. P# }1 N) l9 C" O& e1 v+ g/ v- k
- <font color="#000000" face="Tahoma" size="3"> * @brief Function executed on when led timer elapses</font>7 I2 D' S( R; X
- <font color="#000000" face="Tahoma" size="3"> * @param context ptr of LED context</font>
" Z7 _% W6 ~5 G/ |7 L# g3 a - <font color="#000000" face="Tahoma" size="3"> */</font>
: q+ _( X+ b7 | - <font color="#000000" face="Tahoma" size="3">static void OnledEvent(void *context);</font>; O \. y8 }1 g
8 x3 r: O" h' l+ ]$ j- <font color="#000000" face="Tahoma" size="3">/**</font>" o G+ Q% n2 P
- <font color="#000000" face="Tahoma" size="3"> * @brief PingPong state machine implementation</font>
$ {( K% ~- A+ `& `0 c H, C) _; n - <font color="#000000" face="Tahoma" size="3"> */</font>
I1 k6 L) u" Z - <font color="#000000" face="Tahoma" size="3">static void PingPong_Process(void);</font>
% b9 w2 _5 ^8 ? - <font color="#000000" face="Tahoma" size="3">/* USER CODE END PFP */</font>
+ x2 @ l ^( l1 V( E3 X
# h4 J: F2 ] V1 h! N" C# Q% J- <font color="#000000" face="Tahoma" size="3">/* Exported functions ---------------------------------------------------------*/</font>" ^0 p2 ?% m1 N0 Z. e
- <font color="#000000" face="Tahoma" size="3">void SubghzApp_Init(void)</font>
5 q1 f. \% U6 m: \ J - <font color="#000000" face="Tahoma" size="3">{</font>' H: C, P4 c* q' C' x7 V
- <font color="#000000" face="Tahoma" size="3"> /* USER CODE BEGIN SubghzApp_Init_1 */</font>4 P3 g& j4 V. F5 s$ H, }6 x5 g* f
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_M, "\n\rPING PONG\n\r");</font>" J: y3 ?' Q T7 m" n, g2 O6 O
- <font color="#000000" face="Tahoma" size="3"> /* Get SubGHY_Phy APP version*/</font>$ S' U/ G8 I, A" \
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_M, "APPLICATION_VERSION: V%X.%X.%X\r\n",</font>
4 v. g# i# U& S, _( |+ e - <font color="#000000" face="Tahoma" size="3"> (uint8_t)(APP_VERSION_MAIN),</font>9 c! @7 q9 T- U: T$ @, ?5 \" Q
- <font color="#000000" face="Tahoma" size="3"> (uint8_t)(APP_VERSION_SUB1),</font>
4 J( i4 W" \ b% f0 H+ d - <font color="#000000" face="Tahoma" size="3"> (uint8_t)(APP_VERSION_SUB2));</font>
- b& a6 \" U( |% t+ i' u) W3 L% ~, K
) m z% x0 G3 `9 T- <font color="#000000" face="Tahoma" size="3"> /* Get MW SubGhz_Phy info */</font>
: W) G# `) E- d7 r1 w# [ - <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_M, "MW_RADIO_VERSION: V%X.%X.%X\r\n",</font>; s9 o. U; H- @: j# e# p) z
- <font color="#000000" face="Tahoma" size="3"> (uint8_t)(SUBGHZ_PHY_VERSION_MAIN),</font>6 S [) b$ a5 \% X( _
- <font color="#000000" face="Tahoma" size="3"> (uint8_t)(SUBGHZ_PHY_VERSION_SUB1),</font>
- B; `- ]6 `* I4 t- _! T - <font color="#000000" face="Tahoma" size="3"> (uint8_t)(SUBGHZ_PHY_VERSION_SUB2));</font>
) Y) F9 Y. _ W5 l3 R% O - + ^% V+ ~6 Y+ K
- <font color="#000000" face="Tahoma" size="3"> /* Led Timers*/</font>
0 Y) g. s7 \$ o/ Z3 Y. s - <font color="#000000" face="Tahoma" size="3"> UTIL_TIMER_Create(&timerLed, LED_PERIOD_MS, UTIL_TIMER_ONESHOT, OnledEvent, NULL);</font>( y: }. x1 f) c0 E& ~: O7 n
- <font color="#000000" face="Tahoma" size="3"> UTIL_TIMER_Start(&timerLed);</font>
; M7 R6 {* E$ h: w# R - <font color="#000000" face="Tahoma" size="3"> /* USER CODE END SubghzApp_Init_1 */</font>+ n) ?* F a% s( t, x2 r: V
- - @8 ~3 ^3 M! H+ J [9 R
- <font color="#000000" face="Tahoma" size="3"> /* Radio initialization */</font>: q" f( L) a, B2 w& E9 l% g
- <font color="#000000" face="Tahoma" size="3"> RadioEvents.TxDone = OnTxDone;</font>
; P1 m, o. {7 X7 P- R$ m+ E - <font color="#000000" face="Tahoma" size="3"> RadioEvents.RxDone = OnRxDone;</font>& b% Z7 z/ a# ^: U$ q' q S
- <font color="#000000" face="Tahoma" size="3"> RadioEvents.TxTimeout = OnTxTimeout;</font>$ q- m1 T/ ^$ Y' D
- <font color="#000000" face="Tahoma" size="3"> RadioEvents.RxTimeout = OnRxTimeout;</font>
- d! P) e" m* ^5 M& e; h - <font color="#000000" face="Tahoma" size="3"> RadioEvents.RxError = OnRxError;</font>
, A6 y3 s. V; K0 M - 4 I; E0 W. V# f* Y3 g4 ~
- <font color="#000000" face="Tahoma" size="3"> Radio.Init(&RadioEvents);</font>, a2 M1 X, z% P: A2 H. u
- 0 R ]/ n+ z ?
- <font color="#000000" face="Tahoma" size="3"> /* USER CODE BEGIN SubghzApp_Init_2 */</font>+ l7 V3 U' C0 m, {
- <font color="#000000" face="Tahoma" size="3">/*calculate random delay for synchronization*/</font>
6 y b( k$ ?! K. o0 q' J# m - <font color="#000000" face="Tahoma" size="3"> random_delay = (Radio.Random()) >> 22; /*10bits random e.g. from 0 to 1023 ms*/</font>
* g" |0 z" E, Q. @6 L. v3 _. {
4 u+ d, O5 n1 | `* W8 ~8 G- <font color="#000000" face="Tahoma" size="3"> /* Radio Set frequency */</font>* s7 T a( ^6 V. `1 N" x/ w- Q E
- <font color="#000000" face="Tahoma" size="3"> Radio.SetChannel(RF_FREQUENCY);</font>
. a6 p# U2 S1 P' u& Z
. c5 s* C7 _0 N3 w% `5 s- <font color="#000000" face="Tahoma" size="3"> /* Radio configuration */</font>$ T( h. I j4 x2 G
- <font color="#000000" face="Tahoma" size="3">#if ((USE_MODEM_LORA == 1) && (USE_MODEM_FSK == 0))</font>' ?, S: S6 }3 m2 V: M3 a3 m
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_M, "---------------\n\r");</font>0 g( h8 y" ^; m5 a- C9 b
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_M, "LORA_MODULATION\n\r");</font>6 @" \/ s9 |2 Z7 ^
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_M, "LORA_BW=%d kHz\n\r", (1 << LORA_BANDWIDTH) * 125);</font>
, ~9 |8 s- |% q0 {8 Z - <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_M, "LORA_SF=%d\n\r", LORA_SPREADING_FACTOR);</font>: ^& T0 x; y3 Q! d% X n
- $ }6 T A% |0 _( ^
- <font color="#000000" face="Tahoma" size="3"> Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,</font>
- H8 d' o" f2 I) k - <font color="#000000" face="Tahoma" size="3"> LORA_SPREADING_FACTOR, LORA_CODINGRATE,</font>
, ]% k2 \5 Q1 j- \9 G& M - <font color="#000000" face="Tahoma" size="3"> LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,</font>
1 D$ Y" r: e7 E; y$ @% u" a% X - <font color="#000000" face="Tahoma" size="3"> true, 0, 0, LORA_IQ_INVERSION_ON, TX_TIMEOUT_VALUE);</font>
u0 U$ Y- T$ c8 M+ o - + L, I/ f2 F3 T% g; V4 X3 [; B
- <font color="#000000" face="Tahoma" size="3"> Radio.SetRxConfig(MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,</font>
+ J0 s3 V6 u+ j9 L7 T5 X `9 [ - <font color="#000000" face="Tahoma" size="3"> LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,</font>% F: M: P" q3 B2 \ e/ T
- <font color="#000000" face="Tahoma" size="3"> LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON,</font>3 x) t3 K8 B' n8 F- x
- <font color="#000000" face="Tahoma" size="3"> 0, true, 0, 0, LORA_IQ_INVERSION_ON, true);</font>, V' [" e8 ]+ N5 ]0 S
. z; ?5 X0 Y, g! D- <font color="#000000" face="Tahoma" size="3"> Radio.SetMaxPayloadLength(MODEM_LORA, MAX_APP_BUFFER_SIZE);</font>$ t4 T7 a7 d# M% v0 a# `
7 K9 R! ?5 @+ z. n9 C1 T; p% A- <font color="#000000" face="Tahoma" size="3">#elif ((USE_MODEM_LORA == 0) && (USE_MODEM_FSK == 1))</font>( m$ N, ` R! F9 B2 _- m0 [( E9 f
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_M, "---------------\n\r");</font>
8 }3 `1 r: M: W% Z/ }3 O7 K* L - <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_M, "FSK_MODULATION\n\r");</font> N8 ~4 W- R, A7 [
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_M, "FSK_BW=%d Hz\n\r", FSK_BANDWIDTH);</font>
" v9 I! j! ?4 z- O - <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_M, "FSK_DR=%d bits/s\n\r", FSK_DATARATE);</font>
. \) Z4 s F6 ]4 _3 e5 Z - ! h' W1 v: V4 X4 K0 {$ h
- <font color="#000000" face="Tahoma" size="3"> Radio.SetTxConfig(MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,</font>
2 Y. J/ y9 E5 V$ i - <font color="#000000" face="Tahoma" size="3"> FSK_DATARATE, 0,</font>1 z( _" E F# e$ ~% i# t
- <font color="#000000" face="Tahoma" size="3"> FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,</font>: S5 J, ^) L1 h3 H
- <font color="#000000" face="Tahoma" size="3"> true, 0, 0, 0, TX_TIMEOUT_VALUE);</font>
; s8 D. H J4 `$ k p
+ Z0 x* X, B, i) K3 s8 [4 q, p- U- <font color="#000000" face="Tahoma" size="3"> Radio.SetRxConfig(MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,</font>! i% Q: X/ b+ W. P4 b; l
- <font color="#000000" face="Tahoma" size="3"> 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,</font>" o& W9 r& y* E: x1 F: T. _$ \
- <font color="#000000" face="Tahoma" size="3"> 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, true,</font>* h( Y. Z; j: i9 Y& p
- <font color="#000000" face="Tahoma" size="3"> 0, 0, false, true);</font>
P8 Z+ m( x6 U
8 F7 c" A" k! F1 |8 r4 R' C! E- <font color="#000000" face="Tahoma" size="3"> Radio.SetMaxPayloadLength(MODEM_FSK, MAX_APP_BUFFER_SIZE);</font>
3 ?. P z: l: z* | Q
" C7 Y# j h, @) q+ _- <font color="#000000" face="Tahoma" size="3">#else</font>2 R$ K4 [. ?3 u$ S
- <font color="#000000" face="Tahoma" size="3">#error "Please define a modulation in the subghz_phy_app.h file."</font>
2 Z( o" W: h! N9 S$ x( y - <font color="#000000" face="Tahoma" size="3">#endif /* USE_MODEM_LORA | USE_MODEM_FSK */</font>
# }& O o; r2 J. M1 F - 3 R& t2 M+ h! A/ t
- <font color="#000000" face="Tahoma" size="3"> /*fills tx buffer*/</font>- N3 y3 A0 F5 g; D# h3 T+ D9 c
- <font color="#000000" face="Tahoma" size="3"> memset(BufferTx, 0x0, MAX_APP_BUFFER_SIZE);</font>! b7 D/ f+ ~& A4 n1 \+ Z1 P4 N5 y, N' W
) y+ p- F2 X# g, s8 k0 K% ^- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "rand=%d\n\r", random_delay);</font>
7 Z P$ a- m; z - <font color="#000000" face="Tahoma" size="3"> /*starts reception*/</font>
7 f( M- D+ D) J$ S5 Q0 ]6 i - <font color="#000000" face="Tahoma" size="3"> Radio.Rx(RX_TIMEOUT_VALUE + random_delay);</font>8 H8 q+ |: k% l6 k: t; v
- : U: r8 \$ O, u/ s0 x- E0 D
- <font color="#000000" face="Tahoma" size="3"> /*register task to to be run in while(1) after Radio IT*/</font>
+ U; R5 X, R( a3 [# W9 z# T - <font color="#000000" face="Tahoma" size="3"> UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), UTIL_SEQ_RFU, PingPong_Process);</font>
0 K" V2 A* g# B% A1 P, [ - <font color="#000000" face="Tahoma" size="3"> /* USER CODE END SubghzApp_Init_2 */</font>0 q, l& Y9 {0 _5 e. X- N/ [
- <font color="#000000" face="Tahoma" size="3">}</font>' P& I8 F P' r8 n
% P0 S; l- p/ v4 P! @8 {" D/ {- <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN EF */</font>
2 {( |& f0 x2 t
8 i7 }) x& F4 t- t5 _5 A- <font color="#000000" face="Tahoma" size="3">/* USER CODE END EF */</font>6 M6 q6 O8 ? d7 @, s( C5 c
- 4 p! Y+ f6 i) i; f0 k1 E! F
- <font color="#000000" face="Tahoma" size="3">/* Private functions ---------------------------------------------------------*/</font>
- k6 \+ r: z/ M8 c7 f! E+ l - <font color="#000000" face="Tahoma" size="3">static void OnTxDone(void)</font>
; F7 Q& N: {* e8 P+ b4 i - <font color="#000000" face="Tahoma" size="3">{</font>) Z# ?* y8 y7 Q2 R# W
- <font color="#000000" face="Tahoma" size="3"> /* USER CODE BEGIN OnTxDone */</font>- | v0 l; d6 q( `( y
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "OnTxDone\n\r");</font>% C% b% m! n: O/ y) Y
- <font color="#000000" face="Tahoma" size="3"> /* Update the State of the FSM*/</font>0 _1 u: a2 d: q- \8 L$ {! c5 ^
- <font color="#000000" face="Tahoma" size="3"> State = TX;</font>% F% \: M/ L. P6 O! W0 j
- <font color="#000000" face="Tahoma" size="3"> /* Run PingPong process in background*/</font>
- j: o# e/ R P# B - <font color="#000000" face="Tahoma" size="3"> UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>
3 `+ y- K; J2 x' v* t: W$ q - <font color="#000000" face="Tahoma" size="3"> /* USER CODE END OnTxDone */</font>4 L* \& l+ c! |0 i- ~$ S; h
- <font color="#000000" face="Tahoma" size="3">}</font> F' A# w* F% R& O O
( S# d7 K+ L- k" M: u/ o- <font color="#000000" face="Tahoma" size="3">static void OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t LoraSnr_FskCfo)</font>
7 P7 D3 e2 T" e6 ?6 _) ~; {9 v - <font color="#000000" face="Tahoma" size="3">{</font>
1 l6 g- }9 ] s0 f% I& E - <font color="#000000" face="Tahoma" size="3"> /* USER CODE BEGIN OnRxDone */</font>! P5 h! R3 v! v! _: z, D" A
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "OnRxDone\n\r");</font>
. m. F2 V! M/ K" J/ r' W& s. F7 E5 V - <font color="#000000" face="Tahoma" size="3">#if ((USE_MODEM_LORA == 1) && (USE_MODEM_FSK == 0))</font>
, N* n: e* b6 z$ H: }# M - <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "RssiValue=%d dBm, SnrValue=%ddB\n\r", rssi, LoraSnr_FskCfo);</font>& m( ^ [- i0 T1 N3 x9 a
- <font color="#000000" face="Tahoma" size="3"> /* Record payload Signal to noise ratio in Lora*/</font>
3 J& i+ a+ P4 a3 y, M - <font color="#000000" face="Tahoma" size="3"> SnrValue = LoraSnr_FskCfo;</font>9 B }( |% l1 v0 M# k# e6 e* [
- <font color="#000000" face="Tahoma" size="3">#endif /* USE_MODEM_LORA | USE_MODEM_FSK */</font>0 D }1 ^ q2 ]7 B v
- <font color="#000000" face="Tahoma" size="3">#if ((USE_MODEM_LORA == 0) && (USE_MODEM_FSK == 1))</font>
# D- s/ |* Z- j% C; T - <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "RssiValue=%d dBm, Cfo=%dkHz\n\r", rssi, LoraSnr_FskCfo);</font>" m6 B z. |2 n; j( n
- <font color="#000000" face="Tahoma" size="3"> SnrValue = 0; /*not applicable in GFSK*/</font>
) D* c( d u# k# ^ - <font color="#000000" face="Tahoma" size="3">#endif /* USE_MODEM_LORA | USE_MODEM_FSK */</font>! C5 G1 k/ @8 V$ i) h
- <font color="#000000" face="Tahoma" size="3"> /* Update the State of the FSM*/</font>3 h9 D! G6 V% A2 {6 ]6 o
- <font color="#000000" face="Tahoma" size="3"> State = RX;</font>: [. X: C3 [# G* G& D
- <font color="#000000" face="Tahoma" size="3"> /* Clear BufferRx*/</font>. S0 L2 q/ S* l
- <font color="#000000" face="Tahoma" size="3"> memset(BufferRx, 0, MAX_APP_BUFFER_SIZE);</font>
% w1 `6 t0 {2 A# Z0 n( Z - <font color="#000000" face="Tahoma" size="3"> /* Record payload size*/</font>! L' v- l: S( f& _5 y
- <font color="#000000" face="Tahoma" size="3"> RxBufferSize = size;</font>
w6 @8 p5 l: I# A) n2 R- G - <font color="#000000" face="Tahoma" size="3"> if (RxBufferSize <= MAX_APP_BUFFER_SIZE)</font>
. x5 k6 w& i8 i7 V9 {+ H - <font color="#000000" face="Tahoma" size="3"> {</font>
5 x4 \- }9 R( A2 I7 p - <font color="#000000" face="Tahoma" size="3"> memcpy(BufferRx, payload, RxBufferSize);</font>7 N6 O: n9 N( t/ D; c( v7 c
- <font color="#000000" face="Tahoma" size="3"> }</font>9 J5 j. `* H8 {5 w
- <font color="#000000" face="Tahoma" size="3"> /* Record Received Signal Strength*/</font>1 i. `7 a+ t8 ^3 o% |
- <font color="#000000" face="Tahoma" size="3"> RssiValue = rssi;</font>
9 L; C6 @8 I4 M* i) j- n. C - <font color="#000000" face="Tahoma" size="3"> /* Record payload content*/</font>
" s$ K3 b$ o h( G! U# X - <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_H, "payload. size=%d \n\r", size);</font>5 A- ]9 j! ~) O4 B& _* L
- <font color="#000000" face="Tahoma" size="3"> for (int i = 0; i < PAYLOAD_LEN; i++)</font>5 O# m( c6 R! m2 h* o! w' `* b
- <font color="#000000" face="Tahoma" size="3"> {</font>: x7 f+ S1 _+ K+ |
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_H, "%02X", BufferRx);</font>
4 K$ z u; W) K5 ] - <font color="#000000" face="Tahoma" size="3"> if (i % 16 == 15)</font>
6 S( P8 E3 Z5 \# l - <font color="#000000" face="Tahoma" size="3"> {</font> ~. m, K( P" x) [6 B8 o
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_H, "\n\r");</font> r7 [/ c/ G* C* }
- <font color="#000000" face="Tahoma" size="3"> }</font>
; _/ \ ]& x8 i) M- a# X - <font color="#000000" face="Tahoma" size="3"> }</font>. z4 Q4 |- e5 T" R* |/ {$ G2 C
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_OFF, VLEVEL_H, "\n\r");</font>
% [6 |. k2 s9 g7 @) Z8 ? @; S - <font color="#000000" face="Tahoma" size="3"> /* Run PingPong process in background*/</font>
6 F1 k; j2 O8 z, [ - <font color="#000000" face="Tahoma" size="3"> UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>6 g5 |7 G0 V2 I. c
- <font color="#000000" face="Tahoma" size="3"> /* USER CODE END OnRxDone */</font>
' s c# E! E5 t8 Z" ^/ w - <font color="#000000" face="Tahoma" size="3">}</font>
4 [/ b( u% i6 D3 v% P4 b+ L - $ ~/ @6 X$ Q+ f1 J
- <font color="#000000" face="Tahoma" size="3">static void OnTxTimeout(void)</font>5 v- \; C, I! M9 j) D1 Y( H
- <font color="#000000" face="Tahoma" size="3">{</font>
0 l4 O L2 n7 y' E! K/ u5 n0 O - <font color="#000000" face="Tahoma" size="3"> /* USER CODE BEGIN OnTxTimeout */</font>& u7 ^6 P. H3 z, @& u
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "OnTxTimeout\n\r");</font>
# k5 u. A" S" j5 S" d% ? - <font color="#000000" face="Tahoma" size="3"> /* Update the State of the FSM*/</font>
" d+ @. J, O, L3 N( D0 G" [ - <font color="#000000" face="Tahoma" size="3"> State = TX_TIMEOUT;</font>
3 q6 N7 j! D, V7 Q6 E' F- a3 r- B* e - <font color="#000000" face="Tahoma" size="3"> /* Run PingPong process in background*/</font>
9 V4 r/ Y$ G: u% F% m - <font color="#000000" face="Tahoma" size="3"> UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>1 k3 w4 X5 r# B3 r/ Y& E
- <font color="#000000" face="Tahoma" size="3"> /* USER CODE END OnTxTimeout */</font>: S& J) c6 T6 H5 O2 n/ a5 U
- <font color="#000000" face="Tahoma" size="3">}</font>8 E5 j$ w5 w( C3 `5 g3 Q2 l# R
: o6 a8 S4 x/ ^- <font color="#000000" face="Tahoma" size="3">static void OnRxTimeout(void)</font>8 ^. ^% E' z7 K0 K9 e
- <font color="#000000" face="Tahoma" size="3">{</font>$ |5 @: I H* X7 }7 b; O
- <font color="#000000" face="Tahoma" size="3"> /* USER CODE BEGIN OnRxTimeout */</font>7 L: Z4 b0 O% a+ u7 u6 H
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "OnRxTimeout\n\r");</font>
5 B3 l: `- r& \* Y7 } - <font color="#000000" face="Tahoma" size="3"> /* Update the State of the FSM*/</font>( X2 d* ?' n( h
- <font color="#000000" face="Tahoma" size="3"> State = RX_TIMEOUT;</font>
# M( b* Y; K/ ^5 Z: l& }0 i! F - <font color="#000000" face="Tahoma" size="3"> /* Run PingPong process in background*/</font>
, a$ Q' A3 J$ Y$ E- f" x! O( p+ R - <font color="#000000" face="Tahoma" size="3"> UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>
z4 u. d/ D G2 K1 { - <font color="#000000" face="Tahoma" size="3"> /* USER CODE END OnRxTimeout */</font>/ ]- h, X* C! W, E1 I) H
- <font color="#000000" face="Tahoma" size="3">}</font>
) {" z5 |) i! E7 M2 ` - " i: w& t/ |4 r% l3 J; R+ P
- <font color="#000000" face="Tahoma" size="3">static void OnRxError(void)</font>/ i d$ }- @' O2 s; t6 ^
- <font color="#000000" face="Tahoma" size="3">{</font>4 W6 A# Q8 J: D9 p
- <font color="#000000" face="Tahoma" size="3"> /* USER CODE BEGIN OnRxError */</font>1 ^! m% ~/ u N+ @% P8 a2 I# O
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "OnRxError\n\r");</font>
( U0 d" z5 i) a5 c9 k - <font color="#000000" face="Tahoma" size="3"> /* Update the State of the FSM*/</font>
9 r* X7 W7 m- L- w - <font color="#000000" face="Tahoma" size="3"> State = RX_ERROR;</font>
9 O7 ?+ x: S5 K: \6 k* S - <font color="#000000" face="Tahoma" size="3"> /* Run PingPong process in background*/</font>
5 `& c* K; Q" V; d6 b; o - <font color="#000000" face="Tahoma" size="3"> UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_SubGHz_Phy_App_Process), CFG_SEQ_Prio_0);</font>5 z+ j* ] y5 T" q# J
- <font color="#000000" face="Tahoma" size="3"> /* USER CODE END OnRxError */</font>) G4 I% e2 `* \. o, R
- <font color="#000000" face="Tahoma" size="3">}</font>1 L" s# A" \# G& z2 V) E
6 P. ^3 g2 Y& b5 T- s; S4 l- O- <font color="#000000" face="Tahoma" size="3">/* USER CODE BEGIN PrFD */</font>
C! s0 R) U+ w4 k/ `) H - <font color="#000000" face="Tahoma" size="3">static void PingPong_Process(void)</font>( e+ r5 i: z' ~5 `. W( o
- <font color="#000000" face="Tahoma" size="3">{</font>6 O: j6 ?2 R; X, ^
- <font color="#000000" face="Tahoma" size="3"> Radio.Sleep();</font>: @# C5 s# z" g+ m
+ ]- ?# z' b/ l" z! _- <font color="#000000" face="Tahoma" size="3"> switch (State)</font>3 S' v+ R$ R. d4 o& j
- <font color="#000000" face="Tahoma" size="3"> {</font>4 k- R' c( M0 C% n
- <font color="#000000" face="Tahoma" size="3"> case RX:</font>
$ n" M# Z6 c& C" |7 } - + C. G* e! u7 ^' E( i$ |
- <font color="#000000" face="Tahoma" size="3"> if (isMaster == true)</font># c9 {( T% }* R/ j
- <font color="#000000" face="Tahoma" size="3"> {</font>5 ?! C* o0 \' i7 n, o; \4 r- T
- <font color="#000000" face="Tahoma" size="3"> if (RxBufferSize > 0)</font>. U: F5 P# g5 C. o$ e+ K
- <font color="#000000" face="Tahoma" size="3"> {</font>0 s u) P M; G) s% e4 @! ?
- <font color="#000000" face="Tahoma" size="3"> if (strncmp((const char *)BufferRx, PONG, sizeof(PONG) - 1) == 0)</font>
' r2 x0 Y7 v# p# m0 w - <font color="#000000" face="Tahoma" size="3"> {</font>$ m3 }4 Y; |% S0 [
- <font color="#000000" face="Tahoma" size="3"> UTIL_TIMER_Stop(&timerLed);</font>2 o2 R9 j& E5 v# E& _
- <font color="#000000" face="Tahoma" size="3"> /* switch off green led */</font>; w0 X1 {+ o1 T& l3 [ Q
- <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET); /* LED_GREEN */</font>1 [/ s7 o1 [, L C" A H
- <font color="#000000" face="Tahoma" size="3"> /* master toggles red led */</font>
/ h" x9 Q% G0 Y4 B - <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); /* LED_RED */</font>
7 E1 n2 t1 S) J: l- W - <font color="#000000" face="Tahoma" size="3"> /* Add delay between RX and TX */</font>
9 Y& _4 a6 \# D( G! u0 M& f2 v - <font color="#000000" face="Tahoma" size="3"> HAL_Delay(Radio.GetWakeupTime() + RX_TIME_MARGIN);</font>, D4 _, Z9 M- O6 q' t8 F% h
- <font color="#000000" face="Tahoma" size="3"> /* master sends PING*/</font>
: i5 [. T/ l0 u& A* L% x1 c - <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "..."</font>
1 u6 p1 G$ Q- I) k& r5 m. _ - <font color="#000000" face="Tahoma" size="3"> "PING"</font>. @( k5 x; ?+ Y3 D- h. {2 S& \1 ^
- <font color="#000000" face="Tahoma" size="3"> "\n\r");</font>
% F4 W# H' E( z S: N; F0 D - <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "Master Tx start\n\r");</font>
9 F4 [: _& \& u* L, l - <font color="#000000" face="Tahoma" size="3"> memcpy(BufferTx, PING, sizeof(PING) - 1);</font>$ }; O) M2 \* \8 K: ^) \% W
- <font color="#000000" face="Tahoma" size="3"> Radio.Send(BufferTx, PAYLOAD_LEN);</font>( V: s) g0 S% r% Z! R. d6 e3 z; m% G
- <font color="#000000" face="Tahoma" size="3"> }</font>
7 E( \8 G+ D4 X/ d - <font color="#000000" face="Tahoma" size="3"> else if (strncmp((const char *)BufferRx, PING, sizeof(PING) - 1) == 0)</font>
9 b5 q- j, f0 `2 U4 w - <font color="#000000" face="Tahoma" size="3"> {</font>
3 W! w( B; S5 ?2 V1 V* J& m8 F% |4 b - <font color="#000000" face="Tahoma" size="3"> /* A master already exists then become a slave */</font>9 _2 R# a+ P% m0 @1 ~) k7 w& `. v$ |
- <font color="#000000" face="Tahoma" size="3"> isMaster = false;</font>' u/ ^- { u" I
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "Slave Rx start\n\r");</font>
: k, p' s$ k+ J5 x4 L4 y5 t - <font color="#000000" face="Tahoma" size="3"> Radio.Rx(RX_TIMEOUT_VALUE);</font>
+ l2 K4 Y# J, v" T* B3 F+ J0 U- R - <font color="#000000" face="Tahoma" size="3"> }</font>
$ D4 y3 n( @0 ]" k+ Y - <font color="#000000" face="Tahoma" size="3"> else /* valid reception but neither a PING or a PONG message */</font>
+ [' C, I* _# w3 A+ X% V* ?6 _# K% @ - <font color="#000000" face="Tahoma" size="3"> {</font>7 D& Q1 ?/ k2 M# D
- <font color="#000000" face="Tahoma" size="3"> /* Set device as master and start again */</font>/ C N. I1 l. R( j' g4 Y# T5 b- {
- <font color="#000000" face="Tahoma" size="3"> isMaster = true;</font>
5 n' _' l4 K& p6 v; q - <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "Master Rx start\n\r");</font>
# ^4 }( [' i8 ~3 M; u1 Z1 J - <font color="#000000" face="Tahoma" size="3"> Radio.Rx(RX_TIMEOUT_VALUE);</font>
: R2 F( {% B. |2 h+ R' i - <font color="#000000" face="Tahoma" size="3"> }</font>! G& C% L; {4 ?( I1 V
- <font color="#000000" face="Tahoma" size="3"> }</font>
% U8 D ^' c0 \# {( N' |* L - <font color="#000000" face="Tahoma" size="3"> }</font>
E% q1 K6 M. w; p8 f- Z# T' @ - <font color="#000000" face="Tahoma" size="3"> else</font>
3 C+ T( O9 R' a - <font color="#000000" face="Tahoma" size="3"> {</font>: h0 O. L; s5 G7 B6 X$ D
- <font color="#000000" face="Tahoma" size="3"> if (RxBufferSize > 0)</font>
1 Z! `& [9 @# R- x' D/ m - <font color="#000000" face="Tahoma" size="3"> {</font>
0 `$ }1 f, @! e# D - <font color="#000000" face="Tahoma" size="3"> if (strncmp((const char *)BufferRx, PING, sizeof(PING) - 1) == 0)</font>7 G5 _5 B" U: r4 j3 A4 O/ \$ B. {
- <font color="#000000" face="Tahoma" size="3"> {</font>7 k9 }. l2 @" \8 R1 U5 v C
- <font color="#000000" face="Tahoma" size="3"> UTIL_TIMER_Stop(&timerLed);</font>
& Z; O, a2 X# U, B) } - <font color="#000000" face="Tahoma" size="3"> /* switch off red led */</font>
' V# i% f; U% a- F0 y - <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET); /* LED_RED */</font>
. X( I" y9 O) ~6 c$ e' @ - <font color="#000000" face="Tahoma" size="3"> /* slave toggles green led */</font>! n$ n$ R' |/ b" u- h& O
- <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); /* LED_GREEN */</font>( t( o0 U/ n/ j; z( p9 u
- <font color="#000000" face="Tahoma" size="3"> /* Add delay between RX and TX */</font>1 i! ]" B" ^& o6 s" \8 T2 M
- <font color="#000000" face="Tahoma" size="3"> HAL_Delay(Radio.GetWakeupTime() + RX_TIME_MARGIN);</font>
& q4 O. o, B* H- j - <font color="#000000" face="Tahoma" size="3"> /*slave sends PONG*/</font>4 y; a. S; o8 j; P
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "..."</font>9 J% F* W9 D8 o8 W" q! o2 K
- <font color="#000000" face="Tahoma" size="3"> "PONG"</font>. a5 K2 q3 f0 ]% T) l h
- <font color="#000000" face="Tahoma" size="3"> "\n\r");</font>7 l; n9 m/ A) x' K# c! ^
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "Slave Tx start\n\r");</font>- k) w! u! I. Z" ^( Q/ g
- <font color="#000000" face="Tahoma" size="3"> memcpy(BufferTx, PONG, sizeof(PONG) - 1);</font>
4 J' L) S3 d2 _) b( { - <font color="#000000" face="Tahoma" size="3"> Radio.Send(BufferTx, PAYLOAD_LEN);</font>* Z( ^- |* ~- s0 }
- <font color="#000000" face="Tahoma" size="3"> }</font>- ^% \( T( I+ r* \
- <font color="#000000" face="Tahoma" size="3"> else /* valid reception but not a PING as expected */</font>6 r- `) ]4 k7 X+ ^/ r1 ^' k
- <font color="#000000" face="Tahoma" size="3"> {</font>
( S+ k* V- s4 T2 ^ - <font color="#000000" face="Tahoma" size="3"> /* Set device as master and start again */</font>
/ V# c t" D) e& M' y - <font color="#000000" face="Tahoma" size="3"> isMaster = true;</font>
7 P/ ~$ j, R& p9 N' a% V1 S: X - <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "Master Rx start\n\r");</font>
9 J! _6 a9 P. W. K0 A: U - <font color="#000000" face="Tahoma" size="3"> Radio.Rx(RX_TIMEOUT_VALUE);</font>
, a3 K4 H3 _/ g1 o - <font color="#000000" face="Tahoma" size="3"> }</font>
- H$ A, [* j, {" g0 i/ j8 ] - <font color="#000000" face="Tahoma" size="3"> }</font>
5 U, R+ j; ^0 W) t - <font color="#000000" face="Tahoma" size="3"> }</font>6 N8 V# r% b7 P& ?
- <font color="#000000" face="Tahoma" size="3"> break;</font>
1 Y. d* s) t" j: z' c - <font color="#000000" face="Tahoma" size="3"> case TX:</font>
3 v% w7 v/ C" o! L; Z - <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "Rx start\n\r");</font>1 ^$ |/ c/ M9 {9 W# E X+ x3 f
- <font color="#000000" face="Tahoma" size="3"> Radio.Rx(RX_TIMEOUT_VALUE);</font>1 ~5 n% i! V. v7 s# V$ O7 w. c. G
- <font color="#000000" face="Tahoma" size="3"> break;</font>
" \* F3 R9 K7 e/ m1 J - <font color="#000000" face="Tahoma" size="3"> case RX_TIMEOUT:</font>5 `5 k0 f: W. d0 u
- <font color="#000000" face="Tahoma" size="3"> case RX_ERROR:</font>0 y1 ~8 c! s; e9 n# }7 n9 _
- <font color="#000000" face="Tahoma" size="3"> if (isMaster == true)</font>
5 C9 |6 C3 n# V8 h1 K) r - <font color="#000000" face="Tahoma" size="3"> {</font>
7 L) o ]: ?% @' [5 H - <font color="#000000" face="Tahoma" size="3"> /* Send the next PING frame */</font># f% K/ X; x# C; _& X) V- g" B
- <font color="#000000" face="Tahoma" size="3"> /* Add delay between RX and TX*/</font>
$ H" F0 y5 p5 v, A1 _! l - <font color="#000000" face="Tahoma" size="3"> /* add random_delay to force sync between boards after some trials*/</font>
! x% F4 H: X: A9 @5 I/ W: z - <font color="#000000" face="Tahoma" size="3"> HAL_Delay(Radio.GetWakeupTime() + RX_TIME_MARGIN + random_delay);</font>! j' f6 r" v: a7 B0 A$ ^ Q! F4 P& r L
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "Master Tx start\n\r");</font>
, L& N) `: z6 z - <font color="#000000" face="Tahoma" size="3"> /* master sends PING*/</font>
1 R9 U* a ^( \8 R" v8 E - <font color="#000000" face="Tahoma" size="3"> memcpy(BufferTx, PING, sizeof(PING) - 1);</font>
, @/ s. l* u3 |% G$ e0 b - <font color="#000000" face="Tahoma" size="3"> Radio.Send(BufferTx, PAYLOAD_LEN);</font>, F: ?# \/ W, H3 x' r
- <font color="#000000" face="Tahoma" size="3"> }</font>
/ h( ?. d6 S& ?9 ]) b/ L6 b5 x, n - <font color="#000000" face="Tahoma" size="3"> else</font>
+ V8 B/ U- e1 q# m7 z, L - <font color="#000000" face="Tahoma" size="3"> {</font>9 n+ ]/ F( n* L" g2 B0 u' X" W: p
- <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "Slave Rx start\n\r");</font>
3 T* Y# x, C+ b; n B - <font color="#000000" face="Tahoma" size="3"> Radio.Rx(RX_TIMEOUT_VALUE);</font>+ x" j* v1 x3 g
- <font color="#000000" face="Tahoma" size="3"> }</font>
3 u2 r0 S3 c2 l2 ~1 M$ R+ b - <font color="#000000" face="Tahoma" size="3"> break;</font>
- E# U9 A1 u3 ^' u4 k; A2 H5 } - <font color="#000000" face="Tahoma" size="3"> case TX_TIMEOUT:</font>
& }+ g0 y, d* x0 R" X+ O - <font color="#000000" face="Tahoma" size="3"> APP_LOG(TS_ON, VLEVEL_L, "Slave Rx start\n\r");</font>
% R# |- l0 M) K1 v7 L2 K$ B - <font color="#000000" face="Tahoma" size="3"> Radio.Rx(RX_TIMEOUT_VALUE);</font> M( y" }' o4 c* c; P
- <font color="#000000" face="Tahoma" size="3"> break;</font>. w+ z* ~: |1 Z2 h( T3 L
- <font color="#000000" face="Tahoma" size="3"> default:</font>; ]. w! o8 d* O! v S" d: `
- <font color="#000000" face="Tahoma" size="3"> break;</font>/ r- Y. B& T/ T0 {) t
- <font color="#000000" face="Tahoma" size="3"> }</font>
. e, [% l0 a. @ - <font color="#000000" face="Tahoma" size="3">}</font>
7 O" R4 s7 k; l7 e
+ {/ \3 \% @% w! t, h$ x0 S- <font color="#000000" face="Tahoma" size="3">static void OnledEvent(void *context)</font>
" h6 p& m' G% C7 X! j- }8 r - <font color="#000000" face="Tahoma" size="3">{</font>
( x& \2 J: t7 x4 a8 w, O - <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); /* LED_GREEN */</font>
$ E9 Q O, R5 C( x - <font color="#000000" face="Tahoma" size="3"> HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); /* LED_RED */</font>9 _5 A/ H$ x7 ^( W: z) J# C
- <font color="#000000" face="Tahoma" size="3"> UTIL_TIMER_Start(&timerLed);</font>
$ B8 A/ V D8 b k - <font color="#000000" face="Tahoma" size="3">}</font>% {& C' r' D& c; G$ W! @) `, [' a
- <font color="#000000" face="Tahoma" size="3">/* USER CODE END PrFD */</font>
复制代码 2 D6 s2 {3 t! Z% B) p1 l) ?0 r
三、下载测试2 H1 |, w3 H* r. A3 A; q$ }
最后烧录下载后,正常pingpong通信/ x# }. q/ p3 ` `- u* Y5 M4 m- r
+ H0 G9 Z) ]4 |: `5 @" | X" p, I————————————————
& D2 T& q, X# T: t* x& o版权声明:北世安 g1 I6 ^' `% g" d- P
: p M5 |9 c2 S u5 p& x
! I- {! C8 `6 r8 f* l7 _
|