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