Compare commits
27 Commits
雅下第一批设备发货版本
...
develop
| Author | SHA1 | Date | |
|---|---|---|---|
| 626f33a15e | |||
| 89c2352a68 | |||
| fe4b9fabf8 | |||
| a6c8cd8a71 | |||
| 68a5a185fc | |||
| 8bcc2c41d0 | |||
| ce1611dedc | |||
| a4c33daa89 | |||
| 4cf73b5a0f | |||
| f07b59163a | |||
| 988bc99631 | |||
| 974df2bcbc | |||
| 5b4b352244 | |||
| 2f11f04c84 | |||
| 5ec1a18632 | |||
| 434e63287e | |||
| 706421d387 | |||
| de3b026b34 | |||
| 92937f36d2 | |||
| 31f6f4af9a | |||
| f40c422684 | |||
| d08ca726df | |||
| 26e48126c8 | |||
| aca260ba54 | |||
| 4e45de919c | |||
| 38b9663320 | |||
| 95a0ecda5b |
-12
@@ -1,12 +0,0 @@
|
||||
[submodule "Project/GateWay/source/Module/sx127x"]
|
||||
path = Project/GateWay/source/Module/sx127x
|
||||
url = http://192.168.2.47:8418/YuanHongbin/sx127x.git
|
||||
[submodule "Project/GateWay/source/Module/FatFS"]
|
||||
path = Project/GateWay/source/Module/FatFS
|
||||
url = http://192.168.2.47:8418/YuanHongbin/FatFS.git
|
||||
[submodule "Project/GateWay/source/Module/SDCard"]
|
||||
path = Project/GateWay/source/Module/SDCard
|
||||
url = http://192.168.2.47:8418/YuanHongbin/SDCard.git
|
||||
[submodule "Project/GateWay/source/Module/GateWay_Debug"]
|
||||
path = Project/GateWay/source/Module/GateWay_Debug
|
||||
url = http://192.168.2.47:8418/YuanHongbin/GateWay_Debug.git
|
||||
|
||||
@@ -0,0 +1,294 @@
|
||||
$PACKAGES
|
||||
bq25306rter ! bq25306rter ! '{Value}' ; U26
|
||||
c0402m ! c0402m ! 100nF ; C9 C28 C39
|
||||
c0402m ! c0402m ! 100pF ; C11 C40 C41
|
||||
c0402m ! c0402m ! 10nF ; C10
|
||||
c0402m ! c0402m ! 33pF ; C31 C32 C33 C34
|
||||
C0603 ! C0603 ! '2.2uF' ; C58 C59 C68
|
||||
C0603 ! C0603 ! '4.7uF' ; C65
|
||||
C0603 ! C0603 ! 100nF ; C5 C13 C15 C21 C23 C25 C29 C36 C38 C44 C46 C48 C50 C52 ,
|
||||
C53 C54 C56 C60 C63 C64 C66 C70 C72 C76 C78 C79 C80 C83 C84 C85 C86 ,
|
||||
C88 C89 C92 C95 C97
|
||||
C0603 ! C0603 ! 10uF ; C30 C55 C57 C62
|
||||
C0603 ! C0603 ! 15pF ; C73 C77
|
||||
C0603 ! C0603 ! 1uF ; C69 C71 C75
|
||||
C0603 ! C0603 ! 22pF ; C67 C74 C81 C82
|
||||
C0603 ! C0603 ! 22uF ; C61
|
||||
C0603 ! C0603 ! 470pF ; C93
|
||||
C0603 ! C0603 ! 47nF ; C94
|
||||
C0805 ! C0805 ! '2.2uF' ; C90
|
||||
C0805 ! C0805 ! 10nF ; C27
|
||||
C0805 ! C0805 ! 22uF ; C8 C12 C14 C22 C24 C37 C45 C47 C49 C51 C91 C98
|
||||
C1206 ! C1206 ! 22uF ; C35 C96
|
||||
CAP-SMD_BD6.3-L6.6-W6.6-FD ! CAP-SMD_BD6.3-L6.6-W6.6-FD ! 470uF ; C6 C7
|
||||
CAP-SMD_BD6.3-L6.6-W6.6-LS7.3-FD ! CAP-SMD_BD6.3-L6.6-W6.6-LS7.3-FD ! 220uF ; ,
|
||||
C26
|
||||
CONN-TH_2P-P2.50_HX25003-2A ! CONN-TH_2P-P2.50_HX25003-2A ! '{Value}' ; CN3
|
||||
CONN-TH_2P-P3.81_L7.4-W7.6 ! CONN-TH_2P-P3.81_L7.4-W7.6 ! '{Value}' ; U2 U11 ,
|
||||
U13 U14 U17
|
||||
,
|
||||
CONN-TH_7P-P1.25_HCTL_HC-1.25-7A ! CONN-TH_7P-P1.25_HCTL_HC-1.25-7A ! '{Value}' ,
|
||||
; CN2
|
||||
CRYSTAL-SMD_4P-L3.2-W2.5-BL-2 ! CRYSTAL-SMD_4P-L3.2-W2.5-BL-2 ! '{Value}' ; ,
|
||||
U23
|
||||
E32-400M30S ! E32-400M30S ! '{Value}' ; U15
|
||||
,
|
||||
ESOP-8_L4.9-W3.9-P1.27-LS6.0-TL-EP ! ESOP-8_L4.9-W3.9-P1.27-LS6.0-TL-EP ! '{Value}' ,
|
||||
; U6
|
||||
FC-135R_L3.2-W1.5 ! FC-135R_L3.2-W1.5 ! '32.768kHz' ; X1
|
||||
HDR-TH_2P-P2.54-V-M ! HDR-TH_2P-P2.54-V-M ! '{Value}' ; H3
|
||||
HDR-TH_3P-P2.54-V-M ! HDR-TH_3P-P2.54-V-M ! '{Value}' ; H4 H5
|
||||
IND-SMD_L4.8-W4.5 ! IND-SMD_L4.8-W4.5 ! '2.2uH' ; L7
|
||||
IND-SMD_L7.0-W6.6_FXL0630 ! IND-SMD_L7.0-W6.6_FXL0630 ! 15uH ; L4 L5
|
||||
IPEX-SMD_BWIPX-1-001E ! IPEX-SMD_BWIPX-1-001E ! '{Value}' ; RF1
|
||||
L0603 ! L0603 ! '{Value}' ; L6
|
||||
L2520 ! L2520 ! '{Value}' ; L1 L3
|
||||
LED0603-FD_BLUE ! LED0603-FD_BLUE ! '{Value}' ; LORA
|
||||
LED0603-RD ! LED0603-RD ! '{Value}' ; 充电 LAN LED3
|
||||
LED0603-RD-YELLOW ! LED0603-RD-YELLOW ! '{Value}' ; 4G
|
||||
,
|
||||
LQFP-64_L10.0-W10.0-P0.50-LS12.0-BL ! LQFP-64_L10.0-W10.0-P0.50-LS12.0-BL ! '{Value}' ,
|
||||
; U22
|
||||
NANO-SIM-SMD_SMN-305-ARP7 ! NANO-SIM-SMD_SMN-305-ARP7 ! '{Value}' ; CARD1
|
||||
NT26E ! NT26E ! '{Value}' ; U19
|
||||
OSC-SMD_4P-L3.2-W2.5-BL ! OSC-SMD_4P-L3.2-W2.5-BL ! 16MHz ; X2
|
||||
,
|
||||
QFN-48_L5.0-W5.0-P0.35-EP3.7_UC8288 ! QFN-48_L5.0-W5.0-P0.35-EP3.7_UC8288 ! '{Value}' ,
|
||||
; U20
|
||||
R0402 ! R0402 ! '100kΩ' ; R25 R33 R34
|
||||
R0402 ! R0402 ! '10kΩ' ; R8 R14 R26 R29 R30 R31 R32 R35
|
||||
R0402 ! R0402 ! '1kΩ' ; R12
|
||||
R0402 ! R0402 ! '22Ω' ; R16 R18 R19
|
||||
R0603 ! R0603 ! '100kΩ' ; R11 R71 R74
|
||||
R0603 ! R0603 ! '100Ω' ; R42
|
||||
R0603 ! R0603 ! '10kΩ' ; R10 R37 R39 R40 R41 R45 R48 R49 R50 R51 R52 R53 R80 ,
|
||||
R81
|
||||
R0603 ! R0603 ! '120kΩ' ; R57
|
||||
R0603 ! R0603 ! '120Ω' ; R64 R65
|
||||
R0603 ! R0603 ! '12kΩ' ; R7 R15
|
||||
R0603 ! R0603 ! '169kΩ' ; R27 R28
|
||||
R0603 ! R0603 ! '1kΩ' ; R13 R54 R55 R70 R75 R78 R79
|
||||
R0603 ! R0603 ! '1MΩ' ; R83
|
||||
R0603 ! R0603 ! '2.7kΩ' ; R58 R59
|
||||
R0603 ! R0603 ! '200kΩ' ; R56 R82
|
||||
R0603 ! R0603 ! '24kΩ' ; R36
|
||||
R0603 ! R0603 ! '3.24kΩ' ; R21
|
||||
R0603 ! R0603 ! '3.3kΩ' ; R76 R77
|
||||
R0603 ! R0603 ! '30kΩ' ; R85
|
||||
R0603 ! R0603 ! '330kΩ' ; R84
|
||||
R0603 ! R0603 ! '4.7kΩ' ; R46 R47
|
||||
R0603 ! R0603 ! '64kΩ' ; R23 R24
|
||||
R0805 ! R0805 ! '10kΩ' ; R17 R22
|
||||
R0805 ! R0805 ! '1kΩ' ; R38
|
||||
R0805 ! R0805 ! '20kΩ' ; R20
|
||||
RJ45-TH_HR915310A ! RJ45-TH_HR915310A ! '{Value}' ; D7
|
||||
,
|
||||
SC-70-6_L2.2-W1.3-P0.65-LS2.1-BL ! SC-70-6_L2.2-W1.3-P0.65-LS2.1-BL ! '{Value}' ,
|
||||
; U24 U25
|
||||
SMA_L4.3-W2.6-LS5.1-RD ! SMA_L4.3-W2.6-LS5.1-RD ! '{Value}' ; D3 D4
|
||||
SOD-106_L2.0-W1.3-RD ! SOD-106_L2.0-W1.3-RD ! '{Value}' ; D9
|
||||
SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL ! SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL ! '{Value}' ,
|
||||
; U12 U16
|
||||
SOIC-8_L5.3-W5.3-P1.27-LS8.0-BL ! SOIC-8_L5.3-W5.3-P1.27-LS8.0-BL ! '{Value}' ,
|
||||
; U21
|
||||
,
|
||||
SOT-223-3_L6.5-W3.4-P2.30-LS7.0-BR ! SOT-223-3_L6.5-W3.4-P2.30-LS7.0-BR ! '{Value}' ,
|
||||
; U10
|
||||
SOT-23 ! SOT-23 ! '{Value}' ; D5 D6
|
||||
SOT-23_L2.9-W1.3-P1.90-LS2.4-BR ! SOT-23_L2.9-W1.3-P1.90-LS2.4-BR ! '{Value}' ,
|
||||
; Q14 Q15 Q16 Q18
|
||||
,
|
||||
SOT-23-3_L2.9-W1.6-P1.90-LS2.8-BR ! SOT-23-3_L2.9-W1.6-P1.90-LS2.8-BR ! '{Value}' ,
|
||||
; Q19
|
||||
,
|
||||
SOT-23-3_L3.0-W1.7-P0.95-LS2.9-BR ! SOT-23-3_L3.0-W1.7-P0.95-LS2.9-BR ! '{Value}' ,
|
||||
; Q11
|
||||
sot-23-3p ! sot-23-3p ! '{Value}' ; Q5 Q6 Q7 Q8 Q9 Q10
|
||||
,
|
||||
SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BL ! SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BL ! '{Value}' ,
|
||||
; U3 U4
|
||||
,
|
||||
SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BR ! SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BR ! '{Value}' ,
|
||||
; U9
|
||||
,
|
||||
SOT-363_L2.0-W1.3-P0.65-LS2.1-BR ! SOT-363_L2.0-W1.3-P0.65-LS2.1-BR ! '{Value}' ,
|
||||
; D2
|
||||
SOT323-6L_L2.0-W1.3-LS2.1-BL ! SOT323-6L_L2.0-W1.3-LS2.1-BL ! '{Value}' ; U18
|
||||
TF-SMD_XKTF-1307-18 ! TF-SMD_XKTF-1307-18 ! '{Value}' ; CARD2
|
||||
,
|
||||
TO-263-5_L10.2-W9.9-P1.70-LS14.4-TL ! TO-263-5_L10.2-W9.9-P1.70-LS14.4-TL ! '{Value}' ,
|
||||
; U5
|
||||
$A_PROPERTIES
|
||||
$NETS
|
||||
'$1N14156' ; R20.1 R22.1 U5.5
|
||||
'$1N15120' ; C5.2 L1.1 U3.6
|
||||
'$1N15124' ; C5.1 U3.1
|
||||
'$1N156708' ; R59.2 U22.56
|
||||
'$1N156972' ; R58.2 U22.55
|
||||
'$1N157215' ; 4G.2 R59.1
|
||||
'$1N157217' ; LORA.2 R58.1
|
||||
'$1N219298' ; Q14.1 R77.2
|
||||
'$1N219301' ; Q15.1 R76.2
|
||||
'$1N219302' ; Q15.2 Q16.3
|
||||
'$1N219303' ; Q19.3 R11.2 R78.1
|
||||
'$1N219304' ; D9.1 R10.1 R79.1
|
||||
'$1N219315' ; Q18.1 R78.2
|
||||
'$1N219321' ; 充电.1 R13.1
|
||||
'$1N219322' ; R80.2 R81.2 U26.7
|
||||
'$1N219324' ; R82.2 U26.8
|
||||
'$1N219325' ; C93.1 R82.1 R84.2 U26.9
|
||||
'$1N219326' ; R83.1 R84.1
|
||||
'$1N219329' ; C94.1 L7.1 U26.13 U26.14
|
||||
'$1N219330' ; C93.2 C95.2 C96.2 CN3.1 L7.2 Q15.3 R83.2 U26.10
|
||||
'$1N219335' ; 充电.2 C90.2 R80.1 U26.2
|
||||
'$1N219388' ; Q14.3 U14.2
|
||||
'$1N219660' ; Q19.1 R10.2
|
||||
'$1N219673' ; C89.2 Q14.2 Q18.2 Q19.2 R79.2
|
||||
'$1N219967' ; H3.2 R70.2 R71.2 U24.6 U25.6
|
||||
'$1N220294' ; C91.2 C92.2 Q18.3 R75.1 U26.1
|
||||
'$1N220337' ; Q16.1 R74.2 R75.2
|
||||
'$1N220644' ; H4.2 R7.2 U3.3
|
||||
'$1N220659' ; H4.1 R23.1
|
||||
'$1N220661' ; H4.3 R27.2
|
||||
'$1N220812' ; H5.1 R24.2
|
||||
'$1N220814' ; H5.3 R28.2
|
||||
'$1N220820' ; H5.2 R15.2 U4.3
|
||||
'$1N232424' ; R13.2 U26.3
|
||||
'$1N232426' ; C94.2 U26.15
|
||||
'$1N232428' ; R85.2 U26.4
|
||||
'$1N25321' ; C27.1 U6.1
|
||||
'$1N25347' ; C27.2 D3.1 L4.1 U6.8
|
||||
'$1N25981' ; R17.1 R21.2 U6.4
|
||||
'$1N27457' ; C21.1 U4.1
|
||||
'$1N27465' ; C21.2 L3.1 U4.6
|
||||
'$1N27856' ; D4.2 L5.2 U9.1
|
||||
'$1N27899' ; R36.1 R38.2 U9.3
|
||||
'$1N35056' ; Q7.1 R32.1 R33.2
|
||||
'$1N35060' ; Q7.3 U19.20
|
||||
'$1N35062' ; R18.2 U19.12
|
||||
'$1N35065' ; R19.2 U19.13
|
||||
'$1N35068' ; R16.2 U19.11
|
||||
'$1N35087' ; LED3.1 Q5.3
|
||||
'$1N35088' ; Q5.1 R8.1
|
||||
'$1N35089' ; LED3.2 R12.2
|
||||
'$1N35110' ; Q6.1 R25.2 R26.1
|
||||
'$1N35118' ; Q10.1 R34.2 R35.1
|
||||
'$1N35136' ; C41.2 Q9.1 R30.2
|
||||
'$1N35141' ; C40.1 Q8.1 R29.1
|
||||
'$1N36133' ; LAN.2 U20.21
|
||||
'$1N36222' ; C68.2 U20.33
|
||||
'$1N36366' ; C58.1 L6.1 U20.1 U20.2
|
||||
'$1N36373' ; C66.2 L6.2 U20.35
|
||||
'$1N36810' ; C67.2 U20.32 U23.3
|
||||
'$1N36815' ; C74.2 U20.31 U23.1
|
||||
'$1N37705' ; Q11.1 U18.3
|
||||
'$1N39412' ; C80.2 U22.30
|
||||
'$1N45053' ; LAN.1 R47.2
|
||||
'$1N46192' ; R46.1 U22.60
|
||||
'$1N88506' ; D7.10 R54.1
|
||||
'$1N88557' ; D7.11 R55.1
|
||||
'$1N99689' ; RF1.1 U19.37
|
||||
'ADC_VBAT' ; C84.2 R56.1 R57.2 U22.15
|
||||
'CAT1_NETSTATUS' ; R8.2 U19.17
|
||||
'CAT1_PWRKEY' ; R26.2 U22.17
|
||||
'CAT1_RESET' ; R35.2 U22.14
|
||||
'CAT1_UART_RX' ; Q8.3 U19.18
|
||||
'CAT1_UART_TX' ; Q9.2 U19.19
|
||||
'CAT1_WAKEUP' ; R32.2 U22.16
|
||||
'E32_INT' ; U15.20 U22.20
|
||||
'E32_NRST' ; U15.21 U22.21
|
||||
'E32_PXEN' ; U15.6 U22.26
|
||||
'E32_TXEN' ; U15.7 U22.27
|
||||
'LAN/~4G' ; R70.1 U22.61
|
||||
'MCU_SWCLK' ; CN2.3 U22.49
|
||||
'MCU_SWDIO' ; CN2.4 U22.46
|
||||
'NT26E_RX' ; Q9.3 R31.1 U24.3
|
||||
'NT26E_TX' ; Q8.2 U25.3
|
||||
'RD-' ; D7.7 U20.12
|
||||
'RD+' ; D7.6 U20.11
|
||||
'RS485_1_A' ; D5.1 R39.2 R64.1 U11.1 U12.6
|
||||
'RS485_1_B' ; D5.2 R37.2 R64.2 U11.2 U12.7
|
||||
'RS485_1_CTRL' ; U12.2 U12.3 U22.38
|
||||
'RS485_2_A' ; D6.1 R41.2 R65.1 U2.1 U16.6
|
||||
'RS485_2_B' ; D6.2 R40.2 R65.2 U2.2 U16.7
|
||||
'RS485_2_CTRL' ; U16.2 U16.3 U22.34
|
||||
'SD1_CLK' ; CARD2.5 R50.1 U22.53
|
||||
'SD1_CMD' ; CARD2.3 R51.1 U22.54
|
||||
'SD1_DAT0' ; CARD2.7 R49.1 U22.39
|
||||
'SD1_DAT1' ; CARD2.8 R48.1 U22.40
|
||||
'SD1_DAT2' ; CARD2.1 R53.1 U22.42
|
||||
'SD1_DAT3' ; CARD2.2 R52.1 U22.52
|
||||
'SIM_CLK' ; C31.2 CARD1.3 D2.4 R19.1
|
||||
'SIM_DATA' ; C33.2 CARD1.7 D2.6 R14.2 R16.1
|
||||
'SIM_RST' ; C32.2 CARD1.2 D2.5 R18.1
|
||||
'SIM_VDD' ; C34.1 C39.2 CARD1.1 CARD1.6 D2.3 R14.1 U19.15
|
||||
'SPI1_MISO' ; U21.2 U22.9
|
||||
'SPI1_MOSI' ; U21.5 U22.11
|
||||
'SPI1_SCK' ; U21.6 U22.10
|
||||
'SPI1_SS0' ; U21.1 U22.8
|
||||
'SPI2_MISO' ; U15.22 U22.22
|
||||
'SPI2_MOSI' ; U15.23 U22.23
|
||||
'SPI2_SCK' ; U15.24 U22.24
|
||||
'SPI2_SS0' ; U15.25 U22.25
|
||||
'TD-' ; D7.2 U20.14
|
||||
'TD+' ; D7.1 U20.13
|
||||
'UART1_RX' ; CN2.6 U22.44
|
||||
'UART1_TX' ; CN2.5 U22.45
|
||||
'UART2_RX' ; U12.1 U22.43
|
||||
'UART2_TX' ; U12.4 U22.41
|
||||
'UART3_RX' ; U16.1 U22.35
|
||||
'UART3_TX' ; U16.4 U22.33
|
||||
'UART4_RX' ; U22.62 U24.4
|
||||
'UART4_TX' ; U22.2 U25.4
|
||||
'V_RS4851_5/12V' ; C14.2 C15.2 L1.2 R23.2 R27.1 U13.2
|
||||
'V_RS4851_ON/~OFF' ; U3.4 U22.51
|
||||
'V_RS4852_5/12V' ; C24.2 C25.2 L3.2 R24.1 R28.1 U17.2
|
||||
'V_RS4852_ON/~OFF' ; U4.4 U22.28
|
||||
'VCC_15V' ; C12.2 C13.2 C22.2 C23.2 C51.1 C52.2 D4.1 R36.2 U3.5 U4.5
|
||||
'VCC_33' ; C59.1 C60.1 C69.2 D7.3 D7.5 D7.9 D7.12 Q11.3 R42.2 U20.3
|
||||
'VCC_3V3' ; C40.2 C46.2 C47.2 C48.2 C53.2 C61.2 C62.2 C63.1 C64.1 C65.1 C71.1 ,
|
||||
C72.1 C75.1 C76.1 C78.1 C79.2 C83.2 C85.2 C86.2 CARD2.4 CN2.7 Q11.2 ,
|
||||
R29.2 R31.2 R39.1 R41.1 R45.1 R46.2 R48.2 R49.2 R50.2 R51.2 R52.2 ,
|
||||
R53.2 R71.1 U10.2 U10.4 U12.8 U16.8 U18.5 U21.3 U21.7 U21.8 U22.13 ,
|
||||
U22.19 U22.32 U22.48 U22.64 U24.5 U25.5
|
||||
'VCC_3V8' ; C6.1 C7.1 C8.1 C9.2 C10.2 C11.2 C37.2 C38.2 C54.2 C55.2 C56.2 ,
|
||||
C57.2 R12.1 R20.2 U5.4 U15.9 U15.10 U19.45 U19.46
|
||||
'VCC_5V' ; C26.1 C35.2 C36.2 C44.2 C45.2 C88.2 L4.2 R17.2 U5.1 U5.2 U10.3
|
||||
'VCC_7V4' ; C29.2 C30.2 C49.1 C50.2 C97.2 C98.2 L5.1 Q16.2 R56.2 U6.7 U9.4 ,
|
||||
U9.5 U26.16
|
||||
'VDD_EXT' ; C28.2 C41.1 R30.1 U19.26
|
||||
'XTAL_IN' ; C81.2 U22.5 X2.1
|
||||
'XTAL_OUT' ; C82.2 U22.6 X2.3
|
||||
'XTAL32_IN' ; C77.1 U22.4 X1.2
|
||||
'XTAL32_OUT' ; C73.1 U22.3 X1.1
|
||||
'YOXO_100MLINK' ; U20.23 U22.58
|
||||
'YOXO_DEF' ; U20.22 U22.59
|
||||
'YOXO_NRST' ; U20.25 U22.57
|
||||
'YOXO_RX' ; U20.37 U24.1
|
||||
'YOXO_TX' ; U20.36 U25.1
|
||||
ACT ; R55.2 U20.27
|
||||
CAT1PWRKEY ; Q6.3 U19.7
|
||||
CAT1RESET ; Q10.3 U19.16
|
||||
GND ; 4G.1 C6.2 C7.2 C8.2 C9.1 C10.1 C11.1 C12.1 C13.1 C14.1 C15.1 C22.1 C23.1 ,
|
||||
C24.1 C25.1 C26.2 C28.1 C29.1 C30.1 C31.1 C32.1 C33.1 C34.2 C35.1 ,
|
||||
C36.1 C37.1 C38.1 C39.1 C44.1 C45.1 C46.1 C47.1 C48.1 C49.2 C50.1 ,
|
||||
C51.2 C52.1 C53.1 C54.1 C55.1 C56.1 C57.1 C58.2 C59.2 C60.2 C61.1 ,
|
||||
C62.1 C63.2 C64.2 C65.2 C66.1 C67.1 C68.1 C69.1 C70.1 C71.2 C72.2 ,
|
||||
C73.2 C74.1 C75.2 C76.2 C77.2 C78.2 C79.1 C80.1 C81.1 C82.1 C83.1 ,
|
||||
C84.1 C85.1 C86.1 C88.1 C89.1 C90.1 C91.1 C92.1 C95.1 C96.1 C97.1 ,
|
||||
C98.1 CARD1.5 CARD1.9 CARD1.10 CARD1.11 CARD2.6 CARD2.9 CARD2.10 ,
|
||||
CARD2.11 CARD2.12 CN2.1 CN3.2 D2.2 D3.2 D5.3 D6.3 D9.2 H3.1 LORA.1 ,
|
||||
Q5.2 Q6.2 Q7.2 Q10.2 R7.1 R11.1 R15.1 R21.1 R22.2 R25.1 R33.1 R34.1 ,
|
||||
R37.1 R38.1 R40.1 R42.1 R47.1 R57.1 R74.1 R76.1 R77.1 R81.1 R85.1 ,
|
||||
RF1.2 RF1.3 U3.2 U4.2 U5.3 U5.6 U6.6 U6.9 U9.2 U10.1 U12.5 U13.1 U14.1 ,
|
||||
U15.1 U15.2 U15.3 U15.4 U15.5 U15.11 U15.12 U15.17 U15.18 U15.26 ,
|
||||
U15.28 U16.5 U17.1 U18.2 U19.1 U19.10 U19.29 U19.36 U19.39 U19.40 ,
|
||||
U19.43 U19.44 U19.50 U19.51 U19.52 U19.53 U19.81 U19.82 U19.83 U19.85 ,
|
||||
U19.103 U19.107 U19.108 U19.109 U19.110 U19.111 U19.112 U20.49 U21.4 ,
|
||||
U22.12 U22.18 U22.31 U22.47 U22.63 U23.2 U23.4 U24.2 U25.2 U26.11 ,
|
||||
U26.12 X2.2 X2.4
|
||||
LINK ; R54.2 U20.28
|
||||
NRST ; C70.2 CN2.2 R45.2 U22.7
|
||||
PGND ; D7.8 D7.13 D7.14
|
||||
$SCHEDULE
|
||||
$END
|
||||
@@ -135,7 +135,7 @@
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>JL2CM3</Key>
|
||||
<Name>-U4294967295 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM)</Name>
|
||||
<Name>-U12345678 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM)</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
@@ -250,7 +250,7 @@
|
||||
<DebugFlag>
|
||||
<trace>0</trace>
|
||||
<periodic>1</periodic>
|
||||
<aLwin>1</aLwin>
|
||||
<aLwin>0</aLwin>
|
||||
<aCover>0</aCover>
|
||||
<aSer1>0</aSer1>
|
||||
<aSer2>0</aSer2>
|
||||
@@ -410,7 +410,7 @@
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>JL2CM3</Key>
|
||||
<Name>-U4294967295 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO14 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM)</Name>
|
||||
<Name>-U12345678 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO14 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM)</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
@@ -432,7 +432,7 @@
|
||||
<Bp>
|
||||
<Number>0</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>1004</LineNumber>
|
||||
<LineNumber>569</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>0</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
@@ -441,23 +441,7 @@
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>0</BreakIfRCount>
|
||||
<Filename>..\source\User\Src\Public.c</Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression></Expression>
|
||||
</Bp>
|
||||
<Bp>
|
||||
<Number>1</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>1006</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>0</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
<HtxType>0</HtxType>
|
||||
<ManyObjects>0</ManyObjects>
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>0</BreakIfRCount>
|
||||
<Filename>..\source\User\Src\Public.c</Filename>
|
||||
<Filename>..\source\User\Src\CatOneTask.c</Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression></Expression>
|
||||
</Bp>
|
||||
@@ -483,6 +467,31 @@
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>(60 * 1000),0x0A</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>4</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>GateWay.ConfigPara</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>5</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>cat1Active</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>6</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>CatOne.Cat1Status</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>7</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>CatOne.AtCmd</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>8</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>start,0x0A</ItemText>
|
||||
</Ww>
|
||||
</WatchWindow1>
|
||||
<WatchWindow2>
|
||||
<Ww>
|
||||
@@ -513,7 +522,7 @@
|
||||
<DebugFlag>
|
||||
<trace>0</trace>
|
||||
<periodic>1</periodic>
|
||||
<aLwin>1</aLwin>
|
||||
<aLwin>0</aLwin>
|
||||
<aCover>0</aCover>
|
||||
<aSer1>0</aSer1>
|
||||
<aSer2>0</aSer2>
|
||||
@@ -700,8 +709,8 @@
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\source\User\Src\ringbuffer.c</PathWithFileName>
|
||||
<FilenameWithoutPath>ringbuffer.c</FilenameWithoutPath>
|
||||
<PathWithFileName>..\source\User\Src\Update.c</PathWithFileName>
|
||||
<FilenameWithoutPath>Update.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
@@ -712,20 +721,8 @@
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\source\User\Src\protocol.c</PathWithFileName>
|
||||
<FilenameWithoutPath>protocol.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>13</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\source\User\Src\utils.c</PathWithFileName>
|
||||
<FilenameWithoutPath>utils.c</FilenameWithoutPath>
|
||||
<PathWithFileName>..\source\User\Src\EthTask.c</PathWithFileName>
|
||||
<FilenameWithoutPath>EthTask.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
@@ -739,7 +736,7 @@
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>14</FileNumber>
|
||||
<FileNumber>13</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -751,7 +748,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>15</FileNumber>
|
||||
<FileNumber>14</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -763,7 +760,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>16</FileNumber>
|
||||
<FileNumber>15</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -775,7 +772,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>17</FileNumber>
|
||||
<FileNumber>16</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -787,7 +784,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>18</FileNumber>
|
||||
<FileNumber>17</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -799,7 +796,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>19</FileNumber>
|
||||
<FileNumber>18</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -811,7 +808,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>20</FileNumber>
|
||||
<FileNumber>19</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -823,7 +820,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>21</FileNumber>
|
||||
<FileNumber>20</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -835,7 +832,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>22</FileNumber>
|
||||
<FileNumber>21</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -847,7 +844,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>23</FileNumber>
|
||||
<FileNumber>22</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -859,7 +856,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>24</FileNumber>
|
||||
<FileNumber>23</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -871,7 +868,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>25</FileNumber>
|
||||
<FileNumber>24</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -883,7 +880,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>26</FileNumber>
|
||||
<FileNumber>25</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -895,7 +892,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>27</FileNumber>
|
||||
<FileNumber>26</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -907,7 +904,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>28</FileNumber>
|
||||
<FileNumber>27</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -919,7 +916,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>29</FileNumber>
|
||||
<FileNumber>28</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -931,7 +928,7 @@
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>30</FileNumber>
|
||||
<FileNumber>29</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -951,7 +948,7 @@
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>31</FileNumber>
|
||||
<FileNumber>30</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
@@ -969,30 +966,6 @@
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>5</GroupNumber>
|
||||
<FileNumber>32</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\source\Module\SDCard\sd_card.c</PathWithFileName>
|
||||
<FilenameWithoutPath>sd_card.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>5</GroupNumber>
|
||||
<FileNumber>33</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\source\Module\SDCard\sdmmc_cmd.c</PathWithFileName>
|
||||
<FilenameWithoutPath>sdmmc_cmd.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
@@ -1001,54 +974,6 @@
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>34</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\source\Module\FatFS\source\sd_diskio.c</PathWithFileName>
|
||||
<FilenameWithoutPath>sd_diskio.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>35</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\source\Module\FatFS\source\diskio.c</PathWithFileName>
|
||||
<FilenameWithoutPath>diskio.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>36</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\source\Module\FatFS\source\ff.c</PathWithFileName>
|
||||
<FilenameWithoutPath>ff.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>37</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\source\Module\FatFS\source\ffsystem.c</PathWithFileName>
|
||||
<FilenameWithoutPath>ffsystem.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
</Group>
|
||||
|
||||
<Group>
|
||||
@@ -1059,7 +984,7 @@
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>38</FileNumber>
|
||||
<FileNumber>31</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
||||
@@ -341,7 +341,7 @@
|
||||
<MiscControls>--diag_suppress=186,66</MiscControls>
|
||||
<Define>__DEBUG,HC32F460,USE_DEVICE_DRIVER_LIB,JEUA</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..\..\driver\inc;..\..\..\mcu\common;..\source\User\Inc;..\source\Module\GateWay_Debug;..\source\Module\SDCard;..\source\Module\FatFS\source;..\source\Module\SX127x</IncludePath>
|
||||
<IncludePath>..\..\..\driver\inc;..\..\..\mcu\common;..\source\User\Inc;..\source\Module\GateWay_Debug;..\source\Module\SX127x</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@@ -372,7 +372,7 @@
|
||||
<TextAddressRange>0x00000000</TextAddressRange>
|
||||
<DataAddressRange>0x1FFF8000</DataAddressRange>
|
||||
<pXoBase></pXoBase>
|
||||
<ScatterFile>.\output\debug\GateWay.sct</ScatterFile>
|
||||
<ScatterFile>GateWay_app.sct</ScatterFile>
|
||||
<IncludeLibs></IncludeLibs>
|
||||
<IncludeLibsPath></IncludeLibsPath>
|
||||
<Misc>--keep=*Handler</Misc>
|
||||
@@ -479,19 +479,14 @@
|
||||
<FilePath>..\source\User\Src\update_protocol.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>ringbuffer.c</FileName>
|
||||
<FileName>Update.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\User\Src\ringbuffer.c</FilePath>
|
||||
<FilePath>..\source\User\Src\Update.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>protocol.c</FileName>
|
||||
<FileName>EthTask.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\User\Src\protocol.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>utils.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\User\Src\utils.c</FilePath>
|
||||
<FilePath>..\source\User\Src\EthTask.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
@@ -666,18 +661,6 @@
|
||||
</Aads>
|
||||
</GroupArmAds>
|
||||
</GroupOption>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>sd_card.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\Module\SDCard\sd_card.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>sdmmc_cmd.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\Module\SDCard\sdmmc_cmd.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>FatFS</GroupName>
|
||||
@@ -750,28 +733,6 @@
|
||||
</Aads>
|
||||
</GroupArmAds>
|
||||
</GroupOption>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>sd_diskio.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\Module\FatFS\source\sd_diskio.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>diskio.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\Module\FatFS\source\diskio.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>ff.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\Module\FatFS\source\ff.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>ffsystem.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\Module\FatFS\source\ffsystem.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>sx127x</GroupName>
|
||||
@@ -1267,7 +1228,7 @@
|
||||
<MiscControls>--diag_suppress=186,66</MiscControls>
|
||||
<Define>__DEBUG,HC32F460,USE_DEVICE_DRIVER_LIB,JEUA,BOOT_ENABLE</Define>
|
||||
<Undefine></Undefine>
|
||||
<IncludePath>..\..\..\driver\inc;..\..\..\mcu\common;..\source\User\Inc;..\source\Module\Debug;..\source\Module\SDCard;..\source\Module\FatFS\source;..\source\Module\sx127x;..\source\Module\GateWay_Debug</IncludePath>
|
||||
<IncludePath>..\..\..\driver\inc;..\..\..\mcu\common;..\source\User\Inc;..\source\Module\Debug;..\source\Module\sx127x;..\source\Module\GateWay_Debug</IncludePath>
|
||||
</VariousControls>
|
||||
</Cads>
|
||||
<Aads>
|
||||
@@ -1298,7 +1259,7 @@
|
||||
<TextAddressRange>0x00000000</TextAddressRange>
|
||||
<DataAddressRange>0x1FFF8000</DataAddressRange>
|
||||
<pXoBase></pXoBase>
|
||||
<ScatterFile>.\output\debug\GateWay.sct</ScatterFile>
|
||||
<ScatterFile>GateWay_app.sct</ScatterFile>
|
||||
<IncludeLibs></IncludeLibs>
|
||||
<IncludeLibsPath></IncludeLibsPath>
|
||||
<Misc>--keep=*Handler</Misc>
|
||||
@@ -1405,19 +1366,14 @@
|
||||
<FilePath>..\source\User\Src\update_protocol.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>ringbuffer.c</FileName>
|
||||
<FileName>Update.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\User\Src\ringbuffer.c</FilePath>
|
||||
<FilePath>..\source\User\Src\Update.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>protocol.c</FileName>
|
||||
<FileName>EthTask.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\User\Src\protocol.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>utils.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\User\Src\utils.c</FilePath>
|
||||
<FilePath>..\source\User\Src\EthTask.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
@@ -1530,8 +1486,8 @@
|
||||
<RVCTZI>0</RVCTZI>
|
||||
<RVCTOtherData>0</RVCTOtherData>
|
||||
<ModuleSelection>0</ModuleSelection>
|
||||
<IncludeInBuild>0</IncludeInBuild>
|
||||
<AlwaysBuild>0</AlwaysBuild>
|
||||
<IncludeInBuild>1</IncludeInBuild>
|
||||
<AlwaysBuild>1</AlwaysBuild>
|
||||
<GenerateAssemblyFile>2</GenerateAssemblyFile>
|
||||
<AssembleAssemblyFile>2</AssembleAssemblyFile>
|
||||
<PublicsOnly>2</PublicsOnly>
|
||||
@@ -1592,18 +1548,6 @@
|
||||
</Aads>
|
||||
</GroupArmAds>
|
||||
</GroupOption>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>sd_card.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\Module\SDCard\sd_card.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>sdmmc_cmd.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\Module\SDCard\sdmmc_cmd.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>FatFS</GroupName>
|
||||
@@ -1614,8 +1558,8 @@
|
||||
<RVCTZI>0</RVCTZI>
|
||||
<RVCTOtherData>0</RVCTOtherData>
|
||||
<ModuleSelection>0</ModuleSelection>
|
||||
<IncludeInBuild>0</IncludeInBuild>
|
||||
<AlwaysBuild>2</AlwaysBuild>
|
||||
<IncludeInBuild>1</IncludeInBuild>
|
||||
<AlwaysBuild>1</AlwaysBuild>
|
||||
<GenerateAssemblyFile>2</GenerateAssemblyFile>
|
||||
<AssembleAssemblyFile>2</AssembleAssemblyFile>
|
||||
<PublicsOnly>2</PublicsOnly>
|
||||
@@ -1676,28 +1620,6 @@
|
||||
</Aads>
|
||||
</GroupArmAds>
|
||||
</GroupOption>
|
||||
<Files>
|
||||
<File>
|
||||
<FileName>sd_diskio.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\Module\FatFS\source\sd_diskio.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>diskio.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\Module\FatFS\source\diskio.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>ff.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\Module\FatFS\source\ff.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>ffsystem.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\source\Module\FatFS\source\ffsystem.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
<GroupName>sx127x</GroupName>
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
; *************************************************************
|
||||
; *** Scatter-Loading Description File for GateWay APP ***
|
||||
; *** Flash: APP区 0x8000起 (Boot 32KB), 到参数区0x7C000前 ***
|
||||
; *************************************************************
|
||||
|
||||
LR_IROM1 0x00008000 0x00074000 {
|
||||
ER_IROM1 0x00008000 0x00074000 {
|
||||
*.o (RESET, +First)
|
||||
*(InRoot$$Sections)
|
||||
.ANY (+RO)
|
||||
.ANY (+XO)
|
||||
}
|
||||
; RW数据区域 - 192KB SRAM
|
||||
RW_IRAM1 0x1FFF8000 0x0002F000 {
|
||||
.ANY (+RW +ZI)
|
||||
}
|
||||
}
|
||||
@@ -11,13 +11,17 @@
|
||||
#include <rthw.h>
|
||||
#include <rtthread.h>
|
||||
#include "bsp.h"
|
||||
#include "main.h"
|
||||
#include "sx127x.h"
|
||||
|
||||
extern GateWayPara_t GateWay;
|
||||
|
||||
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
|
||||
/*
|
||||
* Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
|
||||
* the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
|
||||
*/
|
||||
#define RT_HEAP_SIZE (32*1024)
|
||||
#define RT_HEAP_SIZE (48*1024)
|
||||
static rt_uint8_t rt_heap[RT_HEAP_SIZE];
|
||||
|
||||
RT_WEAK void *rt_heap_begin_get(void)
|
||||
@@ -73,16 +77,24 @@ void rt_hw_board_init(void)
|
||||
static int uart_init(void)
|
||||
{
|
||||
//#error "TODO 2: Enable the hardware uart and config baudrate."
|
||||
DbgUart_Config(500000);
|
||||
return 0;
|
||||
DbgOrCat1Uart_Config(500000);
|
||||
// RS485Ch1_Config(500000);
|
||||
return 0;
|
||||
}
|
||||
INIT_BOARD_EXPORT(uart_init);
|
||||
|
||||
void rt_hw_console_output(const char *str)
|
||||
{
|
||||
//#error "TODO 3: Output the string 'str' through the uart."
|
||||
rt_enter_critical();
|
||||
DebugUartSend((uint8_t *)str, strlen(str));
|
||||
switch(GateWay.ConfigPara.Duch) {
|
||||
case CH_RS485_1: RS485Ch1UartSend((uint8_t *)str, strlen(str)); break;
|
||||
case CH_RS485_2: RS485Ch2UartSend((uint8_t *)str, strlen(str)); break;
|
||||
case CH_ETH: EthUartSend((uint8_t *)str, strlen(str)); break;
|
||||
case CH_LORA: Sx1276LoRaSendBuffer((uint8_t *)str, strlen(str)); break;
|
||||
case CH_CAT1: DebugOrCat1UartSend((uint8_t *)str, strlen(str)); break;
|
||||
case CH_DBG: DebugOrCat1UartSend((uint8_t *)str, strlen(str)); break;
|
||||
default: DebugOrCat1UartSend((uint8_t *)str, strlen(str)); break;
|
||||
}
|
||||
rt_exit_critical();
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
// <o>the stack size of main thread<1-4086>
|
||||
// <i>Default: 512
|
||||
#define RT_MAIN_THREAD_STACK_SIZE 512
|
||||
#define RT_MAIN_THREAD_STACK_SIZE 512 //4096
|
||||
|
||||
// </h>
|
||||
|
||||
|
||||
Submodule Project/GateWay/source/Module/FatFS deleted from 1d10fbd56e
Submodule Project/GateWay/source/Module/GateWay_Debug deleted from a57b9ddf31
@@ -0,0 +1,130 @@
|
||||
# ---> IAR
|
||||
# Compiled binaries
|
||||
*.o
|
||||
*.bin
|
||||
*.elf
|
||||
*.hex
|
||||
*.map
|
||||
*.out
|
||||
*.obj
|
||||
|
||||
# Trash
|
||||
*.bak
|
||||
thumbs.db
|
||||
*.~*
|
||||
|
||||
# IAR Settings
|
||||
**/settings/*.crun
|
||||
**/settings/*.dbgdt
|
||||
**/settings/*.cspy
|
||||
**/settings/*.cspy.*
|
||||
**/settings/*.xcl
|
||||
**/settings/*.dni
|
||||
**/settings/*.wsdt
|
||||
**/settings/*.wspos
|
||||
|
||||
# IAR Debug Exe
|
||||
**/Exe/*.sim
|
||||
|
||||
# IAR Debug Obj
|
||||
**/Obj/*.pbd
|
||||
**/Obj/*.pbd.*
|
||||
**/Obj/*.pbi
|
||||
**/Obj/*.pbi.*
|
||||
|
||||
# IAR project "Debug" directory
|
||||
Debug/
|
||||
|
||||
# IAR project "Release" directory
|
||||
Release/
|
||||
|
||||
# IAR project settings directory
|
||||
settings/
|
||||
|
||||
# IAR backup files
|
||||
Backup*
|
||||
|
||||
# IAR .dep files
|
||||
*.dep
|
||||
# ---> IAR_EWARM
|
||||
# gitignore template for the IAR EWARM
|
||||
# website: https://www.iar.com/knowledge/support/technical-notes/ide/which-files-should-be-version-controlled/
|
||||
|
||||
# Some tools will put the EWARM files
|
||||
# under a subdirectory with the same name
|
||||
# as the configuration.
|
||||
# Example
|
||||
# EWARM/Config1/Obj /List /Exe
|
||||
# EWARM/Config2/Obj /List /Exe
|
||||
EWARM/**/Obj
|
||||
EWARM/**/List
|
||||
EWARM/**/Exe
|
||||
|
||||
# Autogenerated project files
|
||||
*.dep
|
||||
*.ewt
|
||||
|
||||
# Autogenerated folder for debugger
|
||||
EWARM/settings
|
||||
|
||||
# ---> uVision
|
||||
# git ignore file for Keil µVision Project
|
||||
|
||||
# µVision 5 and µVision 4 Project screen layout file
|
||||
*.uvguix.*
|
||||
*.uvgui.*
|
||||
|
||||
# Listing Files
|
||||
*.i
|
||||
*.lst
|
||||
*.m51
|
||||
*.m66
|
||||
*.map
|
||||
|
||||
# Object Files
|
||||
*.axf
|
||||
*.b[0-2][0-9]
|
||||
*.b3[0-1]
|
||||
*.bak
|
||||
*.build_log.htm
|
||||
*.crf
|
||||
*.d
|
||||
*.dep
|
||||
*.elf
|
||||
*.htm
|
||||
*.iex
|
||||
*.lnp
|
||||
*.o
|
||||
*.obj
|
||||
*.sbr
|
||||
|
||||
# Firmware Files
|
||||
*.bin
|
||||
*.h86
|
||||
*.hex
|
||||
|
||||
# Build Files
|
||||
.bat
|
||||
|
||||
# Debugger Files
|
||||
.ini
|
||||
|
||||
# JLink Files
|
||||
JLinkLog.txt
|
||||
|
||||
# Other Files
|
||||
|
||||
# ---> VisualStudioCode
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
!.vscode/*.code-snippets
|
||||
|
||||
# Local History for Visual Studio Code
|
||||
.history/
|
||||
|
||||
# Built Visual Studio Code Extensions
|
||||
*.vsix
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
#ifndef __DEBUG_CMD_H
|
||||
#define __DEBUG_CMD_H
|
||||
|
||||
void Debug_Thread_Entry(void *parameter);
|
||||
void DebugOrCat1RxOverhandler(void);
|
||||
void Debug_Printf(char *format, ...);
|
||||
#endif
|
||||
@@ -0,0 +1,5 @@
|
||||
# GateWay_Debug
|
||||
# 适用于Gateway项目
|
||||
# 单片机HC32F460
|
||||
# 转换为模块仓库 2026-05-14
|
||||
|
||||
Submodule Project/GateWay/source/Module/SDCard deleted from 1fa0c642ed
Submodule Project/GateWay/source/Module/sx127x deleted from a4dafc526f
@@ -0,0 +1,130 @@
|
||||
# ---> IAR
|
||||
# Compiled binaries
|
||||
*.o
|
||||
*.bin
|
||||
*.elf
|
||||
*.hex
|
||||
*.map
|
||||
*.out
|
||||
*.obj
|
||||
|
||||
# Trash
|
||||
*.bak
|
||||
thumbs.db
|
||||
*.~*
|
||||
|
||||
# IAR Settings
|
||||
**/settings/*.crun
|
||||
**/settings/*.dbgdt
|
||||
**/settings/*.cspy
|
||||
**/settings/*.cspy.*
|
||||
**/settings/*.xcl
|
||||
**/settings/*.dni
|
||||
**/settings/*.wsdt
|
||||
**/settings/*.wspos
|
||||
|
||||
# IAR Debug Exe
|
||||
**/Exe/*.sim
|
||||
|
||||
# IAR Debug Obj
|
||||
**/Obj/*.pbd
|
||||
**/Obj/*.pbd.*
|
||||
**/Obj/*.pbi
|
||||
**/Obj/*.pbi.*
|
||||
|
||||
# IAR project "Debug" directory
|
||||
Debug/
|
||||
|
||||
# IAR project "Release" directory
|
||||
Release/
|
||||
|
||||
# IAR project settings directory
|
||||
settings/
|
||||
|
||||
# IAR backup files
|
||||
Backup*
|
||||
|
||||
# IAR .dep files
|
||||
*.dep
|
||||
# ---> IAR_EWARM
|
||||
# gitignore template for the IAR EWARM
|
||||
# website: https://www.iar.com/knowledge/support/technical-notes/ide/which-files-should-be-version-controlled/
|
||||
|
||||
# Some tools will put the EWARM files
|
||||
# under a subdirectory with the same name
|
||||
# as the configuration.
|
||||
# Example
|
||||
# EWARM/Config1/Obj /List /Exe
|
||||
# EWARM/Config2/Obj /List /Exe
|
||||
EWARM/**/Obj
|
||||
EWARM/**/List
|
||||
EWARM/**/Exe
|
||||
|
||||
# Autogenerated project files
|
||||
*.dep
|
||||
*.ewt
|
||||
|
||||
# Autogenerated folder for debugger
|
||||
EWARM/settings
|
||||
|
||||
# ---> uVision
|
||||
# git ignore file for Keil µVision Project
|
||||
|
||||
# µVision 5 and µVision 4 Project screen layout file
|
||||
*.uvguix.*
|
||||
*.uvgui.*
|
||||
|
||||
# Listing Files
|
||||
*.i
|
||||
*.lst
|
||||
*.m51
|
||||
*.m66
|
||||
*.map
|
||||
|
||||
# Object Files
|
||||
*.axf
|
||||
*.b[0-2][0-9]
|
||||
*.b3[0-1]
|
||||
*.bak
|
||||
*.build_log.htm
|
||||
*.crf
|
||||
*.d
|
||||
*.dep
|
||||
*.elf
|
||||
*.htm
|
||||
*.iex
|
||||
*.lnp
|
||||
*.o
|
||||
*.obj
|
||||
*.sbr
|
||||
|
||||
# Firmware Files
|
||||
*.bin
|
||||
*.h86
|
||||
*.hex
|
||||
|
||||
# Build Files
|
||||
.bat
|
||||
|
||||
# Debugger Files
|
||||
.ini
|
||||
|
||||
# JLink Files
|
||||
JLinkLog.txt
|
||||
|
||||
# Other Files
|
||||
|
||||
# ---> VisualStudioCode
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
!.vscode/*.code-snippets
|
||||
|
||||
# Local History for Visual Studio Code
|
||||
.history/
|
||||
|
||||
# Built Visual Studio Code Extensions
|
||||
*.vsix
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
ISC License:
|
||||
|
||||
Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC")
|
||||
Copyright (c) 1995-2003 by Internet Software Consortium
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
@@ -0,0 +1,2 @@
|
||||
# sx127x
|
||||
|
||||
@@ -0,0 +1,678 @@
|
||||
#include "sx127x.h"
|
||||
#include "DebugCmd.h"
|
||||
|
||||
#if (LORA_MODULE == SX1278W1)
|
||||
static Sx1276Type_t LoRaPara = {
|
||||
.ucChannel = 8,
|
||||
.dwFreqHz = FREQ_CENT,
|
||||
.ucPower = 20,
|
||||
.SignalBw = SX1276_BW_250K,
|
||||
.SpreadFactor = SX1276_SF_512,
|
||||
.ErrorCoding = SX1276_EC_4_6,
|
||||
.RegPreamble = 10,
|
||||
.ucOpModePrev = RFLR_OPMODE_STANDBY,
|
||||
.bAntSwPrev = RF_ANT_RECEIVER,
|
||||
.RegBuff = 0,
|
||||
.State = SX1276_IDLE,
|
||||
.ucRxPacketSize = 0,
|
||||
.ucTxPacketSize = 0,
|
||||
.RxCallBack = NULL,
|
||||
};
|
||||
|
||||
void LoraReset(void)
|
||||
{
|
||||
LORA_RESET_CLR();
|
||||
Ddl_Delay1ms(1);
|
||||
LORA_RESET_SET();
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
void SX1276SetAntSw(Sx1276AntStatus_m Status)
|
||||
{
|
||||
switch(Status){
|
||||
case RF_ANT_TRANSMITTER:
|
||||
LORA_ANTTXEN();
|
||||
break;
|
||||
case RF_ANT_RECEIVER:
|
||||
LORA_ANTRXEN();
|
||||
break;
|
||||
case RF_ANT_CLOSE:
|
||||
LORA_ANTCLOSE();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SX1276ReadBuffer(uint8_t ucAddr, uint8_t *pucBuff, uint8_t ucLen)
|
||||
{
|
||||
uint8_t ucCnt;
|
||||
LORA_SPI_NSS_CLR();
|
||||
LORA_SPI_READ_WRITE(ucAddr & 0x7F);
|
||||
for( ucCnt = 0; ucCnt < ucLen; ucCnt++ ){
|
||||
pucBuff[ucCnt] = LORA_SPI_READ_WRITE(0);
|
||||
}
|
||||
LORA_SPI_NSS_SET();
|
||||
}
|
||||
|
||||
void SX1276WriteBuffer(uint8_t ucAddr, uint8_t *pucBuff, uint8_t ucLen)
|
||||
{
|
||||
uint8_t ucCnt;
|
||||
LORA_SPI_NSS_CLR();
|
||||
LORA_SPI_READ_WRITE(ucAddr | 0x80);
|
||||
for( ucCnt = 0; ucCnt < ucLen; ucCnt++ ){
|
||||
LORA_SPI_READ_WRITE(pucBuff[ucCnt]);
|
||||
}
|
||||
LORA_SPI_NSS_SET();
|
||||
}
|
||||
void SX1276Write(uint8_t ucAddr, uint8_t ucData)
|
||||
{
|
||||
SX1276WriteBuffer(ucAddr, &ucData, 1);
|
||||
}
|
||||
|
||||
void SX1276Read(uint8_t ucAddr, uint8_t * pucData)
|
||||
{
|
||||
SX1276ReadBuffer(ucAddr, pucData, 1);
|
||||
}
|
||||
|
||||
void SX1276WriteFifo(uint8_t *pucBuff, uint8_t ucLen)
|
||||
{
|
||||
SX1276WriteBuffer(0, pucBuff, ucLen);
|
||||
}
|
||||
|
||||
void SX1276ReadFifo(uint8_t *pucBuff, uint8_t ucLen)
|
||||
{
|
||||
SX1276ReadBuffer(0, pucBuff, ucLen);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
void SX1276LoRaSetNbTrigPeaks(uint8_t ucValue)
|
||||
{
|
||||
SX1276Read(0x31, &(LoRaPara.RegBuff.RegTestReserved31));
|
||||
LoRaPara.RegBuff.RegTestReserved31 = (LoRaPara.RegBuff.RegTestReserved31 & 0xF8) | ucValue;
|
||||
SX1276Write(0x31, LoRaPara.RegBuff.RegTestReserved31 );
|
||||
}
|
||||
|
||||
void SX1276LoRaSetSignalBandwidth(Sx1276BwType Bw)
|
||||
{
|
||||
SX1276Read(REG_LR_MODEMCONFIG1, &(LoRaPara.RegBuff.RegModemConfig1));
|
||||
LoRaPara.RegBuff.RegModemConfig1 = (LoRaPara.RegBuff.RegModemConfig1 & RFLR_MODEMCONFIG1_BW_MASK) | Bw;
|
||||
SX1276Write(REG_LR_MODEMCONFIG1, LoRaPara.RegBuff.RegModemConfig1);
|
||||
LoRaPara.SignalBw = Bw;
|
||||
}
|
||||
|
||||
void SX1276LoRaSetSpreadingFactor(Sx1276SpreadFactorType Factor)
|
||||
{
|
||||
if (Factor > SX1276_SF_4096){
|
||||
Factor = SX1276_SF_4096;
|
||||
}
|
||||
else if (Factor < SX1276_SF_64){
|
||||
Factor = SX1276_SF_64;
|
||||
}
|
||||
if (Factor == SX1276_SF_64){
|
||||
SX1276LoRaSetNbTrigPeaks(5);
|
||||
}
|
||||
else{
|
||||
SX1276LoRaSetNbTrigPeaks(3);
|
||||
}
|
||||
SX1276Read(REG_LR_MODEMCONFIG2, &(LoRaPara.RegBuff.RegModemConfig2));
|
||||
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_SF_MASK ) | Factor;
|
||||
SX1276Write(REG_LR_MODEMCONFIG2, LoRaPara.RegBuff.RegModemConfig2);
|
||||
LoRaPara.SpreadFactor = Factor;
|
||||
}
|
||||
|
||||
void SX1276LoRaSetErrorCoding(Sx1276ErrorCodingType Value){
|
||||
SX1276Read(REG_LR_MODEMCONFIG1, &(LoRaPara.RegBuff.RegModemConfig1));
|
||||
LoRaPara.RegBuff.RegModemConfig1 = (LoRaPara.RegBuff.RegModemConfig1 & RFLR_MODEMCONFIG1_CODINGRATE_MASK ) | Value;
|
||||
SX1276Write(REG_LR_MODEMCONFIG1, LoRaPara.RegBuff.RegModemConfig1 );
|
||||
LoRaPara.ErrorCoding = Value;
|
||||
}
|
||||
|
||||
void SX1276LoRaSetFreqHz(uint32_t dwFreqHz)
|
||||
{
|
||||
LoRaPara.dwFreqHz = dwFreqHz;
|
||||
dwFreqHz = ( uint32_t )( ( double )dwFreqHz / ( double )FREQ_STEP );
|
||||
LoRaPara.RegBuff.RegFrfMsb = ( uint8_t )( ( dwFreqHz >> 16 ) & 0xFF );
|
||||
LoRaPara.RegBuff.RegFrfMid = ( uint8_t )( ( dwFreqHz >> 8 ) & 0xFF );
|
||||
LoRaPara.RegBuff.RegFrfLsb = ( uint8_t )( dwFreqHz & 0xFF );
|
||||
SX1276WriteBuffer(REG_LR_FRFMSB, &(LoRaPara.RegBuff.RegFrfMsb), 3);
|
||||
}
|
||||
|
||||
void SX1276LoRaSetSymbTimeout(uint16_t ucValue)
|
||||
{
|
||||
SX1276ReadBuffer(REG_LR_MODEMCONFIG2, &(LoRaPara.RegBuff.RegModemConfig2), 2);
|
||||
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK) | (( ucValue >> 8) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK );
|
||||
LoRaPara.RegBuff.RegSymbTimeoutLsb = ucValue & 0xFF;
|
||||
SX1276WriteBuffer(REG_LR_MODEMCONFIG2, &(LoRaPara.RegBuff.RegModemConfig2), 2);
|
||||
}
|
||||
|
||||
void SX1276LoRaSetLowDatarateOptimize(bool bEnable)
|
||||
{
|
||||
SX1276Read(REG_LR_MODEMCONFIG3, &(LoRaPara.RegBuff.RegModemConfig3));
|
||||
LoRaPara.RegBuff.RegModemConfig3 = (LoRaPara.RegBuff.RegModemConfig3 & RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK ) | ( bEnable << 3 );
|
||||
SX1276Write(REG_LR_MODEMCONFIG3, LoRaPara.RegBuff.RegModemConfig3);
|
||||
}
|
||||
|
||||
void SX1276LoRaSetPAOutput(uint8_t ucOutputPin)
|
||||
{
|
||||
SX1276Read(REG_LR_PACONFIG, &(LoRaPara.RegBuff.RegPaConfig));
|
||||
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_PASELECT_MASK ) | ucOutputPin;
|
||||
SX1276Write(REG_LR_PACONFIG, LoRaPara.RegBuff.RegPaConfig );
|
||||
}
|
||||
|
||||
void SX1276LoRaSetPa20dBm(bool bEnable)
|
||||
{
|
||||
SX1276Read(REG_LR_PADAC, &(LoRaPara.RegBuff.RegPaDac));
|
||||
SX1276Read(REG_LR_PACONFIG, &(LoRaPara.RegBuff.RegPaConfig));
|
||||
if ((LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_PASELECT_PABOOST ) == RFLR_PACONFIG_PASELECT_PABOOST ) {
|
||||
if( bEnable == true ){
|
||||
LoRaPara.RegBuff.RegPaDac = 0x87;
|
||||
}
|
||||
}
|
||||
else{
|
||||
LoRaPara.RegBuff.RegPaDac = 0x84;
|
||||
}
|
||||
SX1276Write(REG_LR_PADAC, LoRaPara.RegBuff.RegPaDac );
|
||||
}
|
||||
|
||||
void SX1276LoRaSetRfPower(int8_t sbPower)
|
||||
{
|
||||
SX1276Read(REG_LR_PACONFIG, &(LoRaPara.RegBuff.RegPaConfig));
|
||||
SX1276Read(REG_LR_PADAC, &(LoRaPara.RegBuff.RegPaDac));
|
||||
if ((LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_PASELECT_PABOOST ) == RFLR_PACONFIG_PASELECT_PABOOST ) {
|
||||
if ((LoRaPara.RegBuff.RegPaDac & 0x87) == 0x87){
|
||||
if( sbPower < 5 ){
|
||||
sbPower = 5;
|
||||
}
|
||||
if( sbPower > 20){
|
||||
sbPower = 20;
|
||||
}
|
||||
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_MAX_POWER_MASK ) | 0x70;
|
||||
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) |
|
||||
( uint8_t )( ( uint16_t )( sbPower - 5 ) & 0x0F );
|
||||
}
|
||||
else{
|
||||
if( sbPower < 2){
|
||||
sbPower = 2;
|
||||
}
|
||||
if( sbPower > 17){
|
||||
sbPower = 17;
|
||||
}
|
||||
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_MAX_POWER_MASK ) | 0x70;
|
||||
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) |
|
||||
( uint8_t )( ( uint16_t )( sbPower - 2 ) & 0x0F );
|
||||
}
|
||||
}
|
||||
else{
|
||||
if( sbPower < -1){
|
||||
sbPower = -1;
|
||||
}
|
||||
if( sbPower > 14){
|
||||
sbPower = 14;
|
||||
}
|
||||
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_MAX_POWER_MASK ) | 0x70;
|
||||
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) |
|
||||
( uint8_t )( ( uint16_t )( sbPower + 1 ) & 0x0F );
|
||||
}
|
||||
SX1276Write(REG_LR_PACONFIG, LoRaPara.RegBuff.RegPaConfig);
|
||||
LoRaPara.ucPower = sbPower;
|
||||
}
|
||||
|
||||
void SX1276LoRaSetOpMode(Sx1276OpModeType ucOpMode)
|
||||
{
|
||||
Sx1276AntStatus_m bAntSwStatus = RF_ANT_RECEIVER;
|
||||
LoRaPara.ucOpModePrev = LoRaPara.RegBuff.RegOpMode & ~RFLR_OPMODE_MASK;
|
||||
if( ucOpMode != LoRaPara.ucOpModePrev){
|
||||
if(ucOpMode == RFLR_OPMODE_TRANSMITTER){
|
||||
LORA_RXEN_CLR();
|
||||
LORA_TXEN_SET();
|
||||
bAntSwStatus = RF_ANT_TRANSMITTER;
|
||||
}
|
||||
else if(ucOpMode == RFLR_OPMODE_RECEIVER){
|
||||
LORA_TXEN_CLR();
|
||||
LORA_RXEN_SET();
|
||||
bAntSwStatus = RF_ANT_RECEIVER;
|
||||
}
|
||||
else {
|
||||
LORA_TXEN_CLR();
|
||||
LORA_RXEN_CLR();
|
||||
bAntSwStatus = RF_ANT_CLOSE;
|
||||
}
|
||||
if( bAntSwStatus != LoRaPara.bAntSwPrev ){
|
||||
LoRaPara.bAntSwPrev = bAntSwStatus;
|
||||
SX1276SetAntSw(bAntSwStatus);
|
||||
}
|
||||
LoRaPara.RegBuff.RegOpMode = (LoRaPara.RegBuff.RegOpMode & RFLR_OPMODE_MASK ) | ucOpMode;
|
||||
SX1276Write( REG_LR_OPMODE, LoRaPara.RegBuff.RegOpMode);
|
||||
}
|
||||
}
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
void Sx1276LoRaEnterRx(void)
|
||||
{
|
||||
uint8_t ucCnt;
|
||||
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
|
||||
LoRaPara.RegBuff.RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT | RFLR_IRQFLAGS_VALIDHEADER | RFLR_IRQFLAGS_TXDONE;
|
||||
SX1276Write(REG_LR_IRQFLAGSMASK, LoRaPara.RegBuff.RegIrqFlagsMask);
|
||||
LoRaPara.RegBuff.RegHopPeriod = 255;
|
||||
SX1276Write(REG_LR_HOPPERIOD, LoRaPara.RegBuff.RegHopPeriod );
|
||||
// RxDone RxTimeout FhssChangeChannel ValidHeader
|
||||
LoRaPara.RegBuff.RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_01 | RFLR_DIOMAPPING1_DIO3_01;
|
||||
// CadDetected ModeReady
|
||||
LoRaPara.RegBuff.RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00;
|
||||
SX1276WriteBuffer(REG_LR_DIOMAPPING1, &(LoRaPara.RegBuff.RegDioMapping1), 2);
|
||||
LoRaPara.RegBuff.RegFifoAddrPtr = LoRaPara.RegBuff.RegFifoRxBaseAddr;
|
||||
SX1276Write(REG_LR_FIFOADDRPTR, LoRaPara.RegBuff.RegFifoAddrPtr);
|
||||
SX1276LoRaSetOpMode(RFLR_OPMODE_RECEIVER);
|
||||
for (ucCnt=0; ucCnt< LORA_BUFF_SIZE; ucCnt++){
|
||||
LoRaPara.RxTxBuff[ucCnt] = 0;
|
||||
}
|
||||
LoRaPara.State = SX1276_IDLE;//COMST_RX
|
||||
uint8_t temp;
|
||||
SX1276Read(REG_LR_IRQFLAGS, &temp);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
void Sx1276LoRaInit(DataRevCallBack RxCallBack)
|
||||
{
|
||||
if(RxCallBack != NULL) {
|
||||
LoRaPara.RxCallBack = RxCallBack;
|
||||
}
|
||||
LoraReset();
|
||||
SX1276LoRaSetOpMode(RFLR_OPMODE_SLEEP);
|
||||
LoRaPara.RegBuff.RegOpMode = (LoRaPara.RegBuff.RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON;
|
||||
SX1276Write(REG_LR_OPMODE, LoRaPara.RegBuff.RegOpMode );
|
||||
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
|
||||
// RxDone RxTimeout FhssChangeChannel ValidHeader
|
||||
LoRaPara.RegBuff.RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_01;
|
||||
// CadDetected ModeReady
|
||||
LoRaPara.RegBuff.RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00;
|
||||
SX1276WriteBuffer(REG_LR_DIOMAPPING1, &(LoRaPara.RegBuff.RegDioMapping1), 2 );
|
||||
SX1276ReadBuffer(REG_LR_OPMODE, (uint8_t*)&(LoRaPara.RegBuff) + 1, SIZE_OF_REGISTERS);
|
||||
LoRaPara.State = SX1276_BUSY;
|
||||
SX1276Read(REG_LR_VERSION, &(LoRaPara.RegBuff.RegVersion));
|
||||
SX1276ReadBuffer(REG_LR_OPMODE, (uint8_t*)&(LoRaPara.RegBuff) + 1, SIZE_OF_REGISTERS);
|
||||
LoRaPara.RegBuff.RegLna = RFLR_LNA_GAIN_G1;
|
||||
SX1276WriteBuffer(REG_LR_OPMODE, (uint8_t*)&(LoRaPara.RegBuff) + 1, SIZE_OF_REGISTERS);
|
||||
|
||||
// set the RF settings
|
||||
//SX1276LoRaWriteChannel(LoRaPara.ucChannel);
|
||||
SX1276LoRaSetFreqHz(LoRaPara.dwFreqHz);
|
||||
//REG_LR_MODEMCONFIG1
|
||||
SX1276Read(REG_LR_MODEMCONFIG1, &(LoRaPara.RegBuff.RegModemConfig1));
|
||||
//SignalBandwidth
|
||||
LoRaPara.RegBuff.RegModemConfig1 = (LoRaPara.RegBuff.RegModemConfig1 & RFLR_MODEMCONFIG1_BW_MASK ) | LoRaPara.SignalBw;
|
||||
//ErrorCoding
|
||||
LoRaPara.RegBuff.RegModemConfig1 = (LoRaPara.RegBuff.RegModemConfig1 & RFLR_MODEMCONFIG1_CODINGRATE_MASK ) | LoRaPara.ErrorCoding;
|
||||
//IMPLICITHEADER
|
||||
LoRaPara.RegBuff.RegModemConfig1 = LoRaPara.RegBuff.RegModemConfig1 | RFLR_MODEMCONFIG1_IMPLICITHEADER_ON;
|
||||
SX1276Write(REG_LR_MODEMCONFIG1, LoRaPara.RegBuff.RegModemConfig1);
|
||||
//REG_LR_MODEMCONFIG2
|
||||
SX1276Read(REG_LR_MODEMCONFIG2, &(LoRaPara.RegBuff.RegModemConfig2));
|
||||
//SpreadingFactor
|
||||
if( LoRaPara.SpreadFactor == SX1276_SF_64){
|
||||
SX1276LoRaSetNbTrigPeaks(5);
|
||||
SX1276LoRaSetLowDatarateOptimize(true);
|
||||
}
|
||||
else{
|
||||
SX1276LoRaSetNbTrigPeaks(3);
|
||||
SX1276LoRaSetLowDatarateOptimize(false); //低数据速率设置
|
||||
}
|
||||
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_SF_MASK ) | LoRaPara.SpreadFactor;
|
||||
//PacketCrcOn
|
||||
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK ) | SX1276_CRC_ON; //SX1276_CRC_OFF
|
||||
|
||||
SX1276Write(REG_LR_MODEMCONFIG2, LoRaPara.RegBuff.RegModemConfig2);
|
||||
uint8_t Config2 = 0;
|
||||
SX1276Read(REG_LR_MODEMCONFIG2, &Config2);
|
||||
if(LoRaPara.RegBuff.RegModemConfig2 == Config2) {
|
||||
Debug_Printf("Lora OK!\r\n");
|
||||
}
|
||||
else {
|
||||
Debug_Printf("Lora Error!\r\n");
|
||||
}
|
||||
SX1276LoRaSetSymbTimeout(0x3FF);
|
||||
LoRaPara.RegBuff.RegPreambleMsb= (LoRaPara.RegPreamble >> 8) & 0x00ff;
|
||||
LoRaPara.RegBuff.RegPreambleLsb= LoRaPara.RegPreamble & 0x00ff;
|
||||
SX1276Write(REG_LR_PREAMBLEMSB, LoRaPara.RegBuff.RegPreambleMsb);
|
||||
SX1276Write(REG_LR_PREAMBLELSB, LoRaPara.RegBuff.RegPreambleLsb);
|
||||
SX1276Write(REG_LR_PAYLOADLENGTH, LORA_BUFF_SIZE);
|
||||
SX1276Write(REG_LR_PAYLOADMAXLENGTH, LORA_BUFF_SIZE);
|
||||
LoRaPara.RegBuff.RegPayloadLength = LORA_BUFF_SIZE;
|
||||
|
||||
#ifndef USE_LORA_860_PA
|
||||
if(LoRaPara.dwFreqHz > 860000000 ){
|
||||
SX1276LoRaSetPAOutput(RFLR_PACONFIG_PASELECT_RFO);
|
||||
SX1276LoRaSetPa20dBm(false);
|
||||
LoRaPara.ucPower = 14;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
SX1276LoRaSetPAOutput(RFLR_PACONFIG_PASELECT_PABOOST);
|
||||
SX1276LoRaSetPa20dBm(true);
|
||||
LoRaPara.ucPower = 20;
|
||||
}
|
||||
SX1276LoRaSetRfPower(LoRaPara.ucPower);
|
||||
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
|
||||
Sx1276LoRaEnterRx();
|
||||
}
|
||||
|
||||
void IsrSx1276LoRaTxRx(GateWayPara GateWay)
|
||||
{
|
||||
switch (LoRaPara.State){
|
||||
case SX1276_IDLE:
|
||||
case SX1276_RX:
|
||||
// Clear Irq
|
||||
LORA_RXLED_ON();
|
||||
do {
|
||||
SX1276Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXDONE);
|
||||
SX1276Read(REG_LR_IRQFLAGS, &(LoRaPara.RegBuff.RegIrqFlags));
|
||||
if((LoRaPara.RegBuff.RegIrqFlags & RFLR_IRQFLAGS_RXDONE) != RFLR_IRQFLAGS_RXDONE)
|
||||
break;
|
||||
}while(1);
|
||||
if((LoRaPara.RegBuff.RegIrqFlags & RFLR_IRQFLAGS_PAYLOADCRCERROR ) == RFLR_IRQFLAGS_PAYLOADCRCERROR) {
|
||||
// Clear Irq
|
||||
SX1276Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_PAYLOADCRCERROR);
|
||||
LoRaPara.State = SX1276_IDLE;
|
||||
break;
|
||||
}
|
||||
SX1276Read(REG_LR_PKTSNRVALUE, &(LoRaPara.RegBuff.RegPktSnrValue));
|
||||
SX1276Read(REG_LR_RSSIVALUE, &(LoRaPara.RegBuff.RegRssiValue));
|
||||
SX1276Read(REG_LR_PKTRSSIVALUE, &(LoRaPara.RegBuff.RegPktRssiValue));
|
||||
SX1276Read(REG_LR_FIFORXCURRENTADDR, &(LoRaPara.RegBuff.RegFifoRxCurrentAddr));
|
||||
SX1276Read(REG_LR_NBRXBYTES, &(LoRaPara.RegBuff.RegNbRxBytes));
|
||||
LoRaPara.ucRxPacketSize = LoRaPara.RegBuff.RegNbRxBytes;
|
||||
LoRaPara.RegBuff.RegFifoAddrPtr = LoRaPara.RegBuff.RegFifoRxCurrentAddr;
|
||||
SX1276Write(REG_LR_FIFOADDRPTR, LoRaPara.RegBuff.RegFifoAddrPtr);
|
||||
SX1276ReadFifo(LoRaPara.RxTxBuff, (LoRaPara.ucRxPacketSize > LORA_BUFF_SIZE) ? LORA_BUFF_SIZE : LoRaPara.ucRxPacketSize);
|
||||
uint8_t ucLen;
|
||||
if(LoRaPara.ucRxPacketSize < LORA_BUFF_SIZE) {
|
||||
ucLen= LoRaPara.ucRxPacketSize;
|
||||
}
|
||||
else {
|
||||
ucLen= LORA_BUFF_SIZE;
|
||||
}
|
||||
LoRaPara.RxTxBuff[ucLen] = 0;
|
||||
if(LoRaPara.RxCallBack != NULL)
|
||||
LoRaPara.RxRet = LoRaPara.RxCallBack(GateWay, LoRaPara.RxTxBuff, ucLen);
|
||||
|
||||
LoRaPara.ucRxPacketSize = 0;
|
||||
LoRaPara.State = SX1276_IDLE;
|
||||
LORA_RXLED_OFF();
|
||||
break;
|
||||
case SX1276_TX:
|
||||
// Clear Irq
|
||||
SX1276Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_TXDONE);
|
||||
LORA_TXLED_OFF();
|
||||
Sx1276LoRaEnterRx();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Sx1276LoRaLoopHandler(GateWayPara GateWay)
|
||||
{
|
||||
if(LORA_GETDIO0() > 0){ // RxDone or TxDone
|
||||
IsrSx1276LoRaTxRx(GateWay);
|
||||
}
|
||||
}
|
||||
void Sx1276LoRaSendBuffer(uint8_t* pucBuff, uint16_t ucLen)
|
||||
{
|
||||
uint16_t TxDoneWaitCnt = 0;
|
||||
/*LoRa发送是异步的(TxDone中断结束,IsrSx1276LoRaTxRx中将State恢复为IDLE)。
|
||||
若上一帧仍在发送时再次调用本函数,下面设置STANDBY会把正在发送的帧截断,
|
||||
导致先发出的应答丢失(传感器收不到注册应答),故先等待上一帧发送完成*/
|
||||
while(LoRaPara.State == SX1276_TX && TxDoneWaitCnt < 2000) {
|
||||
Ddl_Delay1ms(1);
|
||||
TxDoneWaitCnt++;
|
||||
}
|
||||
LoRaPara.State = SX1276_BUSY;
|
||||
if (ucLen > LORA_BUFF_SIZE){
|
||||
ucLen = LORA_BUFF_SIZE;
|
||||
}
|
||||
LoRaPara.ucTxPacketSize = ucLen;
|
||||
while(ucLen--){
|
||||
LoRaPara.RxTxBuff[ucLen] = pucBuff[ucLen];
|
||||
};
|
||||
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
|
||||
LoRaPara.RegBuff.RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT | RFLR_IRQFLAGS_RXDONE | RFLR_IRQFLAGS_PAYLOADCRCERROR | RFLR_IRQFLAGS_VALIDHEADER;
|
||||
//LoRaPara.RegBuff.RegHopPeriod = 0;
|
||||
//SX1276Write(REG_LR_HOPPERIOD, LoRaPara.RegBuff.RegHopPeriod);
|
||||
SX1276Write(REG_LR_IRQFLAGSMASK, LoRaPara.RegBuff.RegIrqFlagsMask);
|
||||
// Initializes the payload size
|
||||
LoRaPara.RegBuff.RegPayloadLength = LoRaPara.ucTxPacketSize;
|
||||
SX1276Write(REG_LR_PAYLOADLENGTH, LoRaPara.RegBuff.RegPayloadLength);
|
||||
LoRaPara.RegBuff.RegFifoTxBaseAddr = 0x00; // Full buffer used for Tx
|
||||
SX1276Write(REG_LR_FIFOTXBASEADDR, LoRaPara.RegBuff.RegFifoTxBaseAddr);
|
||||
LoRaPara.RegBuff.RegFifoAddrPtr = LoRaPara.RegBuff.RegFifoTxBaseAddr;
|
||||
SX1276Write(REG_LR_FIFOADDRPTR, LoRaPara.RegBuff.RegFifoAddrPtr);
|
||||
// Write payload buffer to LORA modem
|
||||
SX1276WriteFifo(LoRaPara.RxTxBuff, LoRaPara.RegBuff.RegPayloadLength);
|
||||
// TxDone RxTimeout FhssChangeChannel ValidHeader
|
||||
LoRaPara.RegBuff.RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_01 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_01;
|
||||
// PllLock Mode Ready
|
||||
LoRaPara.RegBuff.RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_01 | RFLR_DIOMAPPING2_DIO5_00;
|
||||
SX1276WriteBuffer(REG_LR_DIOMAPPING1, &(LoRaPara.RegBuff.RegDioMapping1), 2);
|
||||
SX1276LoRaSetOpMode(RFLR_OPMODE_TRANSMITTER);
|
||||
uint8_t temp;
|
||||
SX1276Read(REG_LR_IRQFLAGS, &temp);
|
||||
LORA_TXLED_ON();
|
||||
LoRaPara.State = SX1276_TX;
|
||||
}
|
||||
|
||||
void Sx1276LoRaSleep(void)
|
||||
{
|
||||
SX1276LoRaSetOpMode(RFLR_OPMODE_SLEEP);//RFLR_OPMODE_STANDBY
|
||||
}
|
||||
|
||||
void Sx1276LoRaWakeup(void)
|
||||
{
|
||||
Sx1276LoRaEnterRx();
|
||||
}
|
||||
|
||||
////////////////////////////////////////
|
||||
//配置本层参数的函数
|
||||
//频道表
|
||||
const uint32_t gdwSx1276ChannelTbl[SX1276_CHANNEL_MAX]={
|
||||
CH0, CH1, CH2, CH3, CH4, CH5, CH6, CH7, CH8, CH9,
|
||||
CH10, CH11, CH12, CH13, CH14, CH15, CH16, CH17, CH18, CH19,
|
||||
CH20, CH21, CH22, CH23, CH24, CH25, CH26, CH27, CH28, CH29,
|
||||
CH30, CH31, CH32, CH33, CH34, CH35, CH36, CH37, CH38, CH39,
|
||||
CH40, CH41, CH42, CH43, CH44, CH45
|
||||
};
|
||||
|
||||
//LORAPT_CHANNEL
|
||||
uint8_t SX1276LoRaReadChannel(void)
|
||||
{
|
||||
return LoRaPara.ucChannel;
|
||||
}
|
||||
|
||||
bool SX1276LoRaWriteChannel(uint8_t Channel)
|
||||
{
|
||||
if(Channel >= SX1276_CHANNEL_MAX) {
|
||||
return false;
|
||||
}
|
||||
|
||||
LoRaPara.dwFreqHz = gdwSx1276ChannelTbl[Channel];
|
||||
SX1276LoRaSetFreqHz(LoRaPara.dwFreqHz);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//LORAPT_FREQ,
|
||||
uint32_t SX1276LoRaReadFreq(void)
|
||||
{
|
||||
return LoRaPara.dwFreqHz;
|
||||
}
|
||||
|
||||
void SX1276LoRaWriteFreq(uint32_t Freq)
|
||||
{
|
||||
SX1276LoRaSetFreqHz(Freq);
|
||||
}
|
||||
|
||||
//LORAPT_BW,
|
||||
uint32_t SX1276LoRaReadBw(void)
|
||||
{
|
||||
return LoRaPara.SignalBw;
|
||||
}
|
||||
|
||||
void SX1276LoRaWriteBw(Sx1276BwType SignalBw)
|
||||
{
|
||||
LoRaPara.SignalBw = SignalBw;
|
||||
SX1276LoRaSetSignalBandwidth(SignalBw);
|
||||
}
|
||||
|
||||
//LORAPT_SF,
|
||||
uint8_t SX1276LoRaReadSf(void)
|
||||
{
|
||||
return LoRaPara.SpreadFactor;
|
||||
}
|
||||
|
||||
void SX1276LoRaWriteSf(Sx1276SpreadFactorType SpreadFactor)
|
||||
{
|
||||
LoRaPara.SpreadFactor = SpreadFactor;
|
||||
SX1276LoRaSetSpreadingFactor(LoRaPara.SpreadFactor);
|
||||
}
|
||||
|
||||
//LORAPT_EC,
|
||||
uint8_t SX1276LoRaReadEc(void)
|
||||
{
|
||||
return LoRaPara.ErrorCoding;
|
||||
}
|
||||
|
||||
void SX1276LoRaWriteEc(Sx1276ErrorCodingType ErrorCoding)
|
||||
{
|
||||
LoRaPara.ErrorCoding = ErrorCoding;
|
||||
SX1276LoRaSetErrorCoding(ErrorCoding);
|
||||
}
|
||||
|
||||
//LORAPT_RSSI,
|
||||
uint32_t SX1276LoRaParaReadRssi(void)
|
||||
{
|
||||
uint32_t rssi;
|
||||
|
||||
SX1276Read(REG_LR_PKTRSSIVALUE, &(LoRaPara.RegBuff.RegPktRssiValue));
|
||||
SX1276Read(REG_LR_RSSIVALUE, &(LoRaPara.RegBuff.RegRssiValue));
|
||||
rssi = (uint16_t)(LoRaPara.RegBuff.RegPktSnrValue)<<16;
|
||||
rssi |= (uint16_t)(LoRaPara.RegBuff.RegRssiValue)<<8;
|
||||
rssi |= LoRaPara.RegBuff.RegPktRssiValue;
|
||||
return rssi;
|
||||
}
|
||||
|
||||
uint8_t SX1276LoRaReadRssiPkt(void)
|
||||
{
|
||||
uint8_t RssiPkt;
|
||||
|
||||
SX1276Read(REG_LR_PKTRSSIVALUE, &LoRaPara.RegBuff.RegPktRssiValue);
|
||||
RssiPkt = LoRaPara.RegBuff.RegPktRssiValue;
|
||||
return RssiPkt;
|
||||
}
|
||||
|
||||
//LORAPT_POWER,
|
||||
void SX1276LoRaWritePwr(int8_t Pwr)
|
||||
{
|
||||
SX1276LoRaSetRfPower(Pwr);
|
||||
}
|
||||
|
||||
//LORAPT_SET_RX,
|
||||
void SX1276LoRaWriteRx(void)
|
||||
{
|
||||
Sx1276LoRaEnterRx();
|
||||
}
|
||||
|
||||
//LORAPT_SET_SLEEP,true-Sleep, false-Wakeup
|
||||
void SX1276LoRaWriteSleep(bool Sleep)
|
||||
{
|
||||
if(Sleep){
|
||||
Sx1276LoRaSleep();
|
||||
}
|
||||
else {
|
||||
Sx1276LoRaWakeup();
|
||||
}
|
||||
}
|
||||
|
||||
Sx1276StateType_t SX1276LoRaReadStatus(void)
|
||||
{
|
||||
return LoRaPara.State;
|
||||
}
|
||||
|
||||
///////////////RSSI Calc///////////////
|
||||
void SX1276LoCalcRssiSnr(int16_t *pswRssi, int8_t *psbSnr)
|
||||
{
|
||||
int8_t sbSnr= LoRaPara.RegBuff.RegPktSnrValue & 0x80 ? (-1)*((int8_t)(((~LoRaPara.RegBuff.RegPktSnrValue+ 1)& 0xFF)/4)): (~LoRaPara.RegBuff.RegPktSnrValue& 0xFF)/4;
|
||||
if (sbSnr > 0) {
|
||||
*pswRssi= RSSI_OFFSET_LF+ LoRaPara.RegBuff.RegPktRssiValue;
|
||||
}
|
||||
else {
|
||||
*pswRssi= NOISE_ABSOLUTE_ZERO + 10 + SIGNAL_BW_LOG_125KHZ + NOISE_FIGURE_LF + sbSnr;
|
||||
}
|
||||
*psbSnr= sbSnr;
|
||||
}
|
||||
|
||||
int GetSx1276RxRetValue(void)
|
||||
{
|
||||
return LoRaPara.RxRet;
|
||||
}
|
||||
|
||||
void Sx1276RxRetValue(void)
|
||||
{
|
||||
LoRaPara.RxRet = -1;
|
||||
}
|
||||
|
||||
bool LoraSetChannel(uint8_t Channel)
|
||||
{
|
||||
if(Channel > 16)
|
||||
return false;
|
||||
LoRaPara.ucChannel = Channel;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LoraSetPower(uint8_t Power)
|
||||
{
|
||||
if(Power > 20)
|
||||
return false;
|
||||
LoRaPara.ucPower = Power;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LoraSetSignalBw(uint8_t SignalBw)
|
||||
{
|
||||
if(SignalBw > 9)
|
||||
return false;
|
||||
LoRaPara.SignalBw = (SignalBw << 4);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LoraSetSpreadFactor(uint8_t SpreadFactor)
|
||||
{
|
||||
if(SpreadFactor < 4 || SpreadFactor > 12)
|
||||
return false;
|
||||
LoRaPara.SpreadFactor = (SpreadFactor << 4);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LoraSetErrorCoding(uint8_t ErrorCoding)
|
||||
{
|
||||
if(ErrorCoding == 0 || ErrorCoding > 4)
|
||||
return false;
|
||||
LoRaPara.ErrorCoding = ErrorCoding << 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LoraSetRegPreamble(uint8_t RegPreamble)
|
||||
{
|
||||
LoRaPara.RegPreamble = RegPreamble;
|
||||
return true;
|
||||
}
|
||||
bool LoraSetFreqCent(uint32_t FreqCent)
|
||||
{
|
||||
if(FreqCent < 470100000 || FreqCent > 492600000)
|
||||
return false;
|
||||
LoRaPara.dwFreqHz = FreqCent;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,853 @@
|
||||
#ifndef __SX127X_H
|
||||
#define __SX127X_H
|
||||
|
||||
#include "bsp.h"
|
||||
#include "Public.h"
|
||||
#include "main.h"
|
||||
|
||||
//Constant values need to compute the RSSI value
|
||||
#define RSSI_OFFSET_LF -164
|
||||
#define RSSI_OFFSET_HF -157
|
||||
#define NOISE_ABSOLUTE_ZERO -174
|
||||
#define NOISE_FIGURE_LF 4
|
||||
#define NOISE_FIGURE_HF 6
|
||||
#define SIGNAL_BW_LOG_125KHZ 5
|
||||
|
||||
//SX1276 definitions
|
||||
#define XTAL_FREQ 32000000
|
||||
#define FREQ_STEP 61.03515625
|
||||
|
||||
//SX1276 Internal registers Address
|
||||
#define REG_LR_FIFO 0x00
|
||||
// Common settings
|
||||
#define REG_LR_OPMODE 0x01
|
||||
#define REG_LR_BANDSETTING 0x04
|
||||
#define REG_LR_FRFMSB 0x06
|
||||
#define REG_LR_FRFMID 0x07
|
||||
#define REG_LR_FRFLSB 0x08
|
||||
// Tx settings
|
||||
#define REG_LR_PACONFIG 0x09
|
||||
#define REG_LR_PARAMP 0x0A
|
||||
#define REG_LR_OCP 0x0B
|
||||
// Rx settings
|
||||
#define REG_LR_LNA 0x0C
|
||||
// LoRa registers
|
||||
#define REG_LR_FIFOADDRPTR 0x0D
|
||||
#define REG_LR_FIFOTXBASEADDR 0x0E
|
||||
#define REG_LR_FIFORXBASEADDR 0x0F
|
||||
#define REG_LR_FIFORXCURRENTADDR 0x10
|
||||
#define REG_LR_IRQFLAGSMASK 0x11
|
||||
#define REG_LR_IRQFLAGS 0x12
|
||||
#define REG_LR_NBRXBYTES 0x13
|
||||
#define REG_LR_RXHEADERCNTVALUEMSB 0x14
|
||||
#define REG_LR_RXHEADERCNTVALUELSB 0x15
|
||||
#define REG_LR_RXPACKETCNTVALUEMSB 0x16
|
||||
#define REG_LR_RXPACKETCNTVALUELSB 0x17
|
||||
#define REG_LR_MODEMSTAT 0x18
|
||||
#define REG_LR_PKTSNRVALUE 0x19
|
||||
#define REG_LR_PKTRSSIVALUE 0x1A
|
||||
#define REG_LR_RSSIVALUE 0x1B
|
||||
#define REG_LR_HOPCHANNEL 0x1C
|
||||
#define REG_LR_MODEMCONFIG1 0x1D
|
||||
#define REG_LR_MODEMCONFIG2 0x1E
|
||||
#define REG_LR_SYMBTIMEOUTLSB 0x1F
|
||||
#define REG_LR_PREAMBLEMSB 0x20
|
||||
#define REG_LR_PREAMBLELSB 0x21
|
||||
#define REG_LR_PAYLOADLENGTH 0x22
|
||||
#define REG_LR_PAYLOADMAXLENGTH 0x23
|
||||
#define REG_LR_HOPPERIOD 0x24
|
||||
#define REG_LR_FIFORXBYTEADDR 0x25
|
||||
#define REG_LR_MODEMCONFIG3 0x26
|
||||
// end of documented register in datasheet
|
||||
// I/O settings
|
||||
#define REG_LR_DIOMAPPING1 0x40
|
||||
#define REG_LR_DIOMAPPING2 0x41
|
||||
// Version
|
||||
#define REG_LR_VERSION 0x42
|
||||
// Additional settings
|
||||
#define REG_LR_PLLHOP 0x44
|
||||
#define REG_LR_TCXO 0x4B
|
||||
#define REG_LR_PADAC 0x4D
|
||||
#define REG_LR_FORMERTEMP 0x5B
|
||||
#define REG_LR_BITRATEFRAC 0x5D
|
||||
#define REG_LR_AGCREF 0x61
|
||||
#define REG_LR_AGCTHRESH1 0x62
|
||||
#define REG_LR_AGCTHRESH2 0x63
|
||||
#define REG_LR_AGCTHRESH3 0x64
|
||||
|
||||
//RegOpMode
|
||||
typedef enum{
|
||||
RFLR_OPMODE_LONGRANGEMODE_MASK =0x7F,
|
||||
RFLR_OPMODE_LONGRANGEMODE_OFF =0x00, // Default
|
||||
RFLR_OPMODE_LONGRANGEMODE_ON =0x80,
|
||||
RFLR_OPMODE_ACCESSSHAREDREG_MASK =0xBF,
|
||||
RFLR_OPMODE_ACCESSSHAREDREG_ENABLE =0x40,
|
||||
RFLR_OPMODE_ACCESSSHAREDREG_DISABLE =0x00, // Default
|
||||
RFLR_OPMODE_FREQMODE_ACCESS_MASK =0xF7,
|
||||
RFLR_OPMODE_FREQMODE_ACCESS_LF =0x08, // Default
|
||||
RFLR_OPMODE_FREQMODE_ACCESS_HF =0x00,
|
||||
RFLR_OPMODE_MASK =0xF8,
|
||||
RFLR_OPMODE_SLEEP =0x00,
|
||||
RFLR_OPMODE_STANDBY =0x01, // Default
|
||||
RFLR_OPMODE_SYNTHESIZER_TX =0x02,
|
||||
RFLR_OPMODE_TRANSMITTER =0x03,
|
||||
RFLR_OPMODE_SYNTHESIZER_RX =0x04,
|
||||
RFLR_OPMODE_RECEIVER =0x05,
|
||||
// LoRa specific modes
|
||||
RFLR_OPMODE_RECEIVER_SINGLE =0x06,
|
||||
RFLR_OPMODE_CAD =0x07
|
||||
}Sx1276OpModeType;
|
||||
|
||||
//RegBandSetting
|
||||
#define RFLR_BANDSETTING_MASK 0x3F
|
||||
#define RFLR_BANDSETTING_AUTO 0x00 // Default
|
||||
#define RFLR_BANDSETTING_DIV_BY_1 0x40
|
||||
#define RFLR_BANDSETTING_DIV_BY_2 0x80
|
||||
#define RFLR_BANDSETTING_DIV_BY_6 0xC0
|
||||
|
||||
//RegFrf (MHz)
|
||||
#define RFLR_FRFMSB_434_MHZ 0x6C // Default
|
||||
#define RFLR_FRFMID_434_MHZ 0x80 // Default
|
||||
#define RFLR_FRFLSB_434_MHZ 0x00 // Default
|
||||
#define RFLR_FRFMSB_863_MHZ 0xD7
|
||||
#define RFLR_FRFMID_863_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_863_MHZ 0x00
|
||||
#define RFLR_FRFMSB_864_MHZ 0xD8
|
||||
#define RFLR_FRFMID_864_MHZ 0x00
|
||||
#define RFLR_FRFLSB_864_MHZ 0x00
|
||||
#define RFLR_FRFMSB_865_MHZ 0xD8
|
||||
#define RFLR_FRFMID_865_MHZ 0x40
|
||||
#define RFLR_FRFLSB_865_MHZ 0x00
|
||||
#define RFLR_FRFMSB_866_MHZ 0xD8
|
||||
#define RFLR_FRFMID_866_MHZ 0x80
|
||||
#define RFLR_FRFLSB_866_MHZ 0x00
|
||||
#define RFLR_FRFMSB_867_MHZ 0xD8
|
||||
#define RFLR_FRFMID_867_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_867_MHZ 0x00
|
||||
#define RFLR_FRFMSB_868_MHZ 0xD9
|
||||
#define RFLR_FRFMID_868_MHZ 0x00
|
||||
#define RFLR_FRFLSB_868_MHZ 0x00
|
||||
#define RFLR_FRFMSB_869_MHZ 0xD9
|
||||
#define RFLR_FRFMID_869_MHZ 0x40
|
||||
#define RFLR_FRFLSB_869_MHZ 0x00
|
||||
#define RFLR_FRFMSB_870_MHZ 0xD9
|
||||
#define RFLR_FRFMID_870_MHZ 0x80
|
||||
#define RFLR_FRFLSB_870_MHZ 0x00
|
||||
#define RFLR_FRFMSB_902_MHZ 0xE1
|
||||
#define RFLR_FRFMID_902_MHZ 0x80
|
||||
#define RFLR_FRFLSB_902_MHZ 0x00
|
||||
#define RFLR_FRFMSB_903_MHZ 0xE1
|
||||
#define RFLR_FRFMID_903_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_903_MHZ 0x00
|
||||
#define RFLR_FRFMSB_904_MHZ 0xE2
|
||||
#define RFLR_FRFMID_904_MHZ 0x00
|
||||
#define RFLR_FRFLSB_904_MHZ 0x00
|
||||
#define RFLR_FRFMSB_905_MHZ 0xE2
|
||||
#define RFLR_FRFMID_905_MHZ 0x40
|
||||
#define RFLR_FRFLSB_905_MHZ 0x00
|
||||
#define RFLR_FRFMSB_906_MHZ 0xE2
|
||||
#define RFLR_FRFMID_906_MHZ 0x80
|
||||
#define RFLR_FRFLSB_906_MHZ 0x00
|
||||
#define RFLR_FRFMSB_907_MHZ 0xE2
|
||||
#define RFLR_FRFMID_907_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_907_MHZ 0x00
|
||||
#define RFLR_FRFMSB_908_MHZ 0xE3
|
||||
#define RFLR_FRFMID_908_MHZ 0x00
|
||||
#define RFLR_FRFLSB_908_MHZ 0x00
|
||||
#define RFLR_FRFMSB_909_MHZ 0xE3
|
||||
#define RFLR_FRFMID_909_MHZ 0x40
|
||||
#define RFLR_FRFLSB_909_MHZ 0x00
|
||||
#define RFLR_FRFMSB_910_MHZ 0xE3
|
||||
#define RFLR_FRFMID_910_MHZ 0x80
|
||||
#define RFLR_FRFLSB_910_MHZ 0x00
|
||||
#define RFLR_FRFMSB_911_MHZ 0xE3
|
||||
#define RFLR_FRFMID_911_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_911_MHZ 0x00
|
||||
#define RFLR_FRFMSB_912_MHZ 0xE4
|
||||
#define RFLR_FRFMID_912_MHZ 0x00
|
||||
#define RFLR_FRFLSB_912_MHZ 0x00
|
||||
#define RFLR_FRFMSB_913_MHZ 0xE4
|
||||
#define RFLR_FRFMID_913_MHZ 0x40
|
||||
#define RFLR_FRFLSB_913_MHZ 0x00
|
||||
#define RFLR_FRFMSB_914_MHZ 0xE4
|
||||
#define RFLR_FRFMID_914_MHZ 0x80
|
||||
#define RFLR_FRFLSB_914_MHZ 0x00
|
||||
#define RFLR_FRFMSB_915_MHZ 0xE4 // Default
|
||||
#define RFLR_FRFMID_915_MHZ 0xC0 // Default
|
||||
#define RFLR_FRFLSB_915_MHZ 0x00 // Default
|
||||
#define RFLR_FRFMSB_916_MHZ 0xE5
|
||||
#define RFLR_FRFMID_916_MHZ 0x00
|
||||
#define RFLR_FRFLSB_916_MHZ 0x00
|
||||
#define RFLR_FRFMSB_917_MHZ 0xE5
|
||||
#define RFLR_FRFMID_917_MHZ 0x40
|
||||
#define RFLR_FRFLSB_917_MHZ 0x00
|
||||
#define RFLR_FRFMSB_918_MHZ 0xE5
|
||||
#define RFLR_FRFMID_918_MHZ 0x80
|
||||
#define RFLR_FRFLSB_918_MHZ 0x00
|
||||
#define RFLR_FRFMSB_919_MHZ 0xE5
|
||||
#define RFLR_FRFMID_919_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_919_MHZ 0x00
|
||||
#define RFLR_FRFMSB_920_MHZ 0xE6
|
||||
#define RFLR_FRFMID_920_MHZ 0x00
|
||||
#define RFLR_FRFLSB_920_MHZ 0x00
|
||||
#define RFLR_FRFMSB_921_MHZ 0xE6
|
||||
#define RFLR_FRFMID_921_MHZ 0x40
|
||||
#define RFLR_FRFLSB_921_MHZ 0x00
|
||||
#define RFLR_FRFMSB_922_MHZ 0xE6
|
||||
#define RFLR_FRFMID_922_MHZ 0x80
|
||||
#define RFLR_FRFLSB_922_MHZ 0x00
|
||||
#define RFLR_FRFMSB_923_MHZ 0xE6
|
||||
#define RFLR_FRFMID_923_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_923_MHZ 0x00
|
||||
#define RFLR_FRFMSB_924_MHZ 0xE7
|
||||
#define RFLR_FRFMID_924_MHZ 0x00
|
||||
#define RFLR_FRFLSB_924_MHZ 0x00
|
||||
#define RFLR_FRFMSB_925_MHZ 0xE7
|
||||
#define RFLR_FRFMID_925_MHZ 0x40
|
||||
#define RFLR_FRFLSB_925_MHZ 0x00
|
||||
#define RFLR_FRFMSB_926_MHZ 0xE7
|
||||
#define RFLR_FRFMID_926_MHZ 0x80
|
||||
#define RFLR_FRFLSB_926_MHZ 0x00
|
||||
#define RFLR_FRFMSB_927_MHZ 0xE7
|
||||
#define RFLR_FRFMID_927_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_927_MHZ 0x00
|
||||
#define RFLR_FRFMSB_928_MHZ 0xE8
|
||||
#define RFLR_FRFMID_928_MHZ 0x00
|
||||
#define RFLR_FRFLSB_928_MHZ 0x00
|
||||
|
||||
//RegPaConfig
|
||||
#define RFLR_PACONFIG_PASELECT_MASK 0x7F
|
||||
#define RFLR_PACONFIG_PASELECT_PABOOST 0x80
|
||||
#define RFLR_PACONFIG_PASELECT_RFO 0x00 // Default
|
||||
#define RFLR_PACONFIG_MAX_POWER_MASK 0x8F
|
||||
#define RFLR_PACONFIG_OUTPUTPOWER_MASK 0xF0
|
||||
|
||||
//RegPaRamp
|
||||
#define RFLR_PARAMP_TXBANDFORCE_MASK 0xEF
|
||||
#define RFLR_PARAMP_TXBANDFORCE_BAND_SEL 0x10
|
||||
#define RFLR_PARAMP_TXBANDFORCE_AUTO 0x00 // Default
|
||||
#define RFLR_PARAMP_MASK 0xF0
|
||||
#define RFLR_PARAMP_3400_US 0x00
|
||||
#define RFLR_PARAMP_2000_US 0x01
|
||||
#define RFLR_PARAMP_1000_US 0x02
|
||||
#define RFLR_PARAMP_0500_US 0x03
|
||||
#define RFLR_PARAMP_0250_US 0x04
|
||||
#define RFLR_PARAMP_0125_US 0x05
|
||||
#define RFLR_PARAMP_0100_US 0x06
|
||||
#define RFLR_PARAMP_0062_US 0x07
|
||||
#define RFLR_PARAMP_0050_US 0x08
|
||||
#define RFLR_PARAMP_0040_US 0x09 // Default
|
||||
#define RFLR_PARAMP_0031_US 0x0A
|
||||
#define RFLR_PARAMP_0025_US 0x0B
|
||||
#define RFLR_PARAMP_0020_US 0x0C
|
||||
#define RFLR_PARAMP_0015_US 0x0D
|
||||
#define RFLR_PARAMP_0012_US 0x0E
|
||||
#define RFLR_PARAMP_0010_US 0x0F
|
||||
|
||||
//RegOcp
|
||||
#define RFLR_OCP_MASK 0xDF
|
||||
#define RFLR_OCP_ON 0x20 // Default
|
||||
#define RFLR_OCP_OFF 0x00
|
||||
#define RFLR_OCP_TRIM_MASK 0xE0
|
||||
#define RFLR_OCP_TRIM_045_MA 0x00
|
||||
#define RFLR_OCP_TRIM_050_MA 0x01
|
||||
#define RFLR_OCP_TRIM_055_MA 0x02
|
||||
#define RFLR_OCP_TRIM_060_MA 0x03
|
||||
#define RFLR_OCP_TRIM_065_MA 0x04
|
||||
#define RFLR_OCP_TRIM_070_MA 0x05
|
||||
#define RFLR_OCP_TRIM_075_MA 0x06
|
||||
#define RFLR_OCP_TRIM_080_MA 0x07
|
||||
#define RFLR_OCP_TRIM_085_MA 0x08
|
||||
#define RFLR_OCP_TRIM_090_MA 0x09
|
||||
#define RFLR_OCP_TRIM_095_MA 0x0A
|
||||
#define RFLR_OCP_TRIM_100_MA 0x0B // Default
|
||||
#define RFLR_OCP_TRIM_105_MA 0x0C
|
||||
#define RFLR_OCP_TRIM_110_MA 0x0D
|
||||
#define RFLR_OCP_TRIM_115_MA 0x0E
|
||||
#define RFLR_OCP_TRIM_120_MA 0x0F
|
||||
#define RFLR_OCP_TRIM_130_MA 0x10
|
||||
#define RFLR_OCP_TRIM_140_MA 0x11
|
||||
#define RFLR_OCP_TRIM_150_MA 0x12
|
||||
#define RFLR_OCP_TRIM_160_MA 0x13
|
||||
#define RFLR_OCP_TRIM_170_MA 0x14
|
||||
#define RFLR_OCP_TRIM_180_MA 0x15
|
||||
#define RFLR_OCP_TRIM_190_MA 0x16
|
||||
#define RFLR_OCP_TRIM_200_MA 0x17
|
||||
#define RFLR_OCP_TRIM_210_MA 0x18
|
||||
#define RFLR_OCP_TRIM_220_MA 0x19
|
||||
#define RFLR_OCP_TRIM_230_MA 0x1A
|
||||
#define RFLR_OCP_TRIM_240_MA 0x1B
|
||||
|
||||
//RegLna
|
||||
#define RFLR_LNA_GAIN_MASK 0x1F
|
||||
#define RFLR_LNA_GAIN_G1 0x20 // Default
|
||||
#define RFLR_LNA_GAIN_G2 0x40
|
||||
#define RFLR_LNA_GAIN_G3 0x60
|
||||
#define RFLR_LNA_GAIN_G4 0x80
|
||||
#define RFLR_LNA_GAIN_G5 0xA0
|
||||
#define RFLR_LNA_GAIN_G6 0xC0
|
||||
#define RFLR_LNA_BOOST_LF_MASK 0xE7
|
||||
#define RFLR_LNA_BOOST_LF_DEFAULT 0x00 // Default
|
||||
#define RFLR_LNA_BOOST_LF_GAIN 0x08
|
||||
#define RFLR_LNA_BOOST_LF_IP3 0x10
|
||||
#define RFLR_LNA_BOOST_LF_BOOST 0x18
|
||||
#define RFLR_LNA_RXBANDFORCE_MASK 0xFB
|
||||
#define RFLR_LNA_RXBANDFORCE_BAND_SEL 0x04
|
||||
#define RFLR_LNA_RXBANDFORCE_AUTO 0x00 // Default
|
||||
#define RFLR_LNA_BOOST_HF_MASK 0xFC
|
||||
#define RFLR_LNA_BOOST_HF_OFF 0x00 // Default
|
||||
#define RFLR_LNA_BOOST_HF_ON 0x03
|
||||
|
||||
//RegFifoAddrPtr
|
||||
#define RFLR_FIFOADDRPTR 0x00 // Default
|
||||
|
||||
//RegFifoTxBaseAddr
|
||||
#define RFLR_FIFOTXBASEADDR 0x80 // Default
|
||||
|
||||
//RegFifoTxBaseAddr
|
||||
#define RFLR_FIFORXBASEADDR 0x00 // Default
|
||||
|
||||
//RegFifoRxCurrentAddr (Read Only)
|
||||
|
||||
//RegIrqFlagsMask
|
||||
#define RFLR_IRQFLAGS_RXTIMEOUT_MASK 0x80
|
||||
#define RFLR_IRQFLAGS_RXDONE_MASK 0x40
|
||||
#define RFLR_IRQFLAGS_PAYLOADCRCERROR_MASK 0x20
|
||||
#define RFLR_IRQFLAGS_VALIDHEADER_MASK 0x10
|
||||
#define RFLR_IRQFLAGS_TXDONE_MASK 0x08
|
||||
#define RFLR_IRQFLAGS_CADDONE_MASK 0x04
|
||||
#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL_MASK 0x02
|
||||
#define RFLR_IRQFLAGS_CADDETECTED_MASK 0x01
|
||||
|
||||
//RegIrqFlags
|
||||
#define RFLR_IRQFLAGS_RXTIMEOUT 0x80
|
||||
#define RFLR_IRQFLAGS_RXDONE 0x40
|
||||
#define RFLR_IRQFLAGS_PAYLOADCRCERROR 0x20
|
||||
#define RFLR_IRQFLAGS_VALIDHEADER 0x10
|
||||
#define RFLR_IRQFLAGS_TXDONE 0x08
|
||||
#define RFLR_IRQFLAGS_CADDONE 0x04
|
||||
#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL 0x02
|
||||
#define RFLR_IRQFLAGS_CADDETECTED 0x01
|
||||
|
||||
//RegModemStat (Read Only)
|
||||
#define RFLR_MODEMSTAT_RX_CR_MASK 0x1F
|
||||
#define RFLR_MODEMSTAT_MODEM_STATUS_MASK 0xE0
|
||||
|
||||
//RegModemConfig1
|
||||
#define RFLR_MODEMCONFIG1_BW_MASK 0x0F
|
||||
#define RFLR_MODEMCONFIG1_BW_7_81_KHZ 0x00
|
||||
#define RFLR_MODEMCONFIG1_BW_10_41_KHZ 0x10
|
||||
#define RFLR_MODEMCONFIG1_BW_15_62_KHZ 0x20
|
||||
#define RFLR_MODEMCONFIG1_BW_20_83_KHZ 0x30
|
||||
#define RFLR_MODEMCONFIG1_BW_31_25_KHZ 0x40
|
||||
#define RFLR_MODEMCONFIG1_BW_41_66_KHZ 0x50
|
||||
#define RFLR_MODEMCONFIG1_BW_62_50_KHZ 0x60
|
||||
#define RFLR_MODEMCONFIG1_BW_125_KHZ 0x70 // Default
|
||||
#define RFLR_MODEMCONFIG1_BW_250_KHZ 0x80
|
||||
#define RFLR_MODEMCONFIG1_BW_500_KHZ 0x90
|
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_MASK 0xF1
|
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_4_5 0x02
|
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_4_6 0x04 // Default
|
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_4_7 0x06
|
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_4_8 0x08
|
||||
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK 0xFE
|
||||
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_ON 0x00
|
||||
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_OFF 0x01 // Default
|
||||
|
||||
//RegModemConfig2
|
||||
#define RFLR_MODEMCONFIG2_SF_MASK 0x0F
|
||||
#define RFLR_MODEMCONFIG2_SF_6 0x60
|
||||
#define RFLR_MODEMCONFIG2_SF_7 0x70 // Default
|
||||
#define RFLR_MODEMCONFIG2_SF_8 0x80
|
||||
#define RFLR_MODEMCONFIG2_SF_9 0x90
|
||||
#define RFLR_MODEMCONFIG2_SF_10 0xA0
|
||||
#define RFLR_MODEMCONFIG2_SF_11 0xB0
|
||||
#define RFLR_MODEMCONFIG2_SF_12 0xC0
|
||||
|
||||
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_MASK 0xF7
|
||||
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_ON 0x08
|
||||
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_OFF 0x00
|
||||
|
||||
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK 0xFB
|
||||
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_ON 0x04
|
||||
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_OFF 0x00 // Default
|
||||
|
||||
#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK 0xFC
|
||||
#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB 0x00 // Default
|
||||
|
||||
|
||||
//RegHopChannel (Read Only)
|
||||
#define RFLR_HOPCHANNEL_PLL_LOCK_TIMEOUT_MASK 0x7F
|
||||
#define RFLR_HOPCHANNEL_PLL_LOCK_FAIL 0x80
|
||||
#define RFLR_HOPCHANNEL_PLL_LOCK_SUCCEED 0x00 // Default
|
||||
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_MASK 0xBF
|
||||
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_ON 0x40
|
||||
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_OFF 0x00 // Default
|
||||
#define RFLR_HOPCHANNEL_CHANNEL_MASK 0x3F
|
||||
|
||||
|
||||
//RegSymbTimeoutLsb
|
||||
#define RFLR_SYMBTIMEOUTLSB_SYMBTIMEOUT 0x64 // Default
|
||||
|
||||
//RegPreambleLengthMsb
|
||||
#define RFLR_PREAMBLELENGTHMSB 0x00 // Default
|
||||
|
||||
//RegPreambleLengthLsb
|
||||
#define RFLR_PREAMBLELENGTHLSB 0x08 // Default
|
||||
|
||||
//RegPayloadLength
|
||||
#define RFLR_PAYLOADLENGTH 0x0E // Default
|
||||
|
||||
//RegPayloadMaxLength
|
||||
#define RFLR_PAYLOADMAXLENGTH 0xFF // Default
|
||||
|
||||
//RegHopPeriod
|
||||
#define RFLR_HOPPERIOD_FREQFOPPINGPERIOD 0x00 // Default
|
||||
|
||||
|
||||
//RegDioMapping1
|
||||
//DIO0
|
||||
#define RFLR_DIOMAPPING1_DIO0_MASK 0x3F
|
||||
#define RFLR_DIOMAPPING1_DIO0_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING1_DIO0_01 0x40
|
||||
#define RFLR_DIOMAPPING1_DIO0_10 0x80
|
||||
#define RFLR_DIOMAPPING1_DIO0_11 0xC0
|
||||
//DIO1
|
||||
#define RFLR_DIOMAPPING1_DIO1_MASK 0xCF
|
||||
#define RFLR_DIOMAPPING1_DIO1_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING1_DIO1_01 0x10
|
||||
#define RFLR_DIOMAPPING1_DIO1_10 0x20
|
||||
#define RFLR_DIOMAPPING1_DIO1_11 0x30
|
||||
//DIO2
|
||||
#define RFLR_DIOMAPPING1_DIO2_MASK 0xF3
|
||||
#define RFLR_DIOMAPPING1_DIO2_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING1_DIO2_01 0x04
|
||||
#define RFLR_DIOMAPPING1_DIO2_10 0x08
|
||||
#define RFLR_DIOMAPPING1_DIO2_11 0x0C
|
||||
//DIO3
|
||||
#define RFLR_DIOMAPPING1_DIO3_MASK 0xFC
|
||||
#define RFLR_DIOMAPPING1_DIO3_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING1_DIO3_01 0x01
|
||||
#define RFLR_DIOMAPPING1_DIO3_10 0x02
|
||||
#define RFLR_DIOMAPPING1_DIO3_11 0x03
|
||||
|
||||
//RegDioMapping2
|
||||
//DIO4
|
||||
#define RFLR_DIOMAPPING2_DIO4_MASK 0x3F
|
||||
#define RFLR_DIOMAPPING2_DIO4_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING2_DIO4_01 0x40
|
||||
#define RFLR_DIOMAPPING2_DIO4_10 0x80
|
||||
#define RFLR_DIOMAPPING2_DIO4_11 0xC0
|
||||
//DIO5
|
||||
#define RFLR_DIOMAPPING2_DIO5_MASK 0xCF
|
||||
#define RFLR_DIOMAPPING2_DIO5_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING2_DIO5_01 0x10
|
||||
#define RFLR_DIOMAPPING2_DIO5_10 0x20
|
||||
#define RFLR_DIOMAPPING2_DIO5_11 0x30
|
||||
//MAP
|
||||
#define RFLR_DIOMAPPING2_MAP_MASK 0xFE
|
||||
#define RFLR_DIOMAPPING2_MAP_PREAMBLEDETECT 0x01
|
||||
#define RFLR_DIOMAPPING2_MAP_RSSI 0x00 // Default
|
||||
|
||||
// RegPllHop
|
||||
#define RFLR_PLLHOP_FASTHOP_MASK 0x7F
|
||||
#define RFLR_PLLHOP_FASTHOP_ON 0x80
|
||||
#define RFLR_PLLHOP_FASTHOP_OFF 0x00 // Default
|
||||
|
||||
//RegTcxo
|
||||
#define RFLR_TCXO_TCXOINPUT_MASK 0xEF
|
||||
#define RFLR_TCXO_TCXOINPUT_ON 0x10
|
||||
#define RFLR_TCXO_TCXOINPUT_OFF 0x00 // Default
|
||||
|
||||
//RegPaDac
|
||||
#define RFLR_PADAC_20DBM_MASK 0xF8
|
||||
#define RFLR_PADAC_20DBM_ON 0x07
|
||||
#define RFLR_PADAC_20DBM_OFF 0x04 // Default
|
||||
|
||||
//RegPll
|
||||
#define RFLR_PLL_BANDWIDTH_MASK 0x3F
|
||||
#define RFLR_PLL_BANDWIDTH_75 0x00
|
||||
#define RFLR_PLL_BANDWIDTH_150 0x40
|
||||
#define RFLR_PLL_BANDWIDTH_225 0x80
|
||||
#define RFLR_PLL_BANDWIDTH_300 0xC0 // Default
|
||||
|
||||
//RegPllLowPn
|
||||
#define RFLR_PLLLOWPN_BANDWIDTH_MASK 0x3F
|
||||
#define RFLR_PLLLOWPN_BANDWIDTH_75 0x00
|
||||
#define RFLR_PLLLOWPN_BANDWIDTH_150 0x40
|
||||
#define RFLR_PLLLOWPN_BANDWIDTH_225 0x80
|
||||
#define RFLR_PLLLOWPN_BANDWIDTH_300 0xC0 // Default
|
||||
|
||||
//RegModemConfig3
|
||||
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK 0xF7
|
||||
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_ON 0x08
|
||||
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_OFF 0x00 // Default
|
||||
#define RFLR_MODEMCONFIG3_AGCAUTO_MASK 0xFB
|
||||
#define RFLR_MODEMCONFIG3_AGCAUTO_ON 0x04 // Default
|
||||
#define RFLR_MODEMCONFIG3_AGCAUTO_OFF 0x00
|
||||
|
||||
//REGISTER
|
||||
typedef struct _Sx1276RegType{
|
||||
uint8_t RegFifo; // 0x00
|
||||
// Common settings
|
||||
uint8_t RegOpMode; // 0x01
|
||||
uint8_t RegRes02; // 0x02
|
||||
uint8_t RegRes03; // 0x03
|
||||
uint8_t RegBandSetting; // 0x04
|
||||
uint8_t RegRes05; // 0x05
|
||||
uint8_t RegFrfMsb; // 0x06
|
||||
uint8_t RegFrfMid; // 0x07
|
||||
uint8_t RegFrfLsb; // 0x08
|
||||
// Tx settings
|
||||
uint8_t RegPaConfig; // 0x09
|
||||
uint8_t RegPaRamp; // 0x0A
|
||||
uint8_t RegOcp; // 0x0B
|
||||
// Rx settings
|
||||
uint8_t RegLna; // 0x0C
|
||||
// LoRa registers
|
||||
uint8_t RegFifoAddrPtr; // 0x0D
|
||||
uint8_t RegFifoTxBaseAddr; // 0x0E
|
||||
uint8_t RegFifoRxBaseAddr; // 0x0F
|
||||
uint8_t RegFifoRxCurrentAddr; // 0x10
|
||||
uint8_t RegIrqFlagsMask; // 0x11
|
||||
uint8_t RegIrqFlags; // 0x12
|
||||
uint8_t RegNbRxBytes; // 0x13
|
||||
uint8_t RegRxHeaderCntValueMsb; // 0x14
|
||||
uint8_t RegRxHeaderCntValueLsb; // 0x15
|
||||
uint8_t RegRxPacketCntValueMsb; // 0x16
|
||||
uint8_t RegRxPacketCntValueLsb; // 0x17
|
||||
uint8_t RegModemStat; // 0x18
|
||||
uint8_t RegPktSnrValue; // 0x19
|
||||
uint8_t RegPktRssiValue; // 0x1A
|
||||
uint8_t RegRssiValue; // 0x1B
|
||||
uint8_t RegHopChannel; // 0x1C
|
||||
uint8_t RegModemConfig1; // 0x1D
|
||||
uint8_t RegModemConfig2; // 0x1E
|
||||
uint8_t RegSymbTimeoutLsb; // 0x1F
|
||||
uint8_t RegPreambleMsb; // 0x20
|
||||
uint8_t RegPreambleLsb; // 0x21
|
||||
uint8_t RegPayloadLength; // 0x22
|
||||
uint8_t RegMaxPayloadLength; // 0x23
|
||||
uint8_t RegHopPeriod; // 0x24
|
||||
uint8_t RegFifoRxByteAddr; // 0x25
|
||||
uint8_t RegModemConfig3; // 0x26
|
||||
uint8_t RegTestReserved27[0x30 - 0x27]; // 0x27-0x30
|
||||
uint8_t RegTestReserved31; // 0x31
|
||||
uint8_t RegTestReserved32[0x40 - 0x32]; // 0x32-0x40
|
||||
// I/O settings
|
||||
uint8_t RegDioMapping1; // 0x40
|
||||
uint8_t RegDioMapping2; // 0x41
|
||||
// Version
|
||||
uint8_t RegVersion; // 0x42
|
||||
// Additional settings
|
||||
uint8_t RegAgcRef; // 0x43
|
||||
uint8_t RegAgcThresh1; // 0x44
|
||||
uint8_t RegAgcThresh2; // 0x45
|
||||
uint8_t RegAgcThresh3; // 0x46
|
||||
// Test
|
||||
uint8_t RegTestReserved47[0x4B - 0x47]; // 0x47-0x4A
|
||||
// Additional settings
|
||||
uint8_t RegPllHop; // 0x4B
|
||||
uint8_t RegTestReserved4C; // 0x4C
|
||||
uint8_t RegPaDac; // 0x4D
|
||||
// Test
|
||||
//uint8_t RegTestReserved4E[0x58-0x4E]; // 0x4E-0x57
|
||||
// Additional settings
|
||||
//uint8_t RegTcxo; // 0x58
|
||||
// Test
|
||||
//uint8_t RegTestReserved59; // 0x59
|
||||
// Test
|
||||
//uint8_t RegTestReserved5B; // 0x5B
|
||||
// Additional settings
|
||||
//uint8_t RegPll; // 0x5C
|
||||
// Test
|
||||
//uint8_t RegTestReserved5D; // 0x5D
|
||||
// Additional settings
|
||||
//uint8_t RegPllLowPn; // 0x5E
|
||||
// Test
|
||||
//uint8_t RegTestReserved5F[0x6C - 0x5F]; // 0x5F-0x6B
|
||||
// Additional settings
|
||||
//uint8_t RegFormerTemp; // 0x6C
|
||||
// Test
|
||||
//uint8_t RegTestReserved6D[0x71 - 0x6D]; // 0x6D-0x70
|
||||
}Sx1276RegType;
|
||||
|
||||
#define SIZE_OF_REGISTERS (sizeof(Sx1276RegType))
|
||||
|
||||
//RF state machine
|
||||
typedef enum{
|
||||
RFLR_STATE_IDLE,
|
||||
RFLR_STATE_RX_RUNNING,
|
||||
RFLR_STATE_TX_RUNNING,
|
||||
}LRStateType;
|
||||
|
||||
typedef enum{
|
||||
RADIO_RESET_OFF,
|
||||
RADIO_RESET_ON,
|
||||
}tRadioResetState;
|
||||
|
||||
typedef enum{
|
||||
RF_IDLE,
|
||||
RF_BUSY,
|
||||
RF_RX_DONE,
|
||||
RF_RX_TIMEOUT,
|
||||
RF_TX_DONE,
|
||||
RF_TX_TIMEOUT,
|
||||
RF_LEN_ERROR,
|
||||
RF_CHANNEL_EMPTY,
|
||||
RF_CHANNEL_ACTIVITY_DETECTED,
|
||||
}Sx1276RetType;
|
||||
|
||||
typedef enum{
|
||||
SX1276_BW_7K8= (0),
|
||||
SX1276_BW_10K4= (1<<4),
|
||||
SX1276_BW_15K6= (2<<4),
|
||||
SX1276_BW_20K8= (3<<4),
|
||||
SX1276_BW_31K2= (4<<4),
|
||||
SX1276_BW_41K6= (5<<4),
|
||||
SX1276_BW_62K5= (6<<4),
|
||||
SX1276_BW_125K= (7<<4),
|
||||
SX1276_BW_250K= (8<<4),
|
||||
SX1276_BW_500K= (9<<4)
|
||||
}Sx1276BwType;
|
||||
|
||||
typedef enum{
|
||||
SX1276_SF_64= (6<<4),
|
||||
SX1276_SF_128= (7<<4),
|
||||
SX1276_SF_256= (8<<4),
|
||||
SX1276_SF_512= (9<<4),
|
||||
SX1276_SF_1024= (10<<4),
|
||||
SX1276_SF_2048= (11<<4),
|
||||
SX1276_SF_4096= (12<<4)
|
||||
}Sx1276SpreadFactorType;
|
||||
|
||||
typedef enum{
|
||||
SX1276_EC_4_5= (1<<1),
|
||||
SX1276_EC_4_6= (2<<1),
|
||||
SX1276_EC_4_7= (3<<1),
|
||||
SX1276_EC_4_8= (4<<1)
|
||||
}Sx1276ErrorCodingType;
|
||||
|
||||
typedef enum{
|
||||
SX1276_CRC_OFF= (0),
|
||||
SX1276_CRC_ON= (1<<2)
|
||||
}Sx1276CrcOnType;
|
||||
|
||||
typedef enum{
|
||||
SX1276_IH_OFF= (0),
|
||||
SX1276_IH_ON= (1)
|
||||
}Sx1276ImplicitHeaderOnType;
|
||||
|
||||
//可变速率
|
||||
typedef struct _AutoSfType{
|
||||
Sx1276SpreadFactorType Sf;
|
||||
uint8_t ucRssiMin, ucRssiMax;
|
||||
uint16_t wTimeout;
|
||||
}AutoSfType, *PAutoSf;
|
||||
|
||||
//Parameter
|
||||
typedef enum{
|
||||
LORAPT_STATUS,
|
||||
LORAPT_CHANNEL,
|
||||
LORAPT_FREQ,
|
||||
LORAPT_BW,
|
||||
LORAPT_SF,
|
||||
LORAPT_EC,
|
||||
LORAPT_RSSI,
|
||||
LORAPT_POWER,
|
||||
LORAPT_SET_RX,
|
||||
LORAPT_SET_SLEEP,
|
||||
LORAPT_MAX
|
||||
}Sx1276LoraParaType;
|
||||
|
||||
#define SX1276_CHANNEL_MAX 46
|
||||
|
||||
#define LORA_SPI_NSS_SET() SPI2_NSS_SET()
|
||||
#define LORA_SPI_NSS_CLR() SPI2_NSS_CLR()
|
||||
#define LORA_SPI_READ_WRITE(x) Spi2SendReceive(x)
|
||||
#define LORA_GETDIO0() LORA_DIO_GET()
|
||||
//#define LORA_GETDIO1() GET_LORA_DIO1()
|
||||
|
||||
#define USE_RF_SW 0
|
||||
#define USE_LORA_LED 1
|
||||
#if USE_RF_SW == 1
|
||||
#define LORA_ANTTXEN() { \
|
||||
SET_LORA_TXEN_PIN();\
|
||||
CLR_LORA_RXEN_PIN();\
|
||||
}
|
||||
|
||||
#define LORA_ANTRXEN() { \
|
||||
SET_LORA_RXEN_PIN();\
|
||||
CLR_LORA_TXEN_PIN();\
|
||||
}
|
||||
|
||||
#define LORA_ANTCLOSE() { \
|
||||
CLR_LORA_RXEN_PIN();\
|
||||
CLR_LORA_TXEN_PIN();\
|
||||
}
|
||||
#else
|
||||
#define LORA_ANTTXEN()
|
||||
#define LORA_ANTRXEN()
|
||||
#define LORA_ANTCLOSE()
|
||||
#endif
|
||||
|
||||
#if USE_LORA_LED == 1
|
||||
#define LORA_TXLED_ON() POWER_LED_ON()
|
||||
#define LORA_TXLED_OFF() POWER_LED_OFF()
|
||||
#define LORA_RXLED_ON() POWER_LED_ON()
|
||||
#define LORA_RXLED_OFF() POWER_LED_OFF()
|
||||
#else
|
||||
#define LORA_TXLED_ON()
|
||||
#define LORA_TXLED_OFF()
|
||||
#endif
|
||||
|
||||
#define LORA_BUFF_SIZE 255
|
||||
|
||||
typedef enum {
|
||||
RF_ANT_TRANSMITTER,
|
||||
RF_ANT_RECEIVER,
|
||||
RF_ANT_CLOSE,
|
||||
}Sx1276AntStatus_m;
|
||||
|
||||
typedef enum {
|
||||
SX1276_SLEEP,
|
||||
SX1276_IDLE,
|
||||
SX1276_RX,
|
||||
SX1276_TX,
|
||||
SX1276_BUSY,
|
||||
SX1276_ERROR,
|
||||
SX1276_MAX
|
||||
}Sx1276StateType_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t ucChannel;
|
||||
uint32_t dwFreqHz;
|
||||
int8_t ucPower;
|
||||
Sx1276BwType SignalBw;
|
||||
Sx1276SpreadFactorType SpreadFactor;
|
||||
Sx1276ErrorCodingType ErrorCoding;
|
||||
uint8_t RegPreamble;
|
||||
uint8_t ucOpModePrev;
|
||||
Sx1276AntStatus_m bAntSwPrev;
|
||||
Sx1276RegType RegBuff;
|
||||
Sx1276StateType_t State;
|
||||
uint8_t ucRxPacketSize;
|
||||
uint8_t ucTxPacketSize;
|
||||
uint8_t RxTxBuff[LORA_BUFF_SIZE];
|
||||
DataRevCallBack RxCallBack;
|
||||
int RxRet;
|
||||
}Sx1276Type_t, *pSx1276Type;
|
||||
|
||||
|
||||
//ISM Freq In China
|
||||
//Up Link:
|
||||
//CH0-5: 470.3-471.3MHz
|
||||
//CH39-44:478.1-479.1MHz
|
||||
//CH78-95:485.9-489.3MHz
|
||||
//Down Link:
|
||||
//CH0-47:500.3-509.7MHz
|
||||
|
||||
#define USE_915MHZ 0//=1使用915 =0使用433
|
||||
|
||||
#if (USE_915MHZ == 1)
|
||||
//中心频率,不定义则默认为449000000Hz
|
||||
#define FREQ_CENT 915000000ul
|
||||
//860MHz-1GHz使用PA功放,不定义则默认不使用
|
||||
//SX127x不定义,HOPERF模块需要定义
|
||||
#define USE_LORA_860_PA
|
||||
#endif
|
||||
|
||||
/*
|
||||
Lora频率:470100000ul + 500000*N, N=0~45, 共46个信道(470.1MHz~492.6MHz)
|
||||
*/
|
||||
#define CH0 (470100000ul + 0) //470.1MHz
|
||||
#define CH1 (470100000ul + 500000)
|
||||
#define CH2 (470100000ul + 1000000)
|
||||
#define CH3 (470100000ul + 1500000)
|
||||
#define CH4 (470100000ul + 2000000)
|
||||
#define CH5 (470100000ul + 2500000)
|
||||
#define CH6 (470100000ul + 3000000)
|
||||
#define CH7 (470100000ul + 3500000)
|
||||
#define CH8 (470100000ul + 4000000)
|
||||
#define CH9 (470100000ul + 4500000)
|
||||
#define CH10 (470100000ul + 5000000)
|
||||
#define CH11 (470100000ul + 5500000)
|
||||
#define CH12 (470100000ul + 6000000)
|
||||
#define CH13 (470100000ul + 6500000)
|
||||
#define CH14 (470100000ul + 7000000)
|
||||
#define CH15 (470100000ul + 7500000)
|
||||
#define CH16 (470100000ul + 8000000)
|
||||
#define CH17 (470100000ul + 8500000)
|
||||
#define CH18 (470100000ul + 9000000)
|
||||
#define CH19 (470100000ul + 9500000)
|
||||
#define CH20 (470100000ul + 10000000)
|
||||
#define CH21 (470100000ul + 10500000)
|
||||
#define CH22 (470100000ul + 11000000)
|
||||
#define CH23 (470100000ul + 11500000)
|
||||
#define CH24 (470100000ul + 12000000)
|
||||
#define CH25 (470100000ul + 12500000)
|
||||
#define CH26 (470100000ul + 13000000)
|
||||
#define CH27 (470100000ul + 13500000)
|
||||
#define CH28 (470100000ul + 14000000)
|
||||
#define CH29 (470100000ul + 14500000)
|
||||
#define CH30 (470100000ul + 15000000)
|
||||
#define CH31 (470100000ul + 15500000)
|
||||
#define CH32 (470100000ul + 16000000)
|
||||
#define CH33 (470100000ul + 16500000)
|
||||
#define CH34 (470100000ul + 17000000)
|
||||
#define CH35 (470100000ul + 17500000)
|
||||
#define CH36 (470100000ul + 18000000)
|
||||
#define CH37 (470100000ul + 18500000)
|
||||
#define CH38 (470100000ul + 19000000)
|
||||
#define CH39 (470100000ul + 19500000)
|
||||
#define CH40 (470100000ul + 20000000)
|
||||
#define CH41 (470100000ul + 20500000)
|
||||
#define CH42 (470100000ul + 21000000)
|
||||
#define CH43 (470100000ul + 21500000)
|
||||
#define CH44 (470100000ul + 22000000)
|
||||
#define CH45 (470100000ul + 22500000) //492.6MHz
|
||||
|
||||
/*Lora中心频率默认值(编译期用于频道表等)
|
||||
实际运行频率由Boot参数区(BootPara_t.LoraFreq)配置, APP启动时覆盖ConfigPara.Lora.FreqCent*/
|
||||
#define FREQ_CENT CH0
|
||||
#if !defined FREQ_DEV
|
||||
#define FREQ_DEV 1000000ul
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
void Sx1276LoRaLoopHandler(GateWayPara GateWay);
|
||||
void IsrSx1276LoRaTxRx(GateWayPara GateWay);
|
||||
void Sx1276LoRaInit(DataRevCallBack RxCallBack);
|
||||
void Sx1276LoRaSendBuffer(uint8_t* pucBuff, uint16_t ucLen);
|
||||
uint8_t SX1276LoRaReadChannel(void);
|
||||
bool SX1276LoRaWriteChannel(uint8_t Channel);
|
||||
uint32_t SX1276LoRaReadFreq(void);
|
||||
void SX1276LoRaWriteFreq(uint32_t Freq);
|
||||
void SX1276LoRaWriteBw(Sx1276BwType SignalBw);
|
||||
uint32_t SX1276LoRaReadBw(void);
|
||||
uint8_t SX1276LoRaReadSf(void);
|
||||
void SX1276LoRaWriteSf(Sx1276SpreadFactorType SpreadFactor);
|
||||
void SX1276LoRaWriteEc(Sx1276ErrorCodingType ErrorCoding);
|
||||
uint8_t SX1276LoRaReadEc(void);
|
||||
uint32_t SX1276LoRaParaReadRssi(void);
|
||||
uint8_t SX1276LoRaReadRssiPkt(void);
|
||||
void SX1276LoRaWritePwr(int8_t Pwr);
|
||||
void SX1276LoRaWriteRx(void);
|
||||
void SX1276LoRaWriteSleep(bool Sleep);
|
||||
Sx1276StateType_t SX1276LoRaReadStatus(void);
|
||||
void SX1276LoCalcRssiSnr(int16_t *pswRssi, int8_t *psbSnr);
|
||||
void SX1276Read(uint8_t ucAddr, uint8_t *pucData);
|
||||
void Sx1276LoRaSleep(void);
|
||||
void Sx1276LoRaWakeup(void);
|
||||
int GetSx1276RxRetValue(void);
|
||||
void Sx1276RxRetValue(void);
|
||||
|
||||
bool LoraSetChannel(uint8_t Channel);
|
||||
bool LoraSetPower(uint8_t Power);
|
||||
bool LoraSetSignalBw(uint8_t SignalBw);
|
||||
bool LoraSetSpreadFactor(uint8_t SpreadFactor);
|
||||
bool LoraSetErrorCoding(uint8_t ErrorCoding);
|
||||
bool LoraSetRegPreamble(uint8_t RegPreamble);
|
||||
bool LoraSetFreqCent(uint32_t FreqCent);
|
||||
#endif
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
#ifndef __ADS1231__
|
||||
#define __ADS1231__
|
||||
|
||||
#include "bsp.h"
|
||||
|
||||
void ADS1231_Open(void);
|
||||
void ADS1231_SpeedSet(void);
|
||||
bool ADS1231_Read(uint32_t *r_data, uint8_t channel);
|
||||
void ADS1231_HighSpeedSet(void);
|
||||
void ADS1231_LowSpeedSet(void);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,45 +1,28 @@
|
||||
#ifndef __CAT_ONE_TASK_H
|
||||
#define __CAT_ONE_TASK_H
|
||||
#define __CAT_ONE_TASK_H
|
||||
#include "main.h"
|
||||
#include "Public.h"
|
||||
|
||||
#define CAT_ONE_REV_TIMEOUT_MAX (10 * 60 * 1000)
|
||||
#define CAT_ONE_REV_LEN_MAX 512
|
||||
|
||||
#define CAT_ONE_POW_ON() CAT1_POW_ON()
|
||||
#define CAT_ONE_POW_OFF() CAT1_POW_OFF()
|
||||
|
||||
#define CAT_ONE_LINKA_GET() CAT1_LINKA_GET()
|
||||
#define CAT_ONE_LINKB_GET() CAT1_LINKB_GET()
|
||||
|
||||
#define CAT_ONE_DELAY_1MS(X)
|
||||
|
||||
// ETH状态机相关宏定义
|
||||
#define ETH_RESET_DELAY_TIME_MAX (5 * 60 * 1000)
|
||||
#define ETH_LINK_WAIT_TIME_MAX (10 * 1000)
|
||||
#define ETH_REG_TIMEOUT_MAX (30 * 1000)
|
||||
#define ETH_SEND_TIMEOUT_MAX (5 * 1000)
|
||||
#define ETH_RECV_TIMEOUT_MAX (60 * 1000)
|
||||
#define ETH_SEND_RETRY_MAX 3
|
||||
#define ETH_FIRST_REG_DELAY (5 * 1000)
|
||||
|
||||
typedef enum {
|
||||
CAT_ONE_AT_NULL,
|
||||
CAT_ONE_AT, //开机检测
|
||||
CAT_ONE_ATE0, //关回显
|
||||
CAT_ONE_CPIN, //识卡
|
||||
CAT_ONE_AT, //开机检测
|
||||
CAT_ONE_ATE0, //关回显
|
||||
CAT_ONE_CPIN, //识卡
|
||||
CAT_ONE_IMEI,
|
||||
CAT_ONE_LCCID, //读卡
|
||||
CAT_ONE_CEREG, //查询注册状态
|
||||
CAT_ONE_CGPADDR, //查询IP地址
|
||||
CAT_ONE_CSQ, //查询信号强度
|
||||
CAT_ONE_LDNSGIP, //域名解析
|
||||
CAT_ONE_LBS, //获取基站定位信息
|
||||
CAT_ONE_LIPOPEN, //设置TCP服务器地址和端口
|
||||
CAT_ONE_LIPSEND, //发送数据
|
||||
CAT_ONE_LTPCLOSE, //断开连接
|
||||
CAT_ONE_LCCID, //读卡
|
||||
CAT_ONE_CEREG, //查询注册状态
|
||||
CAT_ONE_CGPADDR, //查询IP地址
|
||||
CAT_ONE_CSQ, //查询信号强度
|
||||
CAT_ONE_LDNSGIP, //域名解析
|
||||
CAT_ONE_LBS, //获取基站定位信息
|
||||
CAT_ONE_LIPOPEN, //设置TCP服务器地址和端口
|
||||
CAT_ONE_LIPSEND, //发送数据
|
||||
CAT_ONE_LTPCLOSE, //断开连接
|
||||
CAT_ONE_LBSPARA,
|
||||
CAT_ONE_CCLK, //获取时间
|
||||
CAT_ONE_CCLK, //获取时间
|
||||
CAT_ONE_AT_CMD_END,
|
||||
}CatOneATCMD_m;
|
||||
|
||||
@@ -56,19 +39,9 @@ typedef enum {
|
||||
CAT_ONE_RESET,
|
||||
CAT_ONE_OFF,
|
||||
CAT_ONE_CLOSE_TCP,
|
||||
CAT_ONE_DUCH_MODE,
|
||||
}CatOneStatus_m;
|
||||
|
||||
typedef enum {
|
||||
ETH_IDEL,
|
||||
ETH_RESET,
|
||||
ETH_WAIT_LINK,
|
||||
ETH_REG_SVR,
|
||||
ETH_WAIT_SEND,
|
||||
ETH_SEND_DATA,
|
||||
ETH_WAIT_RECV,
|
||||
ETH_OFF,
|
||||
}EthStatus_m;
|
||||
|
||||
typedef enum {
|
||||
CAT_ONE_RET_NULL,
|
||||
CAT_ONE_RET_OK,
|
||||
@@ -102,39 +75,27 @@ typedef struct {
|
||||
char SIM[32];
|
||||
CatOneNetType_m NetType;
|
||||
bool TcpConnFlag;
|
||||
|
||||
|
||||
bool LBSFlag;
|
||||
int Longitude;
|
||||
int Latitude;
|
||||
char CatOneSendBuff[1024];
|
||||
|
||||
GateWayPara GateWay;
|
||||
|
||||
GateWayPara GateWay;
|
||||
DataRevCallBack CatOneRevCallBack;
|
||||
|
||||
// ETH状态机相关字段
|
||||
EthStatus_m EthStatus;
|
||||
uint32_t EthResetDelayCnt;
|
||||
uint32_t EthLinkWaitCnt;
|
||||
uint32_t EthRecvTimeoutCnt;
|
||||
uint8_t EthSendRetryCnt;
|
||||
bool EthFirstRegFlag;
|
||||
}CatOne_t, *pCatOne_t;
|
||||
|
||||
CatOneRetStatus_m CatOneSend(uint8_t *sData, uint16_t sLen);
|
||||
void CatOneStart(void);
|
||||
void CatOneStop(void);
|
||||
void CatOneReset(void);
|
||||
void ETHStop(void);
|
||||
void ETHReset(void);
|
||||
void Cat1DBGOnOff(bool OnOff);
|
||||
void CatOneGetLocationInfo(int *Longitude, int *Latitude);
|
||||
void CatOneGetIMEIAndSIM(char *Imei, char *Sim);
|
||||
bool CatOneGetStatus(void);
|
||||
bool CatOneEthSendQueue(uint8_t *sData, uint16_t sLen);
|
||||
bool UploadSend(uint8_t *sData, uint16_t sLen);
|
||||
void CatOneTriggerRegister(void);
|
||||
void ETHTriggerRegister(void);
|
||||
void ETHApplyNetPara(void);
|
||||
void CatOne_Eth_Thread_Entry(void *parameter);
|
||||
void EthRxOverhandler(void);
|
||||
void CatOne_Thread_Entry(void *parameter);
|
||||
void Cat1IrqCallback(uint8_t rData);
|
||||
void Cat1OverHandler(void);
|
||||
void CatReadImeiOrSim(char *Imei, char *Sim);
|
||||
void Cat1DuchSend(const char *text, uint16_t len);
|
||||
#endif
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
#ifndef __EPT__
|
||||
#define __EPT__
|
||||
|
||||
void Encrypt_Code(unsigned char *data, unsigned char *EPT_data);
|
||||
void Decrypt_Code(unsigned char *EPT_data,unsigned char *DPT_data);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,50 @@
|
||||
#ifndef __ETH_TASK_H
|
||||
#define __ETH_TASK_H
|
||||
#include "main.h"
|
||||
#include "Public.h"
|
||||
|
||||
#define ETH_RX_LEN_MAX 512
|
||||
|
||||
#define ETH_RESET_DELAY_TIME_MAX (5 * 60 * 1000)
|
||||
#define ETH_LINK_WAIT_TIME_MAX (10 * 1000)
|
||||
#define ETH_RECV_TIMEOUT_MAX (10 * 1000)
|
||||
#define ETH_SEND_RETRY_MAX 3
|
||||
#define ETH_FIRST_REG_DELAY (1 * 1000)
|
||||
#define ETH_SEND_NO_DATA_MAX 10
|
||||
|
||||
typedef enum {
|
||||
ETH_IDEL,
|
||||
ETH_RESET,
|
||||
ETH_WAIT_LINK,
|
||||
ETH_REG_SVR,
|
||||
ETH_WAIT_SEND,
|
||||
ETH_SEND_DATA,
|
||||
ETH_WAIT_RECV,
|
||||
ETH_OFF,
|
||||
} EthStatus_m;
|
||||
|
||||
typedef struct {
|
||||
EthStatus_m Status;
|
||||
uint32_t ResetDelayCnt;
|
||||
uint32_t LinkWaitCnt;
|
||||
uint32_t RecvTimeoutCnt;
|
||||
uint8_t SendRetryCnt;
|
||||
uint8_t SendNoDataCnt;
|
||||
bool FirstRegFlag;
|
||||
|
||||
GateWayPara GateWay;
|
||||
|
||||
uint8_t TxBuff[ETH_RX_LEN_MAX];
|
||||
uint16_t TxLen;
|
||||
uint8_t Payload[ETH_RX_LEN_MAX];
|
||||
char SendASCII[ETH_RX_LEN_MAX * 2];
|
||||
} EthTask_t;
|
||||
|
||||
void Eth_Thread_Entry(void *parameter);
|
||||
void EthIrqCallbackHandler(uint8_t rData);
|
||||
void EthOverHandler(void);
|
||||
void ETHStop(void);
|
||||
void ETHReset(void);
|
||||
void ETHTriggerRegister(void);
|
||||
void ETHOnOff(bool OnOff);
|
||||
#endif
|
||||
@@ -1,9 +1,11 @@
|
||||
#ifndef __PUBLIC_H
|
||||
#ifndef __PUBLIC_H
|
||||
#define __PUBLIC_H
|
||||
|
||||
#include "bsp.h"
|
||||
|
||||
#define LORA_LOWPOWER //LORA低功耗设备,采用主动上报方式
|
||||
#define LORA_LOWPOWER //LORA低功耗模式支持
|
||||
|
||||
#define CRC16_BASE 0xA001
|
||||
|
||||
#define SENSOR_DATA_LEN_MAX 50
|
||||
#define SENSOR_NUM_MAX 16
|
||||
@@ -12,8 +14,8 @@
|
||||
#define REGISTER_INTERVAL_MAX (2 * 60)
|
||||
#define COMMUNIT_READ_SENSOR_INTERVAL_MAX (1 * 60)
|
||||
|
||||
#define LORA_ERR_RESET_DLY_MAX (10 * 60) //LORA接收超时复位延时,单位秒
|
||||
#define CAT1_ERR_RESET_DLY_MAX (60 * 60) //CAT1接收超时复位延时,单位秒
|
||||
#define LORA_ERR_RESET_DLY_MAX (10 * 60) //LORA通信异常复位延迟时间
|
||||
#define CAT1_ERR_RESET_DLY_MAX (60 * 60) //CAT1通信异常复位延迟时间
|
||||
|
||||
typedef struct GateWay_t GateWayPara_t, *GateWayPara;
|
||||
|
||||
@@ -23,10 +25,31 @@ typedef int (*DataRevResCallBack)(GateWayPara GateWay, uint8_t *rData, uint16_t
|
||||
typedef int (*SendDataOrg)(uint8_t *sData);
|
||||
|
||||
typedef enum {
|
||||
DEBUG_CH_DBG,
|
||||
DEBUG_CH_RS485_1,
|
||||
DEBUG_CH_RS485_2,
|
||||
}DebugChannel_m;
|
||||
CH_NULL = -1,
|
||||
CH_DBG = 0,
|
||||
CH_RS485_1,
|
||||
CH_RS485_2,
|
||||
CH_ETH,
|
||||
CH_LORA,
|
||||
CH_CAT1,
|
||||
} Channel_m;
|
||||
|
||||
typedef enum {
|
||||
LORA_COMM,
|
||||
RS485CH1_COMM,
|
||||
RS485CH2_COMM
|
||||
} SensorComm_m;
|
||||
|
||||
#define CUCH_CH1 (1 << CH_RS485_1)
|
||||
#define CUCH_CH2 (1 << CH_RS485_2)
|
||||
#define CUCH_ETH (1 << CH_ETH)
|
||||
#define CUCH_LORA (1 << CH_LORA)
|
||||
#define CUCH_CAT1 (1 << CH_CAT1)
|
||||
|
||||
#define ChannelIsActive(cfg, ch) ((cfg).Much == (ch) || (cfg).Auch == (ch) || (cfg).Duch == (ch) || ((cfg).CuchMask & (1 << (ch))))
|
||||
#define ChannelMQ(gw, ch) ((gw).ChMQ[(ch)])
|
||||
|
||||
const char *ChannelName(Channel_m ch);
|
||||
|
||||
typedef enum {
|
||||
DEV_TYPE_BROADCAST,
|
||||
@@ -38,24 +61,16 @@ typedef enum {
|
||||
DEV_TYPE_RAIN_SENSOR,
|
||||
}DevType_m;
|
||||
|
||||
typedef enum {
|
||||
CATONE_COMM,
|
||||
ETH_COMM,
|
||||
}CommType_m;
|
||||
|
||||
typedef enum {
|
||||
LORA_COMM,
|
||||
RS485CH1_COMM,
|
||||
RS485CH2_COMM
|
||||
}SensorComm_m;
|
||||
|
||||
typedef enum {
|
||||
COMM_UNIT_CMD_REG,
|
||||
COMM_UNIT_CMD_CAIL,
|
||||
COMM_UNIT_CMD_READ,
|
||||
COMM_UNIT_CMD_SET_SENSOR_COLL_TIME = 5,
|
||||
COMM_UNIT_CMD_TIME_SYNC,
|
||||
COMM_UNIT_CMD_CONT_LASER = 8,//激光独有指令
|
||||
COMM_UNIT_CMD_REG = 0x00,
|
||||
COMM_UNIT_CMD_CAIL = 0x01,
|
||||
COMM_UNIT_CMD_READ = 0x02,
|
||||
COMM_UNIT_CMD_SET_SENSOR_COLL_TIME = 0x05,
|
||||
COMM_UNIT_CMD_TIME_SYNC = 0x06,
|
||||
COMM_UNIT_CMD_CONT_LASER = 0x08,//连续激光控制
|
||||
COMM_UNIT_CMD_GET_SIGNAL = 0x09, //0x09 获取Lora信号质量
|
||||
COMM_UNIT_CMD_SET_FPO_TIME = 0x0A, //0x0A 全功率时间配置
|
||||
COMM_UNIT_CMD_END,
|
||||
}CommUnitCmd_m;
|
||||
|
||||
@@ -70,41 +85,43 @@ typedef enum {
|
||||
NET_COMM_CMD_ADD_UNIT,
|
||||
NET_COMM_CMD_LP_DEV_CONFIG,
|
||||
NET_COMM_CMD_ALARM,
|
||||
NET_COMM_CMD_CONT_LASER,//激光独有指令
|
||||
NET_COMM_CMD_CONT_LASER,//连续激光控制
|
||||
NET_COMM_CMD_FPO_CONFIG = 0x0A,//0x0A 全功率时间配置
|
||||
NET_COMM_CMD_END,
|
||||
}NetCommCmd_m;
|
||||
|
||||
typedef enum {
|
||||
SENSOR_TYPE_NULL, //0x0000 空设备
|
||||
FORCE_6D, //0x0001 六维应力
|
||||
OSMOTIC_PRESSURE, //0x0002 渗透压
|
||||
ELASTIC_WAVEGUIDE, //0x0003 弹性波导
|
||||
DIELECTRIC_MASS, //0x0004 介电质普
|
||||
VIBRATE_SENSOR, //0x0005 微振动传感器
|
||||
CONT_DEFOR_3D, //0x0006 三维连续变形
|
||||
COMM_UNIT, //0x0007 通讯单元
|
||||
FORCE_3D, //0x0008 三维应力
|
||||
LASER_TRACING, //0x0009 激光示踪
|
||||
WATER_LEVEL, //0x000A 水位计
|
||||
_0x000B, //0x000B 保留
|
||||
_0x000C, //0x000C 保留
|
||||
MULTI_PARAMETER_FUSION, //0x000D 多参数融合
|
||||
CRACK_DETECTION, //0x000E 裂缝仪
|
||||
_0x000F, //0x000F 保留
|
||||
ATTITUDE_MONITOR, //0x0010 姿态检测
|
||||
LASER_DISPLACE, //0x0011 激光位移
|
||||
REBAR_STRESS, //0x0012 钢筋应力
|
||||
ANCHOR_ROD_STRESS, //0x0013 锚杆轴力
|
||||
SURFACE_STRESS, //0x0014 表面应力
|
||||
PRESSURE, //0x0015 压力
|
||||
MICROWAVE_DISPLACE, //0x0016 微波位移
|
||||
DISPLACEMENT = 0x0020, //0x0020 位移监测传感器
|
||||
SENSOR_TYPE_NULL, //0x0000 空类型
|
||||
FORCE_6D, //0x0001 六维力
|
||||
OSMOTIC_PRESSURE, //0x0002 渗透压
|
||||
ELASTIC_WAVEGUIDE, //0x0003 弹性波导
|
||||
DIELECTRIC_MASS, //0x0004 介电质
|
||||
VIBRATE_SENSOR, //0x0005 振动传感器
|
||||
CONT_DEFOR_3D, //0x0006 三向连续变形
|
||||
COMM_UNIT, //0x0007 通讯单元
|
||||
FORCE_3D, //0x0008 三维力
|
||||
LASER_TRACING, //0x0009 激光追踪
|
||||
WATER_LEVEL, //0x000A 水位
|
||||
_0x000B, //0x000B 位移
|
||||
_0x000C, //0x000C 流量
|
||||
MULTI_PARAMETER_FUSION, //0x000D 多参融合
|
||||
CRACK_DETECTION, //0x000E 裂缝
|
||||
_0x000F, //0x000F 应变
|
||||
ATTITUDE_MONITOR, //0x0010 姿态监测
|
||||
LASER_DISPLACE, //0x0011 激光位移
|
||||
REBAR_STRESS, //0x0012 钢筋应力
|
||||
ANCHOR_ROD_STRESS, //0x0013 锚杆应力
|
||||
SURFACE_STRESS, //0x0014 表面应力
|
||||
PRESSURE, //0x0015 压力
|
||||
MICROWAVE_DISPLACE, //0x0016 微波位移
|
||||
DISPLACEMENT = 0x0020, //0x0020 位移变形传感器
|
||||
EWS_7 = 0x0021, //0x0021 七要素气象站,含温度湿度气压风速风向降雨光照
|
||||
}SensorType_m;
|
||||
|
||||
typedef struct {//主设备固定包头
|
||||
uint8_t BatLevel; //电池电量
|
||||
int8_t RSSI; //信号强度
|
||||
int8_t Nsr; //信噪比
|
||||
typedef struct {//主设备信息
|
||||
uint8_t BatLevel; //电池电量
|
||||
int8_t RSSI; //信号强度
|
||||
int8_t Nsr; //信噪比
|
||||
}__attribute__ ((packed))MasterDev_T,*MasterDevDp;
|
||||
|
||||
typedef struct {
|
||||
@@ -121,80 +138,111 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
MasterDev_T MasterDev;
|
||||
int16_t PitchAngle; //俯仰角偏斜 (范围±900)单位0.1°
|
||||
int16_t RollAngle; //横滚角偏斜 (范围±900)单位0.1°
|
||||
int16_t YawAngle; //偏航角偏斜 (范围0~3600)单位0.1°
|
||||
int16_t PitchAngle; //俯仰角 范围-900~900,精度0.1度
|
||||
int16_t RollAngle; //横滚角 范围-900~900,精度0.1度
|
||||
int16_t YawAngle; //航向角 范围0~3600,精度0.1度
|
||||
}__attribute__((packed))LaserTracingType_T;
|
||||
|
||||
typedef struct {//0x0020 位移计
|
||||
typedef struct {//0x0020 位移
|
||||
MasterDev_T MasterDev;
|
||||
int16_t PitchAngle; //俯仰角偏斜(范围±900)单位0.1°
|
||||
int16_t RollAngle; //横滚角偏斜(范围±900)单位0.1°
|
||||
int16_t YawAngle; //偏航角偏斜(范围0~3600)单位0.1°
|
||||
float Temp; //温度
|
||||
float Altitude; //海拔()单位cm
|
||||
int16_t Distance; //1轴应力值转位移(范围±300,单位0.1mm)
|
||||
int16_t PitchAngle; //俯仰角范围-900~900,精度0.1度
|
||||
int16_t RollAngle; //横滚角范围-900~900,精度0.1度
|
||||
int16_t YawAngle; //航向角范围0~3600,精度0.1度
|
||||
float Temp; //温度
|
||||
float Altitude; //高程变化值,单位cm
|
||||
int16_t Distance; //1次测量相对基准值偏差,范围-300,精度0.1mm
|
||||
}__attribute__ ((packed))Displacement_T,*DisplacementDp;
|
||||
|
||||
typedef struct {//0x0021 七要素气象站数据
|
||||
uint8_t Time[7]; //"时间24小时制,Byte[0]*100+Byte[1]为年份,Byte[2]为月份,Byte[3]为日期,Byte[4]为时,Byte[5]为分,Byte[6]"
|
||||
int16_t Temperature; //温度
|
||||
uint16_t Humidity; //湿度
|
||||
uint16_t Pressure; //气压
|
||||
uint16_t WindSpeed; //平均风速
|
||||
uint16_t WindDirection; //平均风向
|
||||
uint16_t WindSpeed1m; //过去1分钟风速
|
||||
uint16_t WindDirection1m; //过去1分钟风向
|
||||
uint16_t WindSpeed10m; //过去10分钟风速
|
||||
uint16_t WindDirection10m; //过去10分钟风向
|
||||
uint16_t MinRainfall; //最小降雨量
|
||||
uint16_t HourRainfall; //小时降雨量
|
||||
uint16_t DayRainfall; //日降雨量
|
||||
uint32_t Light; //光照强度
|
||||
}__attribute__ ((packed))EWS_7_T,*EWS_7_Dp;
|
||||
|
||||
typedef struct {
|
||||
int Distance;
|
||||
}__attribute__((packed))LaserDistanceSensorType_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t CommDevAddr[6]; //通讯单元地址
|
||||
uint16_t CollectInterval; //采集时间间隔
|
||||
uint16_t ReportInterval; //上报时间间隔
|
||||
uint8_t ERInterval; //紧急上报时间间隔
|
||||
uint8_t ERTime; //紧急上报时长
|
||||
uint8_t CommDevAddr[6]; //通讯设备地址
|
||||
uint16_t CollectInterval; //采集时间间隔
|
||||
uint16_t ReportInterval; //上报时间间隔
|
||||
uint8_t ERInterval; //紧急上报时间间隔
|
||||
uint8_t ERTime; //紧急上报时长
|
||||
}__attribute__((packed))SvrDownLPDevConfigPara_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t CommDevAddr[6]; //通讯设备地址
|
||||
uint8_t FPOTimeStart; //全功率工作时间起始点(0~23)
|
||||
uint8_t FPOTime; //全功率工作时间时长(0~24)
|
||||
}__attribute__((packed))SvrDownFPOConfigPara_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t AlarmType;
|
||||
uint8_t AlarmState;
|
||||
uint8_t AlarmPara;
|
||||
}__attribute__((packed))GateWayAlarmType_t;
|
||||
|
||||
#define LW_DEV_COLLECT_INTERVAL_MAX 300//默认300秒
|
||||
#define LW_DEV_REPORT_INTERVAL_MAX 20//20分钟
|
||||
#define LW_DEV_ER_INTERVAL_MAX 2//2分钟
|
||||
#define LW_DEV_ER_TIME_MAX 20//20分钟
|
||||
#define LW_DEV_COLLECT_INTERVAL_MAX 300//默认300秒
|
||||
#define LW_DEV_REPORT_INTERVAL_MAX 20//20分钟
|
||||
#define LW_DEV_ER_INTERVAL_MAX 2//2分钟
|
||||
#define LW_DEV_ER_TIME_MAX 20//20分钟
|
||||
#define LW_DEV_FPO_TIME_START_DEFAULT 0//默认0点开始
|
||||
#define LW_DEV_FPO_TIME_DEFAULT 0//默认0小时
|
||||
|
||||
typedef struct {
|
||||
uint16_t CollectInterval; //采集时间间隔
|
||||
uint16_t ReportInterval; //上报时间间隔
|
||||
uint8_t ERInterval; //紧急上报时间间隔
|
||||
uint8_t ERTime; //紧急上报时长
|
||||
uint32_t TimeStamp; //时间戳
|
||||
uint16_t CollectInterval; //采集时间间隔
|
||||
uint16_t ReportInterval; //上报时间间隔
|
||||
uint8_t ERInterval; //紧急上报时间间隔
|
||||
uint8_t ERTime; //紧急上报时长
|
||||
uint32_t TimeStamp; //时间戳
|
||||
}__attribute__((packed))LPDevConfigPara_t;
|
||||
|
||||
typedef struct {
|
||||
bool RegFlag;
|
||||
bool RevNewDataFlag;
|
||||
bool CommStatus; //通讯状态,1-在线,0-离线
|
||||
bool CailFlag; //校准标志(低功耗)
|
||||
bool TimeSyncFlag; //时间同步标志(低功耗)
|
||||
bool ContLaser; //激光控制标志(低功耗)
|
||||
bool LaserOnOff; //激光状态(低功耗)
|
||||
bool CommStatus; //通讯状态1-在线0-离线
|
||||
bool CailFlag; //校准标志,需要校准
|
||||
bool TimeSyncFlag; //时间同步标志,需要同步时间
|
||||
bool ContLaser; //连续激光控制标志,需要控制
|
||||
bool LaserOnOff; //激光开关状态,开关状态
|
||||
bool FPOTimeFlag; //全功率时间配置等待下发标志
|
||||
bool FPOTimeConfirmed; //全功率时间配置已确认标志(传感器回应后置true)
|
||||
uint32_t CommErrCnt;
|
||||
uint8_t MasterMac[6];
|
||||
uint8_t Mac[SENSOR_NUM_MAX][6];//第一位是主设备,后面全是子设备
|
||||
uint8_t Mac[SENSOR_NUM_MAX][6];//主设备MAC,传感器MAC列表
|
||||
uint8_t BatLevel;
|
||||
int8_t RSSI; //信号强度
|
||||
int8_t Nsr; //信噪比
|
||||
int8_t RSSI; //信号强度
|
||||
int8_t Nsr; //信噪比
|
||||
uint16_t CUType;
|
||||
uint8_t SensorN;
|
||||
uint16_t SensorType[SENSOR_NUM_MAX];
|
||||
//低功耗设备配置信息
|
||||
bool ConfigFlag; //配置标志,为1表示有新配置,应答低功耗设备时需要附带发送
|
||||
uint16_t CollectInterval; //采集时间间隔
|
||||
uint16_t ReportInterval; //上报时间间隔
|
||||
uint8_t ERInterval; //紧急上报时间间隔
|
||||
uint8_t ERTime; //紧急上报时长
|
||||
//低功耗设备相关参数
|
||||
bool ConfigFlag; //配置标志位1表示需要配置,传感器上报数据时检查此标志并下发配置参数
|
||||
uint16_t CollectInterval; //采集时间间隔
|
||||
uint16_t ReportInterval; //上报时间间隔
|
||||
uint8_t ERInterval; //紧急上报时间间隔
|
||||
uint8_t ERTime; //紧急上报时长
|
||||
uint8_t FPOTimeStart; //全功率工作时间起始点(0~23)(待配置/已配置)
|
||||
uint8_t FPOTime; //全功率工作时间时长(0~24)(待配置/已配置)
|
||||
uint8_t CurFPOTimeStart; //传感器当前已确认生效的全功率起始点(0~23)
|
||||
uint8_t CurFPOTime; //传感器当前已确认生效的全功率时长(0~24)
|
||||
}__attribute__((packed))CommUnitPara_t, *CommUnitPara;
|
||||
|
||||
typedef struct {
|
||||
bool ExclFlag;
|
||||
uint8_t ExclMac[6];//需要排除的通讯单元MAC
|
||||
uint8_t ExclMac[6];//排除的通讯单元MAC
|
||||
}__attribute__((packed))ExclCommUnit_t, *ExclCommUnit;
|
||||
|
||||
typedef struct {
|
||||
@@ -206,10 +254,10 @@ typedef struct {
|
||||
}__attribute__((packed))CommUnit_t, *CommUnit;
|
||||
|
||||
typedef struct {
|
||||
bool Enable; //串口使能
|
||||
bool CommUnitEnable; //通讯单元使能,开启(使用内部通讯单元功能,直接和传感器通讯),关闭(直接和RS485类型的通讯单元通讯)
|
||||
bool QuerySensorFlag; //查询传感器标志
|
||||
bool UpgradeEnable;//升级功能使能
|
||||
bool Enable; //通道使能
|
||||
bool CommUnitEnable; //通讯单元使能,用于RS485通道挂载通讯单元时使用,主设备为RS485传感器时此标志无效
|
||||
bool QuerySensorFlag; //查询传感器标志
|
||||
bool UpgradeEnable;//升级使能标志
|
||||
uint8_t Power;
|
||||
uint32_t BaudRate;
|
||||
SendData RS485Send;
|
||||
@@ -251,70 +299,65 @@ typedef struct {
|
||||
}LoraPara_t, *pLoraPara;
|
||||
|
||||
typedef struct {
|
||||
uint8_t DestAddr[4]; //目的服务器地址
|
||||
uint16_t DestPort; //目的服务器端口
|
||||
uint8_t LocalAddr[4]; //本地客户端地址(预留)
|
||||
uint16_t LocalPort; //本地客户端端口(预留)
|
||||
uint8_t DestAddr[4]; //目标服务器地址
|
||||
uint16_t DestPort; //目标服务器端口
|
||||
uint8_t LocalAddr[4]; //本地地址(备用)
|
||||
uint16_t LocalPort; //本地端口(备用)
|
||||
}LTENetPara_t, *pLTENetPara;
|
||||
|
||||
typedef enum {
|
||||
ETH_IP_DHCP, //动态IP
|
||||
ETH_IP_STATIC, //静态IP
|
||||
}EthIpMode_m;
|
||||
|
||||
typedef enum {
|
||||
ETH_MODE_TCP_CLIENT, //TCP客户端
|
||||
ETH_MODE_TCP_SERVER, //TCP服务器
|
||||
ETH_MODE_UDP, //UDP模式
|
||||
}EthWorkMode_m;
|
||||
|
||||
typedef struct {
|
||||
EthIpMode_m IpMode; //IP模式:DHCP/静态
|
||||
uint8_t IpAddr[4]; //本地IP地址
|
||||
uint16_t IpPort; //本地端口
|
||||
EthWorkMode_m WorkMode; //工作模式
|
||||
uint8_t SubnetMask[4]; //子网掩码
|
||||
uint8_t Gateway[4]; //网关
|
||||
uint8_t DestIp[4]; //目的IP地址
|
||||
uint16_t DestPort; //目的端口
|
||||
uint8_t IpMode; //IP模式DHCP/静态
|
||||
uint8_t IpAddr[4]; //本地IP地址
|
||||
uint16_t IpPort; //本地端口
|
||||
uint8_t WorkMode; //工作模式
|
||||
uint8_t SubnetMask[4]; //子网掩码
|
||||
uint8_t Gateway[4]; //网关
|
||||
uint8_t DestIp[4]; //目标IP地址
|
||||
uint16_t DestPort; //目标端口
|
||||
}EthNetPara_t, *pEthNetPara;
|
||||
|
||||
typedef struct {
|
||||
uint32_t SavFlag; //存储标志
|
||||
CommType_m Comm; //网关通讯方式
|
||||
uint8_t GwMac[6]; //网关mac
|
||||
LTENetPara_t LTENet; //Cat1/4G服务器参数
|
||||
EthNetPara_t EthNet; //以太网网络参数
|
||||
uint32_t CommUnitReadInterval; //通讯单元读取时间间隔,单位S
|
||||
CommUnitPara_t CommUnitArray[COMMUNIT_NUM_MAX]; //注册的通讯单元信息
|
||||
ExclCommUnit_t ExclCommUnit[COMMUNIT_NUM_MAX]; //排除的通讯单元信息
|
||||
RS485Para_t Rs485Ch1; //RS485通道1配置
|
||||
RS485Para_t Rs485Ch2; //RS485通道2配置
|
||||
uint8_t DebugChannel; //调试通道
|
||||
LoraPara_t Lora; //Lora配置
|
||||
bool OutageFlag; //断电报警标志
|
||||
uint32_t SavFlag; //存储标志
|
||||
Channel_m Much; //主上传通道
|
||||
Channel_m Auch; //辅助上传通道
|
||||
Channel_m Duch; //调试通道/升级通道
|
||||
uint8_t CuchMask; //通讯单元通道掩码
|
||||
uint8_t GwMac[6]; //网关mac
|
||||
LTENetPara_t LTENet; //Cat1/4G网络参数配置
|
||||
EthNetPara_t EthNet; //以太网网络参数配置
|
||||
uint32_t CommUnitReadInterval; //通讯单元读取间隔,单位S
|
||||
CommUnitPara_t CommUnitArray[COMMUNIT_NUM_MAX]; //通讯单元参数数组
|
||||
ExclCommUnit_t ExclCommUnit[COMMUNIT_NUM_MAX]; //排除的通讯单元列表
|
||||
RS485Para_t Rs485Ch1; //RS485通道1参数
|
||||
RS485Para_t Rs485Ch2; //RS485通道2参数
|
||||
LoraPara_t Lora; //Lora参数
|
||||
bool OutageFlag; //断电标志
|
||||
uint16_t crc16;
|
||||
}__attribute__((packed))GWConfigPara_t, *GWConfigPara;
|
||||
|
||||
struct GateWay_t{
|
||||
bool TimeSyncFlag; //时间同步标志
|
||||
bool SvrRegFlag; //服务器注册标志
|
||||
uint8_t SvrMac[6]; //服务器mac
|
||||
GWConfigPara_t ConfigPara; //配置参数
|
||||
bool TimeSyncFlag; //时间同步标志
|
||||
bool MuchRegFlag; //主通道注册标志
|
||||
bool AuchRegFlag; //辅助通道注册标志
|
||||
uint8_t SvrMac[6]; //服务器mac
|
||||
GWConfigPara_t ConfigPara; //网关配置参数
|
||||
CommUnitData_t CUDataArray[COMMUNIT_NUM_MAX];
|
||||
uint8_t Battery; //电池电量
|
||||
uint16_t UploadInterval; //上传间隔
|
||||
uint32_t HistoryNum; //历史数据数量
|
||||
DataRevCallBack SvrRevCallBack; //接收到服务器回调
|
||||
DataRevResCallBack CommUnitRevCallBack; //通讯单元接收回调
|
||||
rt_mq_t NetSendData_MQ; //网络发送数据队列,第一个字节用于存储消息长度, 第二字节存储命令字,后为数据
|
||||
rt_mq_t LoraRev_MQ; //Lora接收消息队列,第一个字节用于存储消息长度,后为数据
|
||||
uint8_t Battery; //电池电量
|
||||
uint16_t UploadInterval; //上传间隔
|
||||
uint32_t HistoryNum; //历史数据数量
|
||||
DataRevCallBack MuchRevCallBack; //主通道接收回调
|
||||
DataRevCallBack AuchRevCallBack; //辅助通道接收回调
|
||||
DataRevResCallBack CommUnitRevCallBack; //通讯单元接收回调
|
||||
rt_mq_t ChMQ[6]; //各通道消息队列,索引=Channel_m
|
||||
rt_mq_t LoraRev_MQ; //Lora接收消息队列,用于缓存接收数据避免丢失
|
||||
rt_mutex_t UartRevMutex;
|
||||
rt_mutex_t EthTxMutex;
|
||||
|
||||
uint8_t BatteryReadDlyCnt; //读取电压延时,单位秒,防止4G发送拉低电池电压,造成断电误报
|
||||
uint8_t BatteryReadDlyCnt; //电池读取延迟计数,开机后延时读取,4G模块上电需要时间稳定
|
||||
};
|
||||
|
||||
int Cat1EthRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen);
|
||||
int MuchRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen);
|
||||
int AuchRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen);
|
||||
uint16_t CRC_Modbus(uint16_t wBase, __IO uint8_t *para, uint16_t length);
|
||||
uint8_t AsciiToHex(char *ASCData, uint8_t *HexData, uint8_t sLen);
|
||||
void HexToAscii(uint8_t *HexData, char *ASCData, uint8_t sLen);
|
||||
@@ -322,9 +365,9 @@ int NetCommOrgData(GateWayPara GateWay, uint8_t *MegData, uint8_t *OutData);
|
||||
int CommUnitAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, SendData Response);
|
||||
void DebugAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen);
|
||||
void CommUnitCmdSend(GateWayPara GateWay, uint8_t *CommUnitMac, CommUnitCmd_m Cmd, uint8_t *Payload, uint16_t PayloadLen, SendData Send);
|
||||
void TrySendFullPowerCmd(GateWayPara GateWay, int CommUnitIdx);
|
||||
int CheckCommUnitReg(GateWayPara GateWay, uint8_t *CommUnitMac);
|
||||
int CheckCommUnitExcl(GateWayPara GateWay, uint8_t *CommUnitMac);
|
||||
int CommUintOrgData(GateWayPara GateWay, CommUnitPara CUPara, CommUnitData CUData, uint8_t *sData);
|
||||
void DebugDisplaySensorData(int SensorIdx, uint16_t SensorType, uint8_t *SensorData);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ typedef enum {
|
||||
RS485_SENSOR_CMD_END,
|
||||
}RS485SensorCmd_m;
|
||||
|
||||
//´«¸ÐÆ÷Êý¾Ý·¢ËͽṹÌå
|
||||
//传感器数据发送结构体
|
||||
typedef struct {
|
||||
bool SendFlag;
|
||||
uint8_t SensorCnt;
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
#ifndef __UPDATE_H
|
||||
#define __UPDATE_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "bsp.h"
|
||||
#include "Public.h"
|
||||
|
||||
/*与HC32F460BootLoader一致的boot参数结构(已在bsp.h定义boot_para_t)*/
|
||||
|
||||
//主机下发升级请求载荷结构体 (CMD = 0x81)
|
||||
typedef struct {
|
||||
uint16_t PackageNum;
|
||||
uint32_t AppSize;
|
||||
uint32_t AppCrc32;
|
||||
}__attribute__ ((packed))UpDataRequset_t, *UDReq;
|
||||
|
||||
//帧头结构体 - 0x7D + 6字节MAC (与HC32F460BootLoader一致)
|
||||
typedef struct {
|
||||
uint8_t Header;
|
||||
uint8_t DevMac[6];
|
||||
uint8_t Cmd;
|
||||
uint8_t PayloadLen;
|
||||
}__attribute__((packed))UpdateFrameHeader_t, *pUpdateFrameHeader;
|
||||
|
||||
//输入接口函数定义,需根据接口重新定义
|
||||
#define U_DBG_LOG(...) Debug_Printf(__VA_ARGS__)
|
||||
#define U_DELAY_MS(x) rt_thread_delay(x)
|
||||
#define U_SYSTEM_TESET() NVIC_SystemReset()
|
||||
#define SAVE_BOOT_PARA(addr) dev_boot_write_param(*(addr))
|
||||
#define READ_BOOT_PARA(addr) dev_boot_read_param(addr)
|
||||
|
||||
//输出接口
|
||||
void Update(uint8_t *PayLoad);
|
||||
void UpdateInit(void);
|
||||
#endif
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
#ifndef _APP_COMM_H_
|
||||
#define _APP_COMM_H_
|
||||
|
||||
#include "rtthread.h"
|
||||
|
||||
#define BSP_LOG(format,...) do { \
|
||||
rt_kprintf(format, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
@@ -8,29 +8,8 @@
|
||||
#include <time.h>
|
||||
#include "hc32_ddl.h"
|
||||
#include "rtthread.h"
|
||||
#include "ff.h"
|
||||
|
||||
#define SOFTWARE_VERSION 10
|
||||
#define HARDWARE_VERSION 12
|
||||
|
||||
//#define USE_BOOTLOADER
|
||||
|
||||
//#define FLASH_SECTOR_SIZE 0x2000ul
|
||||
//#define FLASH_BASE ((uint32_t)0x00000000)
|
||||
//#define FLASH_SIZE (64u * FLASH_SECTOR_SIZE)
|
||||
|
||||
|
||||
//#define SRAM_BASE ((uint32_t)0x1FFF8000)
|
||||
//#define RAM_SIZE 0x2F000ul
|
||||
|
||||
|
||||
//#define BOOT_SIZE (4 * FLASH_SECTOR_SIZE)
|
||||
//#define APP_ADDRESS (FLASH_BASE + BOOT_SIZE)
|
||||
|
||||
//#define BOOT_PARA_ADDRESS (FLASH_SIZE - FLASH_SECTOR_SIZE)
|
||||
//#define BOOT_PARA_SIZE (FLASH_SECTOR_SIZE)
|
||||
|
||||
/* flash rom map 存储分区*/
|
||||
/* flash rom map 存储分区*/
|
||||
//boot 16k
|
||||
#define FLASH_BASE ((uint32_t)0x00000000)
|
||||
#define FLASH_SECTOR_SIZE 0x2000ul
|
||||
@@ -53,6 +32,7 @@
|
||||
|
||||
#define APP_START_FLAG 0x55AA5A5A
|
||||
#define APP_UPDATE_FLAG 0xA5A5AA55
|
||||
#define APP_BOOT_UPGRADE_FLAG 0x5A5A55A5
|
||||
|
||||
|
||||
#define WATCH_DOG 1
|
||||
@@ -62,36 +42,57 @@
|
||||
|
||||
#define RTC_IRQn Int001_IRQn
|
||||
|
||||
#define LORA_DIO0_IRQn Int005_IRQn
|
||||
|
||||
#define DBGUART_IRQn Int006_IRQn
|
||||
#define DBGUART_EI_IRQn Int007_IRQn
|
||||
|
||||
#define RS485CH1_UART_IRQn Int008_IRQn
|
||||
#define RS485CH1_UART_EI_IRQn Int009_IRQn
|
||||
|
||||
#define RS485CH2_UART_IRQn Int010_IRQn
|
||||
#define RS485CH2_UART_EI_IRQn Int011_IRQn
|
||||
|
||||
#define ETH_OR_CAT1_UART_IRQn Int012_IRQn
|
||||
#define ETH_OR_CAT1_UART_EI_IRQn Int013_IRQn
|
||||
|
||||
#define DBG_RXPIN_IRQn Int002_IRQn
|
||||
|
||||
#define LORA_DIO0_IRQn Int005_IRQn
|
||||
|
||||
//DEBUG
|
||||
#define DBG_USART_CH (M4_USART1)
|
||||
#define DBG_USART_RX_PORT (PortA)
|
||||
#define DBG_USART_RX_PIN (Pin11)
|
||||
#define DBG_USART_TX_PORT (PortA)
|
||||
#define DBG_USART_TX_PIN (Pin12)
|
||||
#define DBG_USART_RX_FUNC (Func_Usart1_Rx)
|
||||
#define DBG_USART_TX_FUNC (Func_Usart1_Tx)
|
||||
#define DBG_USART_RI_NUM (INT_USART1_RI)
|
||||
#define DBG_USART_EI_NUM (INT_USART1_EI)
|
||||
#define DBG_USART_TI_NUM (INT_USART1_TI)
|
||||
#define DBG_USART_TCI_NUM (INT_USART1_TCI)
|
||||
#define DBG_FCG1_PERIPH (PWC_FCG1_PERIPH_USART1)
|
||||
#define DBG_OR_CAT1_UART_IRQn Int006_IRQn
|
||||
#define DBG_OR_CAT1_UART_EI_IRQn Int007_IRQn
|
||||
|
||||
#define ETH_UART_IRQn Int008_IRQn
|
||||
#define ETH_UART_EI_IRQn Int009_IRQn
|
||||
|
||||
#define RS485CH1_UART_IRQn Int010_IRQn
|
||||
#define RS485CH1_UART_EI_IRQn Int011_IRQn
|
||||
|
||||
#define RS485CH2_UART_IRQn Int012_IRQn
|
||||
#define RS485CH2_UART_EI_IRQn Int013_IRQn
|
||||
|
||||
|
||||
//DEBUG or CAT1
|
||||
#define DBG_OR_CAT1_USART_CH (M4_USART1)
|
||||
#define DBG_OR_CAT1_USART_RX_PORT (PortA)
|
||||
#define DBG_OR_CAT1_USART_RX_PIN (Pin11)
|
||||
#define DBG_OR_CAT1_USART_TX_PORT (PortA)
|
||||
#define DBG_OR_CAT1_USART_TX_PIN (Pin12)
|
||||
#define DBG_OR_CAT1_USART_RX_FUNC (Func_Usart1_Rx)
|
||||
#define DBG_OR_CAT1_USART_TX_FUNC (Func_Usart1_Tx)
|
||||
#define DBG_OR_CAT1_USART_RI_NUM (INT_USART1_RI)
|
||||
#define DBG_OR_CAT1_USART_EI_NUM (INT_USART1_EI)
|
||||
#define DBG_OR_CAT1_USART_TI_NUM (INT_USART1_TI)
|
||||
#define DBG_OR_CAT1_USART_TCI_NUM (INT_USART1_TCI)
|
||||
#define DBG_OR_CAT1_FCG1_PERIPH (PWC_FCG1_PERIPH_USART1)
|
||||
|
||||
#define DBG_OR_CAT1_CTRL_PORT (PortB)
|
||||
#define DBG_OR_CAT1_CTRL_PIN (Pin08)
|
||||
|
||||
#define DBG_ON() PORT_SetBits(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN)
|
||||
#define CAT1_ON() PORT_ResetBits(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN)
|
||||
|
||||
#define CAT1_PWR_KEY_PORT (PortA)
|
||||
#define CAT1_PWR_KEY_PIN (Pin03)
|
||||
#define CAT1_PWR_KEY_CLR() PORT_SetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN)
|
||||
#define CAT1_PWR_KEY_SET() PORT_ResetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN)
|
||||
|
||||
#define CAT1_RESET_PORT (PortA)
|
||||
#define CAT1_RESET_PIN (Pin00)
|
||||
#define CAT1_RESET_CLR() PORT_SetBits(CAT1_RESET_PORT, CAT1_RESET_PIN)
|
||||
#define CAT1_RESET_SET() PORT_ResetBits(CAT1_RESET_PORT, CAT1_RESET_PIN)
|
||||
|
||||
#define CAT1_WAKEUP_PORT (PortA)
|
||||
#define CAT1_WAKEUP_PIN (Pin02)
|
||||
#define CAT1_WAKEUP_CLR() PORT_SetBits(CAT1_WAKEUP_PORT, CAT1_WAKEUP_PIN)
|
||||
#define CAT1_WAKEUP_SET() PORT_ResetBits(CAT1_WAKEUP_PORT, CAT1_WAKEUP_PIN)
|
||||
|
||||
//RS485 Ch1
|
||||
#define RS485_CH1_USART_CH (M4_USART2)
|
||||
@@ -151,45 +152,22 @@
|
||||
//#define RS485_CH2_VOL_5V() PORT_SetBits(RS485_CH2_VOL_CTRL_PORT, RS485_CH2_VOL_CTRL_PIN)
|
||||
//#define RS485_CH2_VOL_12V() PORT_ResetBits(RS485_CH2_VOL_CTRL_PORT, RS485_CH2_VOL_CTRL_PIN)
|
||||
|
||||
//ETH OR CAT1
|
||||
#define ETH_OR_CAT1_USART_CH (M4_USART4)
|
||||
#define ETH_OR_CAT1_USART_RX_PORT (PortB)
|
||||
#define ETH_OR_CAT1_USART_RX_PIN (Pin09)
|
||||
#define ETH_OR_CAT1_USART_TX_PORT (PortC)
|
||||
#define ETH_OR_CAT1_USART_TX_PIN (Pin13)
|
||||
#define ETH_OR_CAT1_USART_RX_FUNC (Func_Usart4_Rx)
|
||||
#define ETH_OR_CAT1_USART_TX_FUNC (Func_Usart4_Tx)
|
||||
#define ETH_OR_CAT1_USART_RI_NUM (INT_USART4_RI)
|
||||
#define ETH_OR_CAT1_USART_EI_NUM (INT_USART4_EI)
|
||||
#define ETH_OR_CAT1_USART_TI_NUM (INT_USART4_TI)
|
||||
#define ETH_OR_CAT1_USART_TCI_NUM (INT_USART4_TCI)
|
||||
#define ETH_OR_CAT1_FCG1_PERIPH (PWC_FCG1_PERIPH_USART4)
|
||||
//ETH
|
||||
#define ETH_USART_CH (M4_USART4)
|
||||
#define ETH_USART_RX_PORT (PortB)
|
||||
#define ETH_USART_RX_PIN (Pin09)
|
||||
#define ETH_USART_TX_PORT (PortC)
|
||||
#define ETH_USART_TX_PIN (Pin13)
|
||||
#define ETH_USART_RX_FUNC (Func_Usart4_Rx)
|
||||
#define ETH_USART_TX_FUNC (Func_Usart4_Tx)
|
||||
#define ETH_USART_RI_NUM (INT_USART4_RI)
|
||||
#define ETH_USART_EI_NUM (INT_USART4_EI)
|
||||
#define ETH_USART_TI_NUM (INT_USART4_TI)
|
||||
#define ETH_USART_TCI_NUM (INT_USART4_TCI)
|
||||
#define ETH_FCG1_PERIPH (PWC_FCG1_PERIPH_USART4)
|
||||
|
||||
#define ETH_OR_CAT1_CTRL_PORT (PortB)
|
||||
#define ETH_OR_CAT1_CTRL_PIN (Pin08)
|
||||
|
||||
#if (HARDWARE_VERSION == 12)
|
||||
#define ETH_ON() PORT_SetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN)
|
||||
#define CAT1_ON() PORT_ResetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN)
|
||||
#elif (HARDWARE_VERSION >= 13)
|
||||
#define ETH_ON() PORT_ResetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN)
|
||||
#define CAT1_ON() PORT_SetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN)
|
||||
#endif
|
||||
|
||||
//#define ETH_OR_CAT1_TX_CTRL_PORT (PortH)
|
||||
//#define ETH_OR_CAT1_TX_CTRL_PIN (Pin02)
|
||||
//#define ETH_ON() { PORT_SetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN); PORT_SetBits(ETH_OR_CAT1_TX_CTRL_PORT, ETH_OR_CAT1_TX_CTRL_PIN); }
|
||||
//#define CAT1_ON() { PORT_ResetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN); PORT_ResetBits(ETH_OR_CAT1_TX_CTRL_PORT, ETH_OR_CAT1_TX_CTRL_PIN);}
|
||||
|
||||
#define CAT1_PWR_KEY_PORT (PortA)
|
||||
#define CAT1_PWR_KEY_PIN (Pin03)
|
||||
#define CAT1_PWR_KEY_CLR() PORT_SetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN)
|
||||
#define CAT1_PWR_KEY_SET() PORT_ResetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN)
|
||||
|
||||
#define CAT1_RESET_PORT (PortA)
|
||||
#define CAT1_RESET_PIN (Pin00)
|
||||
#define CAT1_RESET_CLR() PORT_SetBits(CAT1_RESET_PORT, CAT1_RESET_PIN)
|
||||
#define CAT1_RESET_SET() PORT_ResetBits(CAT1_RESET_PORT, CAT1_RESET_PIN)
|
||||
#define ETH_ON() ETH_RESET_SET()
|
||||
#define ETH_OFF() ETH_RESET_CLR()
|
||||
|
||||
#define ETH_RESET_PORT (PortB)
|
||||
#define ETH_RESET_PIN (Pin05)
|
||||
@@ -336,49 +314,58 @@ bool SDCardWriteBlocks(uint32_t u32BlkStartAddr, uint32_t u32BlkEndAddr, uint8_t
|
||||
|
||||
#define BAT_COLL_ADC_CH (ADC1_CH1)
|
||||
|
||||
//帧头结构体
|
||||
//帧头结构体 - 0x7D + 6字节MAC + 命令 + 载荷长度 (与HC32F460BootLoader一致)
|
||||
typedef struct {
|
||||
uint8_t Header;
|
||||
uint8_t SlvAddr;
|
||||
uint8_t Cmd;
|
||||
uint8_t PayloadLen;
|
||||
}update_protocol_hd_t;
|
||||
uint8_t Header; //帧头 0x7D
|
||||
uint8_t DevMac[6]; //设备MAC地址(6字节)
|
||||
uint8_t Cmd; //命令码
|
||||
uint8_t PayloadLen; //载荷长度
|
||||
}__attribute__((packed))update_protocol_hd_t, *pUpdateProtocolHd;
|
||||
|
||||
//主机下发升级请求载荷结构体
|
||||
//主机下发升级请求载荷结构体 (CMD = 0x81)
|
||||
typedef struct {
|
||||
uint16_t PackageNum;
|
||||
uint32_t AppSize;
|
||||
uint32_t AppCrc32;
|
||||
uint16_t PackageNum; //总包数
|
||||
uint32_t AppSize; //APP固件大小
|
||||
uint32_t AppCrc32; //CRC32校验值
|
||||
}__attribute__ ((packed))update_protocol_req_t;
|
||||
|
||||
//从机请求下发结构体
|
||||
//从机请求下发结构体 (CMD = 0x02)
|
||||
typedef struct {
|
||||
uint16_t PackageIndex;
|
||||
uint32_t PackageNum;
|
||||
uint16_t PackageIndex; //当前请求包序号
|
||||
uint16_t PackageNum; //总包数
|
||||
}__attribute__ ((packed))update_protocol_get_t;
|
||||
|
||||
//主机应答下发数据结构体
|
||||
//主机应答下发数据结构体 (CMD = 0x82)
|
||||
typedef struct {
|
||||
uint16_t PackageIndex;
|
||||
uint16_t PackageNum;
|
||||
uint8_t DataLen;
|
||||
uint16_t PackageIndex; //当前包序号
|
||||
uint16_t PackageNum; //总包数
|
||||
uint8_t DataLen; //数据长度
|
||||
}__attribute__ ((packed))update_protocol_rsp_t;
|
||||
|
||||
//boot参数结构体 (与HC32F460BootLoader的BootPara_t一致)
|
||||
typedef struct {
|
||||
uint32_t AppFlag;
|
||||
uint32_t DevType;
|
||||
uint32_t DevAddr;
|
||||
uint32_t UpdateFlag;
|
||||
uint32_t PackageNum;
|
||||
uint32_t AppSize;
|
||||
uint32_t Crc32Check;
|
||||
uint32_t AppFlag; //应用启动标志
|
||||
uint32_t UpdateFlag; //升级标志
|
||||
uint32_t PackageCnt; //数据包总数
|
||||
uint32_t AppSize; //应用程序大小
|
||||
uint32_t Crc32Check; //CRC32校验值
|
||||
uint32_t FirstRunFlag; //首次运行标志
|
||||
uint8_t GwMac[6]; //网关MAC地址
|
||||
uint8_t SvrAddr[4]; //默认服务器IP地址
|
||||
uint16_t SvrPort; //默认服务器端口
|
||||
uint32_t LoraFreq; //默认Lora中心频率
|
||||
int8_t Much; //主上传通道
|
||||
int8_t Auch; //辅助上传通道
|
||||
int8_t Duch; //调试/升级通道
|
||||
uint8_t CuchMask; //通讯单元通道掩码
|
||||
}boot_para_t;
|
||||
|
||||
void BSP_Init(void);
|
||||
|
||||
void DbgUart_Config(uint32_t BaudRate);
|
||||
void DebugUartSend(uint8_t *sData, uint16_t sLen);
|
||||
void DbgRxIrqCallback(uint8_t rData);
|
||||
void DbgOrCat1Uart_Config(uint32_t BaudRate);
|
||||
void DebugOrCat1UartSend(uint8_t *sData, uint16_t sLen);
|
||||
void DbgOrCat1RxIrqCallback(uint8_t rData);
|
||||
void Cat1RxIrqCallback(uint8_t rData);
|
||||
|
||||
void RS485Ch1_Config(uint32_t BaudRate);
|
||||
void RS485Ch1UartSend(uint8_t *sData, uint16_t sLen);
|
||||
@@ -388,8 +375,9 @@ void RS485Ch2_Config(uint32_t BaudRate);
|
||||
void RS485Ch2UartSend(uint8_t *sData, uint16_t sLen);
|
||||
void RS485Ch2RxIrqCallback(uint8_t rData);
|
||||
|
||||
void EthOrCat1UartSend(uint8_t *sData, uint16_t sLen);
|
||||
void EthOrCat1RxIrqCallback(uint8_t rData);
|
||||
void Eth_Config(uint32_t BaudRate);
|
||||
void EthUartSend(uint8_t *sData, uint16_t sLen);
|
||||
void EthIrqCallbackHandler(uint8_t rData);
|
||||
|
||||
void LoraTxRxIrqCallback(void);
|
||||
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
#include "Public.h"
|
||||
#include "DebugCmd.h"
|
||||
|
||||
#define MAC_ADDR_TYPE 0//0为测试服务器
|
||||
#define SOFTWARE_VERSION 13
|
||||
#define HARDWARE_VERSION 12
|
||||
|
||||
extern bool MainDispEn;
|
||||
#define MAIN_DBG_LOG(...) { if(MainDispEn) Debug_Printf(__VA_ARGS__);}
|
||||
|
||||
@@ -1,96 +0,0 @@
|
||||
#ifndef _PROTOCOL_H_
|
||||
#define _PROTOCOL_H_
|
||||
|
||||
|
||||
#include "stdint.h"
|
||||
|
||||
#define PROTOCOL_BUF_MAX (512)
|
||||
|
||||
#define PROTOCOL_HEAD (0x527A)
|
||||
|
||||
#define PROTOCOL_FRAME_HEAD_SIZE (7) // 最小帧长:头(2) + 地址(2) + 命令(1) + 长度(2) + CRC(2)
|
||||
|
||||
#define PROTOCOL_FRAME_MIN_SIZE (9) // 最小帧长:头(2) + 地址(2) + 命令(1) + 长度(2) + CRC(2)
|
||||
// 错误码定义
|
||||
typedef enum {
|
||||
PROTOCOL_SUCCESS = 0,
|
||||
PROTOCOL_ERR_INVALID_PARAM,
|
||||
PROTOCOL_ERR_BUFFER_OVERFLOW,
|
||||
PROTOCOL_ERR_CRC
|
||||
}protocol_err_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PROTOCOL_CMD_GET_AD =0x81,
|
||||
PROTOCOL_CMD_GET_TP =0x82,
|
||||
|
||||
PROTOCOL_CMD_SET_ID =0x83,
|
||||
PROTOCOL_CMD_GET_ID =0x84,
|
||||
|
||||
PROTOCOL_CMD_SET_TP_OFFSET =0x8A,
|
||||
PROTOCOL_CMD_GET_TP_OFFSET =0x8B,
|
||||
|
||||
PROTOCOL_CMD_RESET_CHANNEL =0x8F,
|
||||
|
||||
}protocol_cmd_t;
|
||||
|
||||
typedef struct __attribute__((packed)) {
|
||||
uint8_t status;
|
||||
float value;
|
||||
} ch_data_t;
|
||||
|
||||
typedef struct __attribute__((packed)) {
|
||||
uint8_t dev_status;
|
||||
ch_data_t channels[8];
|
||||
uint8_t reserved[7];
|
||||
} ad_datas_t;
|
||||
|
||||
typedef struct __attribute__((packed)) {
|
||||
uint8_t dev_status;
|
||||
ch_data_t channels[8];
|
||||
uint8_t reserved[7];
|
||||
} tp_datas_t;
|
||||
|
||||
typedef struct __attribute__((packed)) {
|
||||
uint8_t id;
|
||||
uint8_t reserved[3];
|
||||
} id_data_t;
|
||||
|
||||
typedef struct __attribute__((packed)) {
|
||||
uint8_t id;
|
||||
union{
|
||||
uint8_t bytes[4];
|
||||
float value;
|
||||
}prams;
|
||||
|
||||
} offset_set_data_t,offset_get_data_t;
|
||||
|
||||
typedef struct __attribute__((packed)) {
|
||||
uint8_t id;
|
||||
}offset_get_param_t;
|
||||
|
||||
extern int protocol_pack_frame(
|
||||
uint16_t slave_addr,
|
||||
uint8_t command,const
|
||||
uint8_t *payload,
|
||||
uint16_t payload_len,
|
||||
uint8_t *buffer,uint16_t buffer_size,
|
||||
uint16_t *packed_len
|
||||
);
|
||||
|
||||
extern int protocol_unpack_frame(
|
||||
const uint8_t *frame,
|
||||
uint16_t frame_len,
|
||||
uint16_t *slave_addr,
|
||||
uint8_t *command,
|
||||
uint8_t *payload,
|
||||
uint16_t *payload_len);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
/******************************************************************************
|
||||
* @brief 环形缓冲区管理(参考linux/kfifo)
|
||||
*
|
||||
* Copyright (c) 2016~2020, <morro_luo@163.com>
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2016-05-30 Morro 初版完成
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef _RING_BUF_H_
|
||||
#define _RING_BUF_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*环形缓冲区管理器*/
|
||||
typedef struct {
|
||||
unsigned char *buf; /*环形缓冲区 */
|
||||
unsigned int size; /*环形缓冲区 */
|
||||
unsigned int front; /*头指针 */
|
||||
unsigned int rear; /*尾指针 */
|
||||
}ring_buf_t;
|
||||
|
||||
bool ring_buf_init(ring_buf_t *r,unsigned char *buf,unsigned int size);
|
||||
|
||||
void ring_buf_clr(ring_buf_t *r);
|
||||
|
||||
int ring_buf_len(ring_buf_t *r);
|
||||
|
||||
int ring_buf_put(ring_buf_t *r,unsigned char *buf,unsigned int len);
|
||||
|
||||
int ring_buf_get(ring_buf_t *r,unsigned char *buf,unsigned int len);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -42,20 +42,20 @@ uint32_t SpiFlashReadId(void);
|
||||
|
||||
//#if (LORA_MODULE == WH_LR36_L)
|
||||
//#define LOG_SAV_SIZE 78
|
||||
//#define LOG_SAV_NUM_SECTOR 52 //每扇区存储数量
|
||||
//#define LOG_SAV_NUM_SECTOR 52 //每扇区存储数量
|
||||
//#else
|
||||
//#define LOG_SAV_SIZE 78 //150
|
||||
//#define LOG_SAV_NUM_SECTOR 52 //27 //每扇区存储数量
|
||||
//#define LOG_SAV_NUM_SECTOR 52 //27 //每扇区存储数量
|
||||
//#endif
|
||||
|
||||
#define LOG_SAV_SIZE_MAX 256
|
||||
#define LOG_SAV_NUM_MAX ((SPIFLASH_SECTOR_NUM - LOG_SAV_START_SECTOR) * LOG_SAV_NUM_SECTOR)
|
||||
|
||||
typedef struct {
|
||||
uint32_t LogSavFlag; //日志存储标志
|
||||
uint32_t LogIdx; //日志序号
|
||||
uint32_t LogEndAddr; //日志结束地址
|
||||
uint32_t TimeStamp; //存储时间
|
||||
uint32_t LogSavFlag; //日志存储标志
|
||||
uint32_t LogIdx; //日志序号
|
||||
uint32_t LogEndAddr; //日志结束地址
|
||||
uint32_t TimeStamp; //存储时间
|
||||
}LogHeader_t, *LogHeader;
|
||||
|
||||
void SavMMC5983Calib(uint8_t *wData, uint32_t wLen);
|
||||
|
||||
@@ -9,6 +9,8 @@ typedef void (*update_send_t)(uint8_t *pBuf,uint16_t len);
|
||||
|
||||
void update_init(update_send_t pCbs);
|
||||
|
||||
void update_set_devmac(uint8_t *DevMac);
|
||||
|
||||
int update_unpack(uint8_t* rxData, int rLen,uint8_t *cmd, uint8_t* dev_addr, void *pUser, int *pLen);
|
||||
|
||||
void update_send_cmd(uint8_t Cmd, uint16_t Indx, int PageNum);
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
#ifndef _UTILS_H_
|
||||
#define _UTILS_H_
|
||||
|
||||
#include "stdint.h"
|
||||
|
||||
extern uint16_t modbus_crc16(uint8_t *buf, int len);
|
||||
|
||||
#endif
|
||||
@@ -1,126 +0,0 @@
|
||||
#include "ADS1231.h"
|
||||
|
||||
extern float Temperature;
|
||||
|
||||
|
||||
void ADS1231_Open(void)
|
||||
{
|
||||
PDWN1_SET();
|
||||
PDWN2_SET();
|
||||
PDWN3_SET();
|
||||
PDWN4_SET();
|
||||
}
|
||||
|
||||
void ADS1231_HighSpeedSet(void)
|
||||
{
|
||||
SPEED1_SET();
|
||||
SPEED2_SET();
|
||||
SPEED3_SET();
|
||||
SPEED4_SET();
|
||||
}
|
||||
|
||||
void ADS1231_LowSpeedSet(void)
|
||||
{
|
||||
SPEED1_RESET();
|
||||
SPEED2_RESET();
|
||||
SPEED3_RESET();
|
||||
SPEED4_RESET();
|
||||
}
|
||||
|
||||
uint32_t GpioAGetDout(en_pin_t enPin)
|
||||
{
|
||||
return *(uint32_t *)((uint32_t)(&M4_PORT->PIDRA)) & (enPin);
|
||||
}
|
||||
|
||||
uint32_t GpioBGetDout(en_pin_t enPin)
|
||||
{
|
||||
return *(uint32_t *)((uint32_t)(&M4_PORT->PIDRB)) & (enPin);
|
||||
}
|
||||
|
||||
bool ADS1231_Read(uint32_t *r_data, uint8_t channel) {
|
||||
uint8_t i;
|
||||
uint32_t data = 0;
|
||||
|
||||
switch(channel) {
|
||||
case 0:
|
||||
if(GpioAGetDout(DRDY_DOUT1_PIN) != 0)
|
||||
return false;
|
||||
|
||||
for(i = 0; i < 24; i++) {
|
||||
SCLK1_SET();
|
||||
data <<= 0x01;
|
||||
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
|
||||
SCLK1_RESET();
|
||||
|
||||
if(GpioAGetDout(DRDY_DOUT1_PIN) != 0)
|
||||
data |= 0x01;
|
||||
}
|
||||
SCLK1_SET();
|
||||
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
|
||||
SCLK1_RESET();
|
||||
break;
|
||||
case 1:
|
||||
if(GpioAGetDout(DRDY_DOUT2_PIN) != 0)
|
||||
return false;
|
||||
|
||||
for(i = 0; i < 24; i++) {
|
||||
SCLK2_SET();
|
||||
data <<= 0x01;
|
||||
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
|
||||
SCLK2_RESET();
|
||||
__NOP(); __NOP();
|
||||
if(GpioAGetDout(DRDY_DOUT2_PIN) != 0)
|
||||
data |= 0x01;
|
||||
}
|
||||
SCLK2_SET();
|
||||
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
|
||||
SCLK2_RESET();
|
||||
break;
|
||||
case 2:
|
||||
if(GpioBGetDout(DRDY_DOUT3_PIN) != 0)
|
||||
return false;
|
||||
|
||||
for(i = 0; i < 24; i++) {
|
||||
SCLK3_SET();
|
||||
data <<= 0x01;
|
||||
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
|
||||
SCLK3_RESET();
|
||||
if(GpioBGetDout(DRDY_DOUT3_PIN) != 0 )
|
||||
data |= 0x01;
|
||||
}
|
||||
SCLK3_SET();
|
||||
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
|
||||
SCLK3_RESET();
|
||||
break;
|
||||
case 3:
|
||||
if(GpioBGetDout(DRDY_DOUT4_PIN) != 0 )
|
||||
return false;
|
||||
|
||||
for(i = 0; i < 24; i++) {
|
||||
SCLK4_SET();
|
||||
data <<= 0x01;
|
||||
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
|
||||
SCLK4_RESET();
|
||||
if(GpioBGetDout(DRDY_DOUT4_PIN) != 0 )
|
||||
data |= 0x01;
|
||||
}
|
||||
SCLK4_SET();
|
||||
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
|
||||
SCLK4_RESET();
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
if(data <= 0x00ffffff) {
|
||||
if(data > 0x007fffff)
|
||||
*r_data = data|0xff000000;
|
||||
else
|
||||
*r_data = data;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,87 +0,0 @@
|
||||
#include "encryption.h"
|
||||
|
||||
//从机加密表
|
||||
const unsigned char EPT_Table[32][6] = {
|
||||
{1, 6, 4, 2, 3, 5}, {2, 4, 6, 3, 5, 1}, {3, 5, 6, 2, 1, 4}, {5, 3, 2, 1, 4, 6},
|
||||
{4, 2, 3, 1, 5, 6}, {6, 3, 5, 1, 4, 2}, {3, 5, 2, 6, 4, 1}, {2, 5, 4, 3, 1, 6},
|
||||
{2, 4, 1, 5, 3, 6}, {4, 6, 1, 3, 2, 5}, {4, 2, 1, 5, 6, 3}, {3, 2, 6, 5, 1, 4},
|
||||
{2, 6, 5, 1, 4, 3}, {6, 4, 3, 1, 2, 5}, {1, 6, 3, 2, 4, 5}, {5, 3, 4, 6, 2, 1},
|
||||
{5, 3, 1, 2, 6, 4}, {1, 4, 2, 6, 5, 3}, {3, 5, 2, 1, 4, 6}, {6, 1, 4, 2, 3, 5},
|
||||
{4, 1, 2, 5, 3, 6}, {4, 2, 6, 3, 5, 1}, {2, 6, 1, 4, 3, 5}, {4, 3, 1, 5, 6, 2},
|
||||
{5, 1, 2, 4, 6, 3}, {6, 5, 1, 3, 4, 2}, {2, 1, 6, 3, 5, 4}, {1, 5, 6, 3, 4, 2},
|
||||
{3, 6, 5, 4, 2, 1}, {1, 2, 6, 3, 5, 4}, {4, 6, 5, 3, 2, 1}, {5, 3, 4, 2, 6, 1}
|
||||
};
|
||||
|
||||
//从机解密表:
|
||||
const unsigned char DPT_Table[32][5] ={
|
||||
{1, 4, 2, 3, 5}, {2, 4, 3, 5, 1}, {3, 5, 2, 1, 4}, {5, 3, 2, 1, 4},
|
||||
{4, 2, 3, 1, 5}, {3, 5, 1, 4, 2}, {3, 5, 2, 4, 1}, {2, 5, 4, 3, 1},
|
||||
{2, 4, 1, 5, 3}, {4, 1, 3, 2, 5}, {4, 2, 1, 5, 3}, {3, 2, 5, 1, 4},
|
||||
{2, 5, 1, 4, 3}, {4, 3, 1, 2, 5}, {1, 3, 2, 4, 5}, {5, 3, 4, 2, 1},
|
||||
{5, 3, 1, 2, 4}, {1, 4, 2, 5, 3}, {3, 2, 1, 4, 5}, {1, 4, 5, 2, 3},
|
||||
{4, 1, 2, 5, 3}, {4, 2, 3, 5, 1}, {2, 1, 4, 3, 5}, {4, 3, 1, 5, 2},
|
||||
{5, 1, 2, 4, 3}, {5, 1, 3, 4, 2}, {2, 1, 3, 5, 4}, {1, 5, 3, 4, 2},
|
||||
{3, 5, 4, 2, 1}, {1, 2, 3, 5, 4}, {4, 5, 3, 2, 1}, {5, 3, 4, 2, 1}
|
||||
};
|
||||
|
||||
//数据位加密表:
|
||||
const unsigned char EPT_D[32] = {
|
||||
0x23, 0x4c, 0x92, 0x38, 0x52, 0xa4, 0x9a, 0x61,
|
||||
0x86, 0xc8, 0x70, 0x16, 0x32, 0x58, 0x62, 0x83,
|
||||
0xa5, 0x16, 0x1c, 0x49, 0x48, 0xc1, 0x8c, 0x91,
|
||||
0xd0, 0x2c, 0x49, 0x42, 0xc1, 0x8c, 0x98, 0xd0
|
||||
};
|
||||
|
||||
/****************************************************************/
|
||||
/* 加密函数 */
|
||||
/* */
|
||||
/*函数入口: *data,未加密的普通协议数据 */
|
||||
/* */
|
||||
/*函数出口: *EPT_data,生成的加密协议 */
|
||||
/****************************************************************/
|
||||
void Encrypt_Code(unsigned char *data, unsigned char *EPT_data) {
|
||||
unsigned char Edata[6];
|
||||
unsigned char i = 0;
|
||||
unsigned char check;
|
||||
unsigned char ept_byte;
|
||||
|
||||
check = (data[0]+data[1]+data[2]+data[3]+data[4]+data[5]) % 0xff;
|
||||
ept_byte = check % 32;
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
Edata[i] = ((~(data[i] & EPT_D[ept_byte])) & EPT_D[ept_byte]) | (data[i] & (~EPT_D[ept_byte]));
|
||||
}
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
EPT_data[i] = Edata[EPT_Table[ept_byte][i]-1];
|
||||
}
|
||||
|
||||
EPT_data[6] = ((~(check & 0xaa)) & 0xaa) | (check & 0x55);
|
||||
}
|
||||
|
||||
/****************************************************************/
|
||||
/* 解密函数 */
|
||||
/* */
|
||||
/*函数入口: *EPT_data,需要解密的加密协议 */
|
||||
/* */
|
||||
/*函数出口: *DPT_data,生成的普通协议 */
|
||||
/****************************************************************/
|
||||
void Decrypt_Code(unsigned char *EPT_data,unsigned char *DPT_data) {
|
||||
unsigned char data[5];
|
||||
unsigned char i = 0;
|
||||
unsigned char check;
|
||||
unsigned char ept_byte;
|
||||
|
||||
check = ((~(EPT_data[5]&0xaa))&0xaa)|(EPT_data[5]&0x55);
|
||||
ept_byte = check % 32;
|
||||
|
||||
for(i=0;i<5;i++) {
|
||||
data[i] = ((~(EPT_data[i]&EPT_D[ept_byte]))&EPT_D[ept_byte])|(EPT_data[i]&(~EPT_D[ept_byte]));
|
||||
}
|
||||
for(i=0;i<5;i++) {
|
||||
DPT_data[DPT_Table[ept_byte][i]-1] = data[i];
|
||||
}
|
||||
DPT_data[5] = check;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,348 @@
|
||||
#include "EthTask.h"
|
||||
#include "Public.h"
|
||||
#include "DebugCmd.h"
|
||||
|
||||
static rt_sem_t EthIRQ_Sem = RT_NULL;
|
||||
static rt_thread_t EthRev_Thread = RT_NULL;
|
||||
|
||||
static EthTask_t Eth;
|
||||
|
||||
static char EthRxBuff[ETH_RX_LEN_MAX];
|
||||
static uint16_t EthRxLen;
|
||||
static uint8_t EthRevTimeOutCnt;
|
||||
|
||||
static uint8_t Payload[ETH_RX_LEN_MAX];
|
||||
static char CommUnitSendASCII[ETH_RX_LEN_MAX * 2];
|
||||
|
||||
static bool EthDispEn = false;
|
||||
|
||||
#define ETH_DBG_LOG(...) { if(EthDispEn) Debug_Printf(__VA_ARGS__);}
|
||||
|
||||
void ETHOnOff(bool OnOff)
|
||||
{
|
||||
EthDispEn = OnOff;
|
||||
if(OnOff)
|
||||
Debug_Printf("\r\nEth Display Enable!\r\n\r\n");
|
||||
else
|
||||
Debug_Printf("\r\nEth Display Disable!\r\n\r\n");
|
||||
}
|
||||
|
||||
void ETHStop(void)
|
||||
{
|
||||
Eth.Status = ETH_OFF;
|
||||
}
|
||||
|
||||
void ETHReset(void)
|
||||
{
|
||||
Eth.Status = ETH_RESET;
|
||||
}
|
||||
|
||||
void ETHTriggerRegister(void)
|
||||
{
|
||||
Eth.Status = ETH_REG_SVR;
|
||||
}
|
||||
|
||||
static int GateWayRegister(uint8_t *TxBuff)
|
||||
{
|
||||
uint16_t UnitCommCnt = 0;
|
||||
uint8_t *p = &TxBuff[0];
|
||||
uint16_t len = 5;
|
||||
|
||||
if(Eth.GateWay->ConfigPara.Rs485Ch1.CommUnitEnable == true && Eth.GateWay->ConfigPara.Rs485Ch1.Enable == true) {
|
||||
UnitCommCnt++;
|
||||
memcpy(&p[len], Eth.GateWay->ConfigPara.Rs485Ch1.CUPara.Para.Mac[0], 6);
|
||||
len += 6;
|
||||
}
|
||||
if(Eth.GateWay->ConfigPara.Rs485Ch2.CommUnitEnable == true && Eth.GateWay->ConfigPara.Rs485Ch2.Enable == true) {
|
||||
UnitCommCnt++;
|
||||
memcpy(&p[len], Eth.GateWay->ConfigPara.Rs485Ch2.CUPara.Para.Mac[0], 6);
|
||||
len += 6;
|
||||
}
|
||||
for(int i = 0; i < COMMUNIT_NUM_MAX; i++) {
|
||||
if(Eth.GateWay->ConfigPara.CommUnitArray[i].RegFlag == true) {
|
||||
for(int j = 0; j < Eth.GateWay->ConfigPara.CommUnitArray[i].SensorN; j++)
|
||||
{
|
||||
memcpy(&p[len], Eth.GateWay->ConfigPara.CommUnitArray[i].Mac[j], 6);
|
||||
len += 6;
|
||||
UnitCommCnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
TxBuff[0] = (len - 3) & 0x00ff;
|
||||
TxBuff[1] = ((len - 3) >> 8) & 0x00ff;
|
||||
TxBuff[2] = NET_COMM_CMD_REG;
|
||||
TxBuff[3] = UnitCommCnt & 0x00ff;
|
||||
TxBuff[4] = (UnitCommCnt >> 8) & 0x00ff;
|
||||
return len;
|
||||
}
|
||||
|
||||
void EthLoopHandler(void)
|
||||
{
|
||||
rt_err_t result;
|
||||
|
||||
switch(Eth.Status) {
|
||||
case ETH_IDEL:
|
||||
rt_thread_delay(1);
|
||||
if(Eth.ResetDelayCnt > 0) {
|
||||
Eth.ResetDelayCnt--;
|
||||
}
|
||||
else {
|
||||
Eth.Status = ETH_RESET;
|
||||
}
|
||||
break;
|
||||
|
||||
case ETH_RESET:
|
||||
ETH_DBG_LOG("ETH Reset!\r\n");
|
||||
Eth.SendNoDataCnt = 0;
|
||||
ETH_RESET_CLR();
|
||||
rt_thread_delay(10);
|
||||
ETH_RESET_SET();
|
||||
rt_thread_delay(2000);
|
||||
Eth.Status = ETH_WAIT_LINK;
|
||||
Eth.LinkWaitCnt = 0;
|
||||
Eth.FirstRegFlag = true;
|
||||
break;
|
||||
|
||||
case ETH_WAIT_LINK:
|
||||
if(Eth.LinkWaitCnt == 0) {
|
||||
ETH_DBG_LOG("ETH Waiting for module ready...\r\n");
|
||||
rt_thread_delay(2000);
|
||||
}
|
||||
if(ETH_LINK_GET() == Reset) {
|
||||
ETH_DBG_LOG("ETH Link OK!\r\n");
|
||||
if(Eth.GateWay->ConfigPara.Much != CH_ETH) {
|
||||
GateWayRegister(Payload);
|
||||
Eth.TxLen = NetCommOrgData(Eth.GateWay, Payload, Eth.TxBuff);
|
||||
HexToAscii(Eth.TxBuff, CommUnitSendASCII, Eth.TxLen);
|
||||
CommUnitSendASCII[Eth.TxLen * 2] = 0;
|
||||
EthUartSend((uint8_t *)CommUnitSendASCII, Eth.TxLen * 2);
|
||||
ETH_DBG_LOG("Eth Send Reg: %s\r\n", CommUnitSendASCII);
|
||||
Eth.Status = ETH_WAIT_RECV;
|
||||
Eth.RecvTimeoutCnt = 0;
|
||||
Eth.SendRetryCnt = 0;
|
||||
}
|
||||
else {
|
||||
Eth.Status = ETH_REG_SVR;
|
||||
}
|
||||
}
|
||||
else {
|
||||
Eth.LinkWaitCnt++;
|
||||
if(Eth.LinkWaitCnt >= ETH_LINK_WAIT_TIME_MAX) {
|
||||
ETH_DBG_LOG("ETH Link Timeout, Reset!\r\n");
|
||||
Eth.Status = ETH_OFF;
|
||||
}
|
||||
rt_thread_delay(1);
|
||||
}
|
||||
break;
|
||||
|
||||
case ETH_REG_SVR:
|
||||
{
|
||||
if(Eth.FirstRegFlag) {
|
||||
ETH_DBG_LOG("ETH First Register, waiting for system stable...\r\n");
|
||||
rt_thread_delay(ETH_FIRST_REG_DELAY);
|
||||
Eth.FirstRegFlag = false;
|
||||
Eth.SendRetryCnt = 0;
|
||||
}
|
||||
|
||||
GateWayRegister(Payload);
|
||||
Eth.TxLen = NetCommOrgData(Eth.GateWay, Payload, Eth.TxBuff);
|
||||
HexToAscii(Eth.TxBuff, CommUnitSendASCII, Eth.TxLen);
|
||||
CommUnitSendASCII[Eth.TxLen * 2] = 0;
|
||||
EthUartSend((uint8_t *)CommUnitSendASCII, Eth.TxLen * 2);
|
||||
ETH_DBG_LOG("Eth Send Reg: %s\r\n", CommUnitSendASCII);
|
||||
Eth.Status = ETH_WAIT_RECV;
|
||||
Eth.RecvTimeoutCnt = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case ETH_WAIT_SEND:
|
||||
result = rt_mq_recv(ChannelMQ(*Eth.GateWay, CH_ETH), Payload, ETH_RX_LEN_MAX, 100);
|
||||
if(result == RT_EOK) {
|
||||
Eth.TxLen = NetCommOrgData(Eth.GateWay, Payload, Eth.TxBuff);
|
||||
Eth.Status = ETH_SEND_DATA;
|
||||
}
|
||||
else {
|
||||
if(Eth.Status == ETH_RESET || Eth.Status == ETH_OFF)
|
||||
return;
|
||||
if(ETH_LINK_GET() != Reset) {
|
||||
ETH_DBG_LOG("ETH Link Lost!\r\n");
|
||||
Eth.GateWay->MuchRegFlag = false;
|
||||
Eth.Status = ETH_OFF;
|
||||
}
|
||||
else {
|
||||
rt_thread_delay(1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ETH_SEND_DATA:
|
||||
if(Eth.GateWay->ConfigPara.Much == CH_ETH) {
|
||||
Eth.SendNoDataCnt++;
|
||||
if(Eth.SendNoDataCnt > ETH_SEND_NO_DATA_MAX) {
|
||||
ETH_DBG_LOG("ETH has no receive data for a long time, Reset!\r\n");
|
||||
Eth.SendNoDataCnt = 0;
|
||||
Eth.GateWay->MuchRegFlag = false;
|
||||
Eth.Status = ETH_RESET;
|
||||
break;
|
||||
}
|
||||
}
|
||||
HexToAscii(Eth.TxBuff, CommUnitSendASCII, Eth.TxLen);
|
||||
EthRevTimeOutCnt = 0;
|
||||
EthUartSend((uint8_t *)CommUnitSendASCII, Eth.TxLen * 2);
|
||||
CommUnitSendASCII[Eth.TxLen * 2] = 0;
|
||||
ETH_DBG_LOG("Eth Send: %s\r\n", CommUnitSendASCII);
|
||||
|
||||
Eth.Status = ETH_WAIT_RECV;
|
||||
Eth.RecvTimeoutCnt = 0;
|
||||
Eth.SendRetryCnt = 0;
|
||||
break;
|
||||
|
||||
case ETH_WAIT_RECV:
|
||||
if(Eth.GateWay->ConfigPara.Much != CH_ETH) {
|
||||
Eth.Status = ETH_WAIT_SEND;
|
||||
break;
|
||||
}
|
||||
rt_thread_delay(1);
|
||||
Eth.RecvTimeoutCnt++;
|
||||
|
||||
if(Eth.RecvTimeoutCnt >= ETH_RECV_TIMEOUT_MAX) {
|
||||
ETH_DBG_LOG("ETH Recv Timeout!\r\n");
|
||||
Eth.SendRetryCnt++;
|
||||
if(Eth.SendRetryCnt >= ETH_SEND_RETRY_MAX) {
|
||||
ETH_DBG_LOG("ETH Send Retry Max, Reset!\r\n");
|
||||
Eth.Status = ETH_OFF;
|
||||
}
|
||||
else {
|
||||
if(Eth.GateWay->MuchRegFlag == false) {
|
||||
Eth.Status = ETH_REG_SVR;
|
||||
}
|
||||
else {
|
||||
Eth.Status = ETH_WAIT_SEND;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(ETH_LINK_GET() != Reset) {
|
||||
ETH_DBG_LOG("ETH Link Lost During Wait!\r\n");
|
||||
Eth.GateWay->MuchRegFlag = false;
|
||||
Eth.Status = ETH_OFF;
|
||||
}
|
||||
|
||||
if(Eth.GateWay->MuchRegFlag == true) {
|
||||
ETH_DBG_LOG("ETH Register Success!\r\n");
|
||||
Eth.Status = ETH_WAIT_SEND;
|
||||
Eth.RecvTimeoutCnt = 0;
|
||||
Eth.SendRetryCnt = 0;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case ETH_OFF:
|
||||
ETH_DBG_LOG("ETH Power Off!\r\n");
|
||||
Eth.SendNoDataCnt = 0;
|
||||
Eth.Status = ETH_IDEL;
|
||||
Eth.ResetDelayCnt = ETH_RESET_DELAY_TIME_MAX;
|
||||
break;
|
||||
|
||||
default:
|
||||
Eth.Status = ETH_RESET;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void EthInit(GateWayPara GateWay)
|
||||
{
|
||||
memset(&Eth, 0x00, sizeof(EthTask_t));
|
||||
Eth.Status = ETH_RESET;
|
||||
Eth.GateWay = GateWay;
|
||||
}
|
||||
|
||||
void EthIrqCallbackHandler(uint8_t rData)
|
||||
{
|
||||
if(EthRevTimeOutCnt == 0)
|
||||
EthRxLen = 0;
|
||||
|
||||
if(EthRxLen < ETH_RX_LEN_MAX) {
|
||||
EthRxBuff[EthRxLen++] = rData;
|
||||
}
|
||||
|
||||
EthRevTimeOutCnt = 3;
|
||||
}
|
||||
|
||||
void EthOverHandler(void)
|
||||
{
|
||||
if(EthRevTimeOutCnt > 0)
|
||||
EthRevTimeOutCnt--;
|
||||
|
||||
if(EthRxLen > 0 && EthRevTimeOutCnt == 0) {
|
||||
EthRevTimeOutCnt = 20;
|
||||
rt_sem_release(EthIRQ_Sem);
|
||||
}
|
||||
}
|
||||
|
||||
static void EthRev_Thread_Entry(void *parameter)
|
||||
{
|
||||
rt_err_t result;
|
||||
char RxBuffTemp[ETH_RX_LEN_MAX];
|
||||
uint8_t HexData[ETH_RX_LEN_MAX / 2];
|
||||
|
||||
GateWayPara GateWay = (GateWayPara)parameter;
|
||||
|
||||
rt_kprintf("EthRev Thread is running!\r\n");
|
||||
|
||||
while(1) {
|
||||
result = rt_sem_take(EthIRQ_Sem, 500);
|
||||
if(result == RT_EOK || EthRxLen > 1) {
|
||||
if(EthRxLen == 0) continue;
|
||||
memcpy(RxBuffTemp, EthRxBuff, EthRxLen);
|
||||
RxBuffTemp[EthRxLen] = 0;
|
||||
memset(HexData, 0x00, EthRxLen / 2);
|
||||
uint8_t ret = AsciiToHex(RxBuffTemp, HexData, EthRxLen);
|
||||
if(ret > 0 && HexData[0] == 0x7A) {
|
||||
Eth.SendNoDataCnt = 0;
|
||||
if(GateWay->ConfigPara.Much == CH_ETH)
|
||||
GateWay->MuchRevCallBack(GateWay, HexData, ret);
|
||||
else
|
||||
GateWay->AuchRevCallBack(GateWay, HexData, ret);
|
||||
}
|
||||
else if(EthRxLen > 1) {
|
||||
DebugAnalyze(GateWay, (uint8_t *)RxBuffTemp, EthRxLen);
|
||||
}
|
||||
memset(EthRxBuff, 0x00, ETH_RX_LEN_MAX);
|
||||
EthRxLen = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Eth_Thread_Entry(void *parameter)
|
||||
{
|
||||
GateWayPara GateWay = (GateWayPara)parameter;
|
||||
|
||||
EthIRQ_Sem = rt_sem_create("ethi_sem", 0, RT_IPC_FLAG_FIFO);
|
||||
if(EthIRQ_Sem == RT_NULL) {
|
||||
rt_kprintf("EthIRQ Sem Create Failed!\r\n");
|
||||
}
|
||||
|
||||
EthInit(GateWay);
|
||||
ETH_RESET_CLR();
|
||||
rt_thread_delay(10);
|
||||
ETH_RESET_SET();
|
||||
|
||||
EthRev_Thread = rt_thread_create("EthRev", EthRev_Thread_Entry, parameter, 3000, 3, 20);
|
||||
if (EthRev_Thread != RT_NULL) {
|
||||
rt_thread_startup(EthRev_Thread);
|
||||
}
|
||||
else {
|
||||
rt_kprintf("EthRev Thread Create Failed! Exit...\r\n");
|
||||
return;
|
||||
}
|
||||
rt_kprintf("Eth Thread is running!\r\n");
|
||||
|
||||
while(1) {
|
||||
if(!ChannelIsActive(GateWay->ConfigPara, CH_ETH)) {
|
||||
rt_thread_delay(100);
|
||||
continue;
|
||||
}
|
||||
EthLoopHandler();
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
#include "CatOneTask.h"
|
||||
#include "DebugCmd.h"
|
||||
|
||||
#define UC_OFFLINE_TIME_INTERVAL_MAX (2 * 60 * 60)//离线判断最大时间间隔,单位秒
|
||||
#define UC_OFFLINE_TIME_INTERVAL_MAX (2 * 60 * 60)//离线判断最大时间间隔,单位秒
|
||||
|
||||
static rt_sem_t LoraDioIRQ_Sem = RT_NULL;
|
||||
static rt_thread_t LoraIRQ_Thread = RT_NULL;
|
||||
@@ -14,7 +14,7 @@ void LoraSend(uint8_t* pucBuff, uint8_t ucLen)
|
||||
Sx1276LoRaSendBuffer(pucBuff, ucLen);
|
||||
}
|
||||
|
||||
//Lora接收消息统一放到消息队列,由接收任务处理
|
||||
//Lora接收消息统一放到消息队列,由接收任务处理
|
||||
int LoraRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen)
|
||||
{
|
||||
uint8_t *sData;
|
||||
@@ -41,9 +41,9 @@ void LoraIRQ_Thread_Entry(void *parameter)
|
||||
rt_err_t result;
|
||||
static uint16_t LoraErrCnt = 0;
|
||||
|
||||
Debug_Printf("LoraRev Thread is running!\r\n");
|
||||
Debug_Printf("LoraRev Thread is running!\r\n");
|
||||
while(1) {
|
||||
if(GateWay->ConfigPara.Lora.OnOff == false) {
|
||||
if(GateWay->ConfigPara.Lora.OnOff == false || !ChannelIsActive(GateWay->ConfigPara, CH_LORA)) {
|
||||
rt_thread_delay(100);
|
||||
continue;
|
||||
}
|
||||
@@ -55,9 +55,9 @@ void LoraIRQ_Thread_Entry(void *parameter)
|
||||
}
|
||||
else {
|
||||
LoraErrCnt++;
|
||||
if(LoraErrCnt > LORA_ERR_RESET_DLY_MAX) { //15分钟内没有收到lora数据重启lora模块
|
||||
if(LoraErrCnt > LORA_ERR_RESET_DLY_MAX) { //15分钟内没有收到lora数据重启lora模块
|
||||
LoraErrCnt = 0;
|
||||
Debug_Printf("Lora Reset!\r\n");
|
||||
Debug_Printf("Lora Reset!\r\n");
|
||||
Sx1276LoRaInit(LoraRevCallBack);
|
||||
}
|
||||
}
|
||||
@@ -92,15 +92,15 @@ void Lora_Thread_Entry(void *parameter)
|
||||
Debug_Printf("CatOneIRQ Sem Create Failed!\r\n");
|
||||
}
|
||||
|
||||
LoraIRQ_Thread = rt_thread_create("LoraIRQ", LoraIRQ_Thread_Entry, NULL, 512, 3, 20);
|
||||
LoraIRQ_Thread = rt_thread_create("LoraIRQ", LoraIRQ_Thread_Entry, NULL, 1024, 3, 20);
|
||||
if (LoraIRQ_Thread != RT_NULL)
|
||||
rt_thread_startup(LoraIRQ_Thread);
|
||||
|
||||
Sx1276LoRaInit(LoraRevCallBack);
|
||||
Debug_Printf("Lora Thread is running!\r\n");
|
||||
Debug_Printf("Lora Thread is running!\r\n");
|
||||
#ifdef LORA_LOWPOWER
|
||||
while(1) {
|
||||
if(GateWay->ConfigPara.Lora.OnOff == false) {
|
||||
if(GateWay->ConfigPara.Lora.OnOff == false || !ChannelIsActive(GateWay->ConfigPara, CH_LORA)) {
|
||||
rt_thread_delay(100);
|
||||
continue;
|
||||
}
|
||||
@@ -108,10 +108,10 @@ void Lora_Thread_Entry(void *parameter)
|
||||
result = rt_mq_recv(GateWay->LoraRev_MQ, Payload, 256, 1000);
|
||||
if(result == RT_EOK) {
|
||||
int ret = GateWay->CommUnitRevCallBack(GateWay, &Payload[1], Payload[0], LoRaSendBuffer);
|
||||
if(ret == 0xff) //注册信息
|
||||
if(ret == 0xff) //注册信息
|
||||
continue;
|
||||
}
|
||||
else { //离线判断
|
||||
else { //离线判断
|
||||
for(int i = 0; i < COMMUNIT_NUM_MAX; i++) {
|
||||
if(GateWay->ConfigPara.CommUnitArray[i].RegFlag == true) {
|
||||
if(GateWay->ConfigPara.CommUnitArray[i].CommErrCnt < UC_OFFLINE_TIME_INTERVAL_MAX) {
|
||||
@@ -131,7 +131,7 @@ void Lora_Thread_Entry(void *parameter)
|
||||
GateWay->ConfigPara.CommUnitArray[i].Mac[0][3],
|
||||
GateWay->ConfigPara.CommUnitArray[i].Mac[0][4],
|
||||
GateWay->ConfigPara.CommUnitArray[i].Mac[0][5]);
|
||||
CatOneEthSendQueue(MegData, 10); //发送离线消息
|
||||
UploadSend(MegData, 10); //发送离线消息
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -142,15 +142,15 @@ void Lora_Thread_Entry(void *parameter)
|
||||
if(UnitCommSendFlag == false && UnitCommReadDelayCnt >= GateWay->ConfigPara.CommUnitReadInterval) {
|
||||
if(SendUnitCommIdx < COMMUNIT_NUM_MAX) {
|
||||
if(GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].RegFlag &&
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[2] == 0x01) {
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][2] == 0x01) {
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].RevNewDataFlag = false;
|
||||
Debug_Printf("Lora Read CommUnit: %02X:%02X:%02X:%02X:%02X:%02X\r\n",
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0],
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[1],
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[2],
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[3],
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[4],
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[5]);
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][0],
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][1],
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][2],
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][3],
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][4],
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][5]);
|
||||
CommUnitCmdSend(GateWay, GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0], COMM_UNIT_CMD_READ, NULL, 0, Sx1276LoRaSendBuffer);
|
||||
UnitCommSendFlag = true;
|
||||
}
|
||||
@@ -168,10 +168,17 @@ void Lora_Thread_Entry(void *parameter)
|
||||
if(UnitCommReadDelayCnt < GateWay->ConfigPara.CommUnitReadInterval)
|
||||
UnitCommReadDelayCnt++;
|
||||
|
||||
{
|
||||
uint8_t sData[256];
|
||||
if(rt_mq_recv(ChannelMQ(*GateWay, CH_LORA), sData, 256, 0) == RT_EOK) {
|
||||
uint16_t len = (sData[0] | (sData[1] << 8)) + 3;
|
||||
Sx1276LoRaSendBuffer(sData, len);
|
||||
}
|
||||
}
|
||||
result = rt_mq_recv(GateWay->LoraRev_MQ, Payload, 256, 1000);
|
||||
if(result == RT_EOK) {
|
||||
int ret = GateWay->CommUnitRevCallBack(GateWay, &Payload[1], Payload[0], Sx1276LoRaSendBuffer);
|
||||
if(ret == 0xff) //注册信息
|
||||
if(ret == 0xff) //注册信息
|
||||
continue;
|
||||
|
||||
if(UnitCommSendFlag && GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].RevNewDataFlag) {
|
||||
@@ -179,7 +186,7 @@ void Lora_Thread_Entry(void *parameter)
|
||||
SendUnitCommIdx++;
|
||||
}
|
||||
}
|
||||
else if(UnitCommSendFlag) { //离线判断
|
||||
else if(UnitCommSendFlag) { //离线判断
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].CommErrCnt++;
|
||||
if(GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].CommErrCnt == 10) {
|
||||
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].CommErrCnt = 0;
|
||||
@@ -190,7 +197,7 @@ void Lora_Thread_Entry(void *parameter)
|
||||
MegData[2] = COMM_UNIT_CMD_READ;
|
||||
memcpy(&MegData[3], GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0], 6);
|
||||
MegData[9] = GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].CommStatus;
|
||||
CatOneEthSendQueue(MegData, 10); //发送离线消息
|
||||
UploadSend(MegData, 10); //发送离线消息
|
||||
}
|
||||
}
|
||||
UnitCommSendFlag = false;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -5,6 +5,7 @@
|
||||
#include "CatOneTask.h"
|
||||
#include "DebugCmd.h"
|
||||
#include "update_protocol.h"
|
||||
#include "Update.h"
|
||||
#include "bsp.h"
|
||||
|
||||
//#define RS485_DBG_LOG(...) { if(RS485DispEn) Debug_Printf(__VA_ARGS__);}
|
||||
@@ -17,13 +18,13 @@ SensorCommPara_t SComm2Para;
|
||||
const uint8_t RS485SensorCmdPayLoadLen[RS485_SENSOR_CMD_END] = {0, 0, 0, 1, 0};
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: SavSensorData
|
||||
* 功能描述: 记录传感器数据
|
||||
* 参 数: SensorIdx, 传感器序号
|
||||
Para,传感器结构指针
|
||||
Data, 传感器数据
|
||||
Len, 传感器数据长度
|
||||
* 返 回 值: 无
|
||||
* 函数名称: SavSensorData
|
||||
* 功能描述: 记录传感器数据
|
||||
* 参 数: SensorIdx, 传感器序号
|
||||
Para,传感器结构指针
|
||||
Data, 传感器数据
|
||||
Len, 传感器数据长度
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
static void SavSensorData(uint8_t SensorIdx, CommUnitData CUData, uint8_t *Data, uint8_t Len)
|
||||
{
|
||||
@@ -36,13 +37,13 @@ static void SavSensorData(uint8_t SensorIdx, CommUnitData CUData, uint8_t *Data,
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: RS485Analyze
|
||||
* 功能描述: 485数据解析
|
||||
* 参 数: SCPara, 传感器发送参数
|
||||
Para, 传感器结构指针
|
||||
rData, 传感器数据入口
|
||||
rLen, 传感器数据长度
|
||||
* 返 回 值: 无
|
||||
* 函数名称: RS485Analyze
|
||||
* 功能描述: 485数据解析
|
||||
* 参 数: SCPara, 传感器发送参数
|
||||
Para, 传感器结构指针
|
||||
rData, 传感器数据入口
|
||||
rLen, 传感器数据长度
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
void RS485Analyze(GateWayPara GateWay, SensorCommPara SCPara, CommUnit Para, uint8_t *rData, uint8_t rLen)
|
||||
{
|
||||
@@ -50,7 +51,7 @@ void RS485Analyze(GateWayPara GateWay, SensorCommPara SCPara, CommUnit Para, uin
|
||||
uint8_t *Payload;
|
||||
|
||||
crc16 = (rData[rLen - 1] << 8)|rData[rLen - 2];
|
||||
uint16_t Check = CRC_Modbus(0xA001, rData, rLen - 2);
|
||||
uint16_t Check = CRC_Modbus(CRC16_BASE, rData, rLen - 2);
|
||||
if(crc16 != Check)
|
||||
return;
|
||||
|
||||
@@ -76,6 +77,7 @@ void RS485Analyze(GateWayPara GateWay, SensorCommPara SCPara, CommUnit Para, uin
|
||||
else {
|
||||
MAIN_DBG_LOG("Sensor%d Addr Set failed!\r\n", Header->SlvAddr);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case RS485_SENSOR_CMD_CAIL:
|
||||
@@ -107,37 +109,24 @@ void RS485Analyze(GateWayPara GateWay, SensorCommPara SCPara, CommUnit Para, uin
|
||||
}
|
||||
}
|
||||
|
||||
static void update_on_start(uint8_t* frame, int len, uint8_t* pload, int size)
|
||||
static void update_on_start(GateWayPara GateWay, uint8_t* frame, int len, uint8_t* pload, int size)
|
||||
{
|
||||
update_protocol_req_t* pReq = (void*)&frame[sizeof(update_protocol_hd_t)];
|
||||
|
||||
//TODO:
|
||||
|
||||
boot_para_t cfg = {0};
|
||||
|
||||
cfg.AppFlag = 0;
|
||||
cfg.UpdateFlag = APP_UPDATE_FLAG;
|
||||
cfg.Crc32Check = pReq->AppCrc32;
|
||||
cfg.PackageNum = pReq->PackageNum;
|
||||
cfg.AppSize = pReq->AppSize;
|
||||
/**
|
||||
操作FALSH ,写升级参数
|
||||
**/
|
||||
dev_boot_write_param(cfg);
|
||||
|
||||
update_send_cmd(0x01, 1, pReq->PackageNum);
|
||||
|
||||
//重启进入BOOT
|
||||
NVIC_SystemReset();
|
||||
Ddl_Delay1ms(100);
|
||||
/*参照hc32l170_app: 由Update解析载荷并填boot参数, 复位进入Boot*/
|
||||
Update((uint8_t *)pReq);
|
||||
}
|
||||
|
||||
static int update_cmd_process(uint8_t cmd, void* frame, int len, void* pload, int size)
|
||||
static int update_cmd_process(GateWayPara GateWay, uint8_t cmd, void* frame, int len, void* pload, int size)
|
||||
{
|
||||
int res = -1;
|
||||
|
||||
switch (cmd) {
|
||||
case 0x81: {
|
||||
update_on_start(frame, len, pload, size);
|
||||
update_on_start(GateWay, frame, len, pload, size);
|
||||
|
||||
res = 0;
|
||||
}
|
||||
@@ -151,25 +140,25 @@ static int update_cmd_process(uint8_t cmd, void* frame, int len, void* pload, in
|
||||
return res;
|
||||
}
|
||||
|
||||
static int update_process(void* frame, int len)
|
||||
static int update_process(GateWayPara GateWay, void* frame, int len)
|
||||
{
|
||||
uint8_t cmd = 0;
|
||||
|
||||
uint8_t slave_addr = 0;
|
||||
uint8_t slave_addr[6] = {0};
|
||||
|
||||
uint8_t user_data[256] = {0};
|
||||
|
||||
int user_data_len = 0;
|
||||
|
||||
int res = update_unpack(frame, len, &cmd, &slave_addr, user_data, &user_data_len);
|
||||
int res = update_unpack(frame, len, &cmd, slave_addr, user_data, &user_data_len);
|
||||
|
||||
if (res != 0)
|
||||
return -1;
|
||||
|
||||
if (slave_addr != 0x01)
|
||||
if (memcmp(slave_addr, GateWay->ConfigPara.GwMac, 6) != 0)
|
||||
return -2;
|
||||
|
||||
res = update_cmd_process(cmd, frame, len, user_data, user_data_len);
|
||||
res = update_cmd_process(GateWay, cmd, frame, len, user_data, user_data_len);
|
||||
|
||||
if (res != 0)
|
||||
return -3;
|
||||
@@ -179,10 +168,10 @@ static int update_process(void* frame, int len)
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: RS485SensorCmdSend
|
||||
* 功能描述: 下发传感器指令函数
|
||||
* 参 数: Para,通讯参数入口
|
||||
* 返 回 值: 无
|
||||
* 函数名称: RS485SensorCmdSend
|
||||
* 功能描述: 下发传感器指令函数
|
||||
* 参 数: Para,通讯参数入口
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
static void RS485SensorCmdSend(GateWayPara GateWay, SensorCommPara SensorComm)
|
||||
{
|
||||
@@ -205,7 +194,7 @@ static void RS485SensorCmdSend(GateWayPara GateWay, SensorCommPara SensorComm)
|
||||
memcpy(&sData[sLen], SensorComm->CmdPara, SensorComm->CmdParaLen);
|
||||
sLen += SensorComm->CmdParaLen;
|
||||
}
|
||||
uint16_t Check = CRC_Modbus(0xA001, sData, sLen);
|
||||
uint16_t Check = CRC_Modbus(CRC16_BASE, sData, sLen);
|
||||
|
||||
sData[sLen++] = Check & 0xff;
|
||||
sData[sLen++] = (Check >> 0x08) & 0x00ff;
|
||||
@@ -217,17 +206,17 @@ static void RS485SensorCmdSend(GateWayPara GateWay, SensorCommPara SensorComm)
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: RS485SensorCmdSend
|
||||
* 功能描述: 下发传感器指令函数
|
||||
* 参 数: CommUintAddr, 通讯单元地址
|
||||
Para,通讯参数入口
|
||||
* 返 回 值: 无
|
||||
* 函数名称: RS485SensorCmdSend
|
||||
* 功能描述: 下发传感器指令函数
|
||||
* 参 数: CommUintAddr, 通讯单元地址
|
||||
Para,通讯参数入口
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
void RS485CmdSend(GateWayPara GateWay, uint8_t CommUintAddr, SensorCommPara SensorComm)
|
||||
{
|
||||
SensorCommPara SC;
|
||||
|
||||
if(CommUintAddr)
|
||||
if(CommUintAddr == 1)
|
||||
SC = &SComm1Para;
|
||||
else
|
||||
SC = &SComm2Para;
|
||||
@@ -243,12 +232,12 @@ void RS485CmdSend(GateWayPara GateWay, uint8_t CommUintAddr, SensorCommPara Sens
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: RS485LoopHandler
|
||||
* 功能描述: RS485循环处理函数
|
||||
* 参 数: GateWay, 网关参数句柄
|
||||
RS485Ch, RS485通道句柄
|
||||
SCPara, RS485通讯句柄
|
||||
* 返 回 值: 无
|
||||
* 函数名称: RS485LoopHandler
|
||||
* 功能描述: RS485循环处理函数
|
||||
* 参 数: GateWay, 网关参数句柄
|
||||
RS485Ch, RS485通道句柄
|
||||
SCPara, RS485通讯句柄
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
static uint8_t CommUintData[512];
|
||||
int test = 0;
|
||||
@@ -266,8 +255,8 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
|
||||
return;
|
||||
}
|
||||
|
||||
if(RS485Ch->CommUnitEnable == true) { //使用内置通讯单元
|
||||
if(RS485Ch->QuerySensorFlag == true) { //开机查找传感器
|
||||
if(RS485Ch->CommUnitEnable == true) { //使用内置通讯单元
|
||||
if(RS485Ch->QuerySensorFlag == true) { //开机查找传感器
|
||||
if(SCPara->SensorCnt < SENSOR_NUM_MAX) {
|
||||
rt_thread_delay(50);
|
||||
SCPara->Cmd = RS485_SENSOR_CMD_QUERY;
|
||||
@@ -302,7 +291,7 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
|
||||
RS485Ch->CUPara.Para.BatLevel = GateWay->Battery;
|
||||
CommUintLen = CommUintOrgData(GateWay, &RS485Ch->CUPara.Para, &SCPara->SensorData, CommUintData);
|
||||
//AddLog(&CommUintData[2], CommUintLen - 2);
|
||||
CatOneEthSendQueue(CommUintData, CommUintLen);
|
||||
UploadSend(CommUintData, CommUintLen);
|
||||
if(RS485Ch == &GateWay->ConfigPara.Rs485Ch1) {
|
||||
MAIN_DBG_LOG("InCommUint1 Send Meg...\r\n");
|
||||
}
|
||||
@@ -328,7 +317,7 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
|
||||
}
|
||||
}
|
||||
}
|
||||
else { //读取外置通讯单元
|
||||
else { //读取外置通讯单元
|
||||
if(SCPara->RS485CommUnitReadTimeDelay >= (GateWay->ConfigPara.CommUnitReadInterval * 5) && SCPara->SendFlag == false) {
|
||||
if(SCPara->SendUnitCommIdx < COMMUNIT_NUM_MAX) {
|
||||
if(GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].RegFlag &&
|
||||
@@ -361,14 +350,13 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
|
||||
|
||||
result = rt_sem_take(SCPara->RS485Rev_Sem, 200);
|
||||
if(result == RT_EOK) {
|
||||
memcpy(RxBuffTemp, SCPara->RS485RxBuff, SCPara->RS485RxLen);
|
||||
RxLenTemp = SCPara->RS485RxLen;
|
||||
// memset(SCPara->RS485RxBuff, 0x00, RS485_RX_BUFF_LEN_MAX);
|
||||
SCPara->RS485RxLen = 0;
|
||||
if(RxBuffTemp[0] == 0x7A && RS485Ch->UpgradeEnable == true) { //升级
|
||||
update_process(RxBuffTemp,RxLenTemp);
|
||||
memcpy(RxBuffTemp, SCPara->RS485RxBuff, RxLenTemp);
|
||||
if(RxBuffTemp[0] == 0x7D && RS485Ch->UpgradeEnable == true) { //升级
|
||||
update_process(GateWay, RxBuffTemp,RxLenTemp);
|
||||
}
|
||||
else if(RxBuffTemp[0] == 0x7A && RS485Ch->CommUnitEnable == true) { //内置通讯单元数据解析
|
||||
else if(RxBuffTemp[0] == 0x7A && RS485Ch->CommUnitEnable == true) { //内置通讯单元数据解析
|
||||
if(SCPara->SendFlag == false) {
|
||||
SCPara->RS485RxLen = 0;
|
||||
return;
|
||||
@@ -376,12 +364,12 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
|
||||
RS485Analyze(GateWay, SCPara, &RS485Ch->CUData, RxBuffTemp, RxLenTemp);
|
||||
//rt_mutex_release(GateWay->UartRevMutex);
|
||||
}
|
||||
else if(RxBuffTemp[0] == 0x7B && RS485Ch->CommUnitEnable == false){ //读取外部通讯单元数据解析
|
||||
else if(RxBuffTemp[0] == 0x7B && RS485Ch->CommUnitEnable == false){ //读取外部通讯单元数据解析
|
||||
if(SCPara == &SComm1Para)
|
||||
ret = GateWay->CommUnitRevCallBack(GateWay, RxBuffTemp, RxLenTemp, GateWay->ConfigPara.Rs485Ch1.RS485Send);
|
||||
else
|
||||
ret = GateWay->CommUnitRevCallBack(GateWay, RxBuffTemp, RxLenTemp, GateWay->ConfigPara.Rs485Ch2.RS485Send);
|
||||
if(ret == 0xff) { //注册信息
|
||||
if(ret == 0xff) { //注册信息
|
||||
SCPara->RS485RxLen = 0;
|
||||
return;
|
||||
}
|
||||
@@ -393,7 +381,7 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
|
||||
return;
|
||||
}
|
||||
}
|
||||
else { //调试命令解析
|
||||
else { //调试命令解析
|
||||
DebugAnalyze(GateWay, RxBuffTemp, RxLenTemp);
|
||||
}
|
||||
SCPara->RS485RxLen = 0;
|
||||
@@ -422,10 +410,11 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
|
||||
if(GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].CommStatus) {
|
||||
GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].CommStatus = 0;
|
||||
MegData[0] = 7;
|
||||
MegData[1] = COMM_UNIT_CMD_READ;
|
||||
memcpy(&MegData[2], GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].Mac[0], 6);
|
||||
MegData[8] = GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].CommStatus;
|
||||
CatOneEthSendQueue(MegData, 9); //发送离线消息
|
||||
MegData[1] = 0;
|
||||
MegData[2] = COMM_UNIT_CMD_READ;
|
||||
memcpy(&MegData[3], GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].Mac[0], 6);
|
||||
MegData[9] = GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].CommStatus;
|
||||
UploadSend(MegData, 10); //发送离线消息
|
||||
}
|
||||
}
|
||||
SCPara->SendUnitCommIdx++;
|
||||
@@ -435,10 +424,10 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: RS485Ch1_Thread_Entry
|
||||
* 功能描述: RS485通道1任务函数
|
||||
* 参 数: 任务参数入口
|
||||
* 返 回 值: 无
|
||||
* 函数名称: RS485Ch1_Thread_Entry
|
||||
* 功能描述: RS485通道1任务函数
|
||||
* 参 数: 任务参数入口
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
void RS485Ch1_Thread_Entry(void *parameter)
|
||||
{
|
||||
@@ -468,24 +457,37 @@ void RS485Ch1_Thread_Entry(void *parameter)
|
||||
if(SCPara->RS485Rev_Sem == RT_NULL) {
|
||||
Debug_Printf("RS485Ch1Rev Sem Create Failed!\r\n");
|
||||
}
|
||||
Debug_Printf("RS485Ch1Rev Thread is running!\r\n");
|
||||
Debug_Printf("RS485Ch1Rev Thread is running!\r\n");
|
||||
|
||||
rt_thread_delay(3000);
|
||||
SCPara->InitOverFlag = true;
|
||||
|
||||
|
||||
update_init(RS485Ch1UartSend);
|
||||
update_set_devmac(GateWay->ConfigPara.GwMac);
|
||||
while(1) {
|
||||
if(!ChannelIsActive(GateWay->ConfigPara, CH_RS485_1)
|
||||
&& !GateWay->ConfigPara.Rs485Ch1.UpgradeEnable) {
|
||||
rt_thread_delay(100);
|
||||
continue;
|
||||
}
|
||||
{
|
||||
uint8_t sData[512];
|
||||
if(rt_mq_recv(ChannelMQ(*GateWay, CH_RS485_1), sData, 512, 0) == RT_EOK) {
|
||||
uint16_t len = (sData[0] | (sData[1] << 8)) + 3;
|
||||
RS485Ch1UartSend(sData, len);
|
||||
}
|
||||
}
|
||||
RS485LoopHandler(GateWay, RS485Ch, SCPara);
|
||||
//rt_thread_delay(10);
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: RS485Ch1RxIrqCallback
|
||||
* 功能描述: RS485通道1中断处理回调函数
|
||||
* 参 数: rData 接收到的数据
|
||||
* 返 回 值: 无
|
||||
* 函数名称: RS485Ch1RxIrqCallback
|
||||
* 功能描述: RS485通道1中断处理回调函数
|
||||
* 参 数: rData 接收到的数据
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
void RS485Ch1RxIrqCallback(uint8_t rData)
|
||||
{
|
||||
@@ -499,10 +501,10 @@ void RS485Ch1RxIrqCallback(uint8_t rData)
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: RS485Ch2_Thread_Entry
|
||||
* 功能描述: RS485通道1任务函数
|
||||
* 参 数: 任务参数入口
|
||||
* 返 回 值: 无
|
||||
* 函数名称: RS485Ch2_Thread_Entry
|
||||
* 功能描述: RS485通道1任务函数
|
||||
* 参 数: 任务参数入口
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
void RS485Ch2_Thread_Entry(void *parameter)
|
||||
{
|
||||
@@ -532,20 +534,32 @@ void RS485Ch2_Thread_Entry(void *parameter)
|
||||
if(SCPara->RS485Rev_Sem == RT_NULL) {
|
||||
Debug_Printf("RS485Ch2Rev Sem Create Failed!\r\n");
|
||||
}
|
||||
Debug_Printf("RS485Ch2Rev Thread is running!\r\n");
|
||||
Debug_Printf("RS485Ch2Rev Thread is running!\r\n");
|
||||
rt_thread_delay(3000);
|
||||
SCPara->InitOverFlag = true;
|
||||
while(1) {
|
||||
if(!ChannelIsActive(GateWay->ConfigPara, CH_RS485_2)
|
||||
&& !GateWay->ConfigPara.Rs485Ch2.UpgradeEnable) {
|
||||
rt_thread_delay(100);
|
||||
continue;
|
||||
}
|
||||
{
|
||||
uint8_t sData[512];
|
||||
if(rt_mq_recv(ChannelMQ(*GateWay, CH_RS485_2), sData, 512, 0) == RT_EOK) {
|
||||
uint16_t len = (sData[0] | (sData[1] << 8)) + 3;
|
||||
RS485Ch2UartSend(sData, len);
|
||||
}
|
||||
}
|
||||
RS485LoopHandler(GateWay, RS485Ch, SCPara);
|
||||
//rt_thread_delay(10);
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: RS485Ch2RxIrqCallback
|
||||
* 功能描述: RS485通道1中断处理回调函数
|
||||
* 参 数: rData 接收到的数据
|
||||
* 返 回 值: 无
|
||||
* 函数名称: RS485Ch2RxIrqCallback
|
||||
* 功能描述: RS485通道1中断处理回调函数
|
||||
* 参 数: rData 接收到的数据
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
void RS485Ch2RxIrqCallback(uint8_t rData)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
#include "Update.h"
|
||||
#include "DebugCmd.h"
|
||||
#include "main.h"
|
||||
#include "bsp.h"
|
||||
#include "spiflash.h"
|
||||
|
||||
extern GateWayPara_t GateWay;
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: Update
|
||||
* 功能描述: 固件升级,此函数在解析到升级指令时调用
|
||||
* 参 数: PayLoad 协议负载,需去除帧头等信息,只传负载数据
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
void Update(uint8_t *PayLoad)
|
||||
{
|
||||
UpDataRequset_t Req;
|
||||
boot_para_t cfg = {0};
|
||||
|
||||
memcpy(&Req, PayLoad, sizeof(UpDataRequset_t));
|
||||
|
||||
/*读回现有boot参数,保留FirstRunFlag等字段*/
|
||||
dev_boot_read_param(&cfg);
|
||||
cfg.AppSize = Req.AppSize;
|
||||
cfg.Crc32Check = Req.AppCrc32;
|
||||
cfg.PackageCnt = Req.PackageNum;
|
||||
cfg.AppFlag = 0;
|
||||
cfg.UpdateFlag = APP_UPDATE_FLAG;
|
||||
memcpy(cfg.GwMac, GateWay.ConfigPara.GwMac, 6);
|
||||
|
||||
U_DBG_LOG("Receive upgrade command:\r\n");
|
||||
U_DBG_LOG("PackageNum: %d\r\n", cfg.PackageCnt);
|
||||
U_DBG_LOG("AppSize: %d\r\n", cfg.AppSize);
|
||||
U_DBG_LOG("AppCrc32: 0x%08x\r\n", cfg.Crc32Check);
|
||||
U_DBG_LOG("System Reset!\r\n");
|
||||
|
||||
SAVE_BOOT_PARA(&cfg);
|
||||
U_DELAY_MS(200);
|
||||
U_SYSTEM_TESET();
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: UpdateInit
|
||||
* 功能描述: 升级参数初始化,需要在程序启动,外设初始化完后调用
|
||||
* 参 数: 无
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
void UpdateInit(void)
|
||||
{
|
||||
boot_para_t cfg;
|
||||
|
||||
READ_BOOT_PARA(&cfg);
|
||||
/*参照hc32l170_app: 仅确保AppFlag=APP_START_FLAG, 使Boot下次直接跳转App
|
||||
(网关MAC/服务器/Lora配置从BootPara_t获取, 由Boot配置)*/
|
||||
if(cfg.AppFlag != APP_START_FLAG) {
|
||||
cfg.AppFlag = APP_START_FLAG;
|
||||
SAVE_BOOT_PARA(&cfg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,420 +0,0 @@
|
||||
/*
|
||||
数据通信任务
|
||||
*/
|
||||
#include "bsp.h"
|
||||
|
||||
#include "ringbuffer.h"
|
||||
#include "protocol.h"
|
||||
#include "update_protocol.h"
|
||||
|
||||
#include "app_comm.h"
|
||||
#include "app_tp_collect.h"
|
||||
#include "app_ad_collect.h"
|
||||
|
||||
#define USING_SIMULATOR ( 0 )
|
||||
|
||||
#define COMM_RECV_OUTTIME (20)
|
||||
|
||||
static struct {
|
||||
ring_buf_t rb;
|
||||
uint8_t rb_pool[128];
|
||||
} g_comm;
|
||||
|
||||
static struct {
|
||||
uint8_t rxbuf[256];
|
||||
int rxbytes;
|
||||
} g_frame;
|
||||
|
||||
static void rs485_rx_cb(uint8_t data)
|
||||
{
|
||||
ring_buf_put(&g_comm.rb, &data, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
返回值:成功:len,失败: 0
|
||||
***/
|
||||
static int recive_frame(void)
|
||||
{
|
||||
uint8_t data = 0;
|
||||
|
||||
int len = ring_buf_len(&g_comm.rb);
|
||||
|
||||
if (len == 0)
|
||||
return 0;
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
|
||||
if (g_frame.rxbytes < sizeof(g_frame.rxbuf)) {
|
||||
|
||||
int byte = ring_buf_get(&g_comm.rb, &data, 1);
|
||||
|
||||
if (byte > 0) {
|
||||
|
||||
g_frame.rxbuf[ g_frame.rxbytes] = data;
|
||||
|
||||
g_frame.rxbytes++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static void update_on_start(uint8_t* frame, int len, uint8_t* pload, int size)
|
||||
{
|
||||
update_protocol_req_t* pReq = (void*)&frame[sizeof(update_protocol_hd_t)];
|
||||
|
||||
boot_para_t cfg = {0};
|
||||
|
||||
cfg.AppFlag = 0;
|
||||
cfg.UpdateFlag = APP_UPDATE_FLAG;
|
||||
cfg.Crc32Check = pReq->AppCrc32;
|
||||
cfg.PackageNum = pReq->PackageNum;
|
||||
cfg.AppSize = pReq->AppSize;
|
||||
|
||||
dev_boot_write_param(cfg);
|
||||
|
||||
update_send_cmd(0x01, 1, pReq->PackageNum);
|
||||
|
||||
//重启进入BOOT
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
static int update_cmd_process(uint8_t cmd, void* frame, int len, void* pload, int size)
|
||||
{
|
||||
int res = -1;
|
||||
|
||||
switch (cmd) {
|
||||
case 0x81: {
|
||||
update_on_start(frame, len, pload, size);
|
||||
|
||||
res = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int update_process(void* frame, int len)
|
||||
{
|
||||
uint8_t cmd = 0;
|
||||
|
||||
uint8_t slave_addr = 0;
|
||||
|
||||
uint8_t user_data[256] = {0};
|
||||
|
||||
int user_data_len = 0;
|
||||
|
||||
int res = update_unpack(frame, len, &cmd, &slave_addr, user_data, &user_data_len);
|
||||
|
||||
if (res != 0)
|
||||
return -1;
|
||||
|
||||
if (slave_addr != 0x01)
|
||||
return -2;
|
||||
|
||||
res = update_cmd_process(cmd, frame, len, user_data, user_data_len);
|
||||
|
||||
if (res != 0)
|
||||
return -3;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void comm_rsp(uint8_t slave_addr,uint8_t frame_cmd,void *pay, int len)
|
||||
{
|
||||
uint8_t frame_ack[128] = {0};
|
||||
|
||||
uint16_t frame_ack_len = 0;
|
||||
|
||||
protocol_pack_frame(slave_addr, frame_cmd - 0x80, pay, len, frame_ack, sizeof(frame_ack), &frame_ack_len);
|
||||
|
||||
dev_rs485_send(frame_ack, frame_ack_len);
|
||||
}
|
||||
|
||||
static void comm_process(uint8_t* frame, int len)
|
||||
{
|
||||
uint16_t slave_addr = 0;
|
||||
uint8_t frame_cmd = 0;
|
||||
uint8_t frame_data[64] = {0};
|
||||
uint16_t frame_data_len = 0;
|
||||
|
||||
/***数据解码***/
|
||||
int err = -1;
|
||||
|
||||
err= protocol_unpack_frame(frame, len, &slave_addr, &frame_cmd, frame_data, &frame_data_len);
|
||||
|
||||
if (err != PROTOCOL_SUCCESS)
|
||||
return ;
|
||||
|
||||
//TODO:获取本机地址
|
||||
uint8_t local_addr = 0;
|
||||
dev_cfg_get_devid(&local_addr);
|
||||
|
||||
|
||||
uint8_t rsp_data[64] = {0};
|
||||
void* payload = rsp_data;
|
||||
uint16_t payload_len = 0;
|
||||
|
||||
uint8_t is_match =1;
|
||||
|
||||
switch (frame_cmd) {
|
||||
|
||||
case PROTOCOL_CMD_SET_ID: {
|
||||
|
||||
//
|
||||
if (slave_addr != local_addr)
|
||||
return ;
|
||||
|
||||
id_data_t data = {0};
|
||||
|
||||
memcpy(&data, &frame_data, sizeof(data));
|
||||
|
||||
dev_cfg_set_devid(data.id);
|
||||
|
||||
BSP_LOG("set: device id =[%d] =[0x%x] \n", data.id,data.id);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROTOCOL_CMD_GET_ID:{
|
||||
|
||||
id_data_t id_data = {0};
|
||||
|
||||
id_data.id = local_addr;
|
||||
|
||||
payload_len = sizeof(id_data);
|
||||
|
||||
memcpy(payload ,&id_data,payload_len);
|
||||
|
||||
BSP_LOG("get: device id =[%d] =[0x%x] \n", id_data.id,id_data.id);
|
||||
|
||||
}break;
|
||||
|
||||
|
||||
case PROTOCOL_CMD_GET_TP: {
|
||||
//TODO: get tp datas
|
||||
if (slave_addr != local_addr)
|
||||
return ;
|
||||
|
||||
tp_datas_t tp_data = {0};
|
||||
|
||||
collect_tp_info_t tp_info={0};
|
||||
|
||||
app_collect_tp_get(&tp_info);
|
||||
|
||||
memcpy( &tp_data,&tp_info.tp_datas,sizeof(tp_data));
|
||||
|
||||
//兼容旧协议,没有用到的通道,填充无效数据
|
||||
for(int i=0; i <8-TP_SENSOR_NUM; i++){
|
||||
|
||||
tp_data.channels[i+TP_SENSOR_NUM].status =1;
|
||||
tp_data.channels[i+TP_SENSOR_NUM].value =0;
|
||||
}
|
||||
|
||||
for (int i = 0; i < TP_SENSOR_NUM ; i++) {
|
||||
|
||||
char strbuf[128]={0};
|
||||
|
||||
snprintf(strbuf,sizeof(strbuf)," comm ad ch[%d] %08.4f \r\n", i, tp_data.channels[i].value);
|
||||
|
||||
BSP_LOG("%s",strbuf);
|
||||
}
|
||||
|
||||
BSP_LOG("\r\n");
|
||||
|
||||
payload_len = sizeof(tp_data);
|
||||
|
||||
memcpy(payload, &tp_data, payload_len);
|
||||
|
||||
}break;
|
||||
|
||||
case PROTOCOL_CMD_GET_AD: {
|
||||
|
||||
//
|
||||
if (slave_addr != local_addr)
|
||||
return ;
|
||||
|
||||
//TODO: get ad datas
|
||||
ad_datas_t ad_data = {0};
|
||||
|
||||
app_collect_ad_get(&ad_data);
|
||||
|
||||
//兼容旧协议,没有用到的通道,填充无效数据
|
||||
for(int i=0; i <8-YB_SENSOR_NUM; i++){
|
||||
|
||||
ad_data.channels[i+5].status =1;
|
||||
}
|
||||
|
||||
BSP_LOG("\r\n");
|
||||
|
||||
for (int i = 0; i < YB_SENSOR_NUM ; i++) {
|
||||
|
||||
char strbuf[128] = {0};
|
||||
|
||||
snprintf(strbuf, sizeof(strbuf), " comm ad ch[%d] %08.4f \r\n", i, ad_data.channels[i].value);
|
||||
|
||||
BSP_LOG("%s", strbuf);
|
||||
}
|
||||
|
||||
BSP_LOG("\r\n");
|
||||
|
||||
payload_len = sizeof(ad_data);
|
||||
|
||||
memcpy(payload, &ad_data, payload_len);
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case PROTOCOL_CMD_SET_TP_OFFSET:{
|
||||
|
||||
if (slave_addr != local_addr)
|
||||
return ;
|
||||
|
||||
offset_set_data_t offset_data={0};
|
||||
|
||||
memcpy( &offset_data,frame_data,sizeof(offset_data));
|
||||
|
||||
dev_cfg_set_temp_offset(offset_data.id, offset_data.prams.value);
|
||||
|
||||
char strbuf[128]={0};
|
||||
|
||||
snprintf(strbuf,sizeof(strbuf)," set[%d] offset %.2f \r\n", offset_data.id , offset_data.prams.value);
|
||||
|
||||
BSP_LOG("%s",strbuf);
|
||||
|
||||
}break;
|
||||
|
||||
|
||||
case PROTOCOL_CMD_GET_TP_OFFSET:{
|
||||
|
||||
//
|
||||
if (slave_addr != local_addr)
|
||||
return ;
|
||||
|
||||
offset_get_param_t *param = (void *)frame_data;
|
||||
|
||||
offset_get_data_t offset_data={0};
|
||||
|
||||
float val = 200;
|
||||
|
||||
dev_cfg_get_temp_offset( param->id,&val);
|
||||
|
||||
offset_data.id = param->id;
|
||||
|
||||
offset_data.prams.value = val;
|
||||
|
||||
payload_len = sizeof(offset_data);
|
||||
|
||||
memcpy(payload,&offset_data,payload_len);
|
||||
|
||||
char strbuf[128]={0};
|
||||
|
||||
snprintf(strbuf,sizeof(strbuf)," get[%d] offset %.2f \r\n", offset_data.id , offset_data.prams.value);
|
||||
|
||||
BSP_LOG("%s",strbuf);
|
||||
|
||||
|
||||
}break;
|
||||
|
||||
case PROTOCOL_CMD_RESET_CHANNEL: {
|
||||
//
|
||||
if (slave_addr != local_addr)
|
||||
return ;
|
||||
|
||||
app_collect_ad_reset_offset();
|
||||
|
||||
BSP_LOG("reset offset start");
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
is_match =0;
|
||||
break;
|
||||
}
|
||||
|
||||
if(is_match ==0)
|
||||
return;
|
||||
|
||||
comm_rsp(slave_addr,frame_cmd, payload, payload_len);
|
||||
}
|
||||
|
||||
|
||||
void app_comm_entry(void *param)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
dev_rs485_init();
|
||||
|
||||
dev_rs485_rx_register(rs485_rx_cb);
|
||||
|
||||
ring_buf_init(&g_comm.rb, g_comm.rb_pool, sizeof(g_comm.rb_pool));
|
||||
|
||||
/***/
|
||||
update_init(dev_rs485_send);
|
||||
|
||||
while (1) {
|
||||
|
||||
rt_thread_mdelay(1);
|
||||
|
||||
len = recive_frame();
|
||||
|
||||
if (len == 0) {
|
||||
|
||||
rt_thread_mdelay(5);
|
||||
|
||||
len = recive_frame();
|
||||
|
||||
if (len == 0) {
|
||||
|
||||
if (g_frame.rxbytes > 0) {
|
||||
|
||||
update_process(g_frame.rxbuf, g_frame.rxbytes);
|
||||
|
||||
comm_process(g_frame.rxbuf, g_frame.rxbytes);
|
||||
|
||||
g_frame.rxbytes = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ALIGN(RT_ALIGN_SIZE)
|
||||
static uint8_t comm_thd_stack[4096];
|
||||
static struct rt_thread comm_thd;
|
||||
|
||||
int app_comm_init(void)
|
||||
{
|
||||
|
||||
#if USING_SIMULATOR
|
||||
BSP_LOG("comm data using simulator \n");
|
||||
#endif
|
||||
|
||||
int ret = rt_thread_init(&comm_thd,
|
||||
"app_comm",
|
||||
app_comm_entry,
|
||||
RT_NULL,
|
||||
comm_thd_stack,
|
||||
sizeof(comm_thd_stack),
|
||||
10,
|
||||
20
|
||||
);
|
||||
|
||||
|
||||
if(ret == RT_EOK){
|
||||
|
||||
rt_thread_startup(&comm_thd);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
INIT_APP_EXPORT(app_comm_init);
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,15 +1,14 @@
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include "main.h"
|
||||
#include "CatOneTask.h"
|
||||
#include "EthTask.h"
|
||||
#include "LoraTask.h"
|
||||
#include "CatOneTask.h"
|
||||
#include "RS485Task.h"
|
||||
#include "DebugCmd.h"
|
||||
#include "Update.h"
|
||||
#include "spiflash.h"
|
||||
|
||||
|
||||
//雅下: 81-00-00-06-00-01
|
||||
//雅下: 81-00-00-06-00-01
|
||||
// 81-00-00-06-00-02
|
||||
// 81-00-00-06-00-03
|
||||
// 81-00-00-06-00-04
|
||||
@@ -20,21 +19,12 @@
|
||||
// 81-00-00-06-00-09
|
||||
// 81-00-00-06-00-0A
|
||||
|
||||
static const uint8_t GateWayMac_Test[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x00};
|
||||
static const uint8_t GateWayMac_BL1[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x01};
|
||||
static const uint8_t GateWayMac_BL2[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x02};
|
||||
static const uint8_t GateWayMac_BL3[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x03};
|
||||
static const uint8_t GateWayMac_BL4[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x04};
|
||||
static const uint8_t GateWayMac_BL5[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x05};
|
||||
static const uint8_t GateWayMac_BL6[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x06};
|
||||
static const uint8_t GateWayMac_BL7[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x07};
|
||||
static const uint8_t GateWayMac_BL8[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x08};
|
||||
static const uint8_t GateWayMac_BL9[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x09};
|
||||
static const uint8_t GateWayMac_BL10[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x0A};
|
||||
//网关MAC编码由Boot程序固定在0x4000(协议规定: VerInfo(1)+PrjNum(3)+GwNum(2))
|
||||
bool MainDispEn = true;
|
||||
|
||||
static rt_thread_t Lora_Thread = RT_NULL;
|
||||
static rt_thread_t Cat1Eth_Thread = RT_NULL;
|
||||
static rt_thread_t Cat1_Thread = RT_NULL;
|
||||
static rt_thread_t Eth_Thread = RT_NULL;
|
||||
static rt_thread_t RS485Ch1_Thread = RT_NULL;
|
||||
static rt_thread_t RS485Ch2_Thread = RT_NULL;
|
||||
static rt_thread_t Debug_Thread = RT_NULL;
|
||||
@@ -60,10 +50,10 @@ int toPercentage(int voltage)
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: MainDBGOnOff
|
||||
* 功能描述: 主调试信息开关函数
|
||||
* 参 数: OnOff,开关
|
||||
* 返 回 值: 无
|
||||
* 函数名称: MainDBGOnOff
|
||||
* 功能描述: 主调试信息开关函数
|
||||
* 参 数: OnOff,开关
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
void MainDBGOnOff(bool OnOff)
|
||||
{
|
||||
@@ -74,53 +64,6 @@ void MainDBGOnOff(bool OnOff)
|
||||
Debug_Printf("\r\nMain Display Disable!\r\n\r\n");
|
||||
}
|
||||
|
||||
#if 0
|
||||
uint32_t SDStartBlock;
|
||||
uint8_t TestData[10 * 512];
|
||||
uint8_t ADBuff[10 * 512];
|
||||
|
||||
void SDCardTest(void)
|
||||
{
|
||||
SDStartBlock = 0;
|
||||
SDCardReadBlocks(SDStartBlock, 10, TestData);
|
||||
if(TestData[0] != 0xAA) {
|
||||
SDCardErase(SDStartBlock, 10);
|
||||
memset(ADBuff, 0xAA, 10 * 512);
|
||||
SDCardWriteBlocks(SDStartBlock, 10, (uint8_t *)&ADBuff);
|
||||
}
|
||||
SDCardReadBlocks(SDStartBlock, 10, TestData);
|
||||
}
|
||||
#endif
|
||||
|
||||
void InfTest(void)
|
||||
{
|
||||
uint8_t sData[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A};
|
||||
RS485_CH1_RX();
|
||||
RS485_CH1_POW_ON();
|
||||
rt_thread_delay(100);
|
||||
RS485_CH1_POW_OFF();
|
||||
|
||||
RS485_CH2_POW_ON();
|
||||
rt_thread_delay(100);
|
||||
RS485_CH2_POW_OFF();
|
||||
|
||||
POWER_LED_OFF();
|
||||
POWER_LED_ON();
|
||||
LORA_RX_LED_SET();
|
||||
LORA_RX_LED_CLR();
|
||||
RS485_CH1_TX();
|
||||
RS485_CH2_RX();
|
||||
RS485Ch1_Config(500000);
|
||||
RS485Ch2_Config(500000);
|
||||
RS485Ch1UartSend(sData, 10);
|
||||
rt_thread_delay(100);
|
||||
|
||||
RS485_CH2_TX();
|
||||
RS485_CH1_RX();
|
||||
RS485Ch2UartSend(sData, 10);
|
||||
rt_thread_delay(100);
|
||||
// SDCardTest();
|
||||
}
|
||||
|
||||
void GateWayInit(void)
|
||||
{
|
||||
@@ -129,47 +72,58 @@ void GateWayInit(void)
|
||||
Debug_Printf("FlashID: %08x\r\n", FlashID);
|
||||
|
||||
memset((uint8_t *)&GateWay.ConfigPara, 0x00, sizeof(GWConfigPara_t));
|
||||
boot_para_t bootParam;
|
||||
dev_boot_read_param(&bootParam);
|
||||
rt_kprintf("AppFlag: 0x%08x\r\n", bootParam.AppFlag);
|
||||
/*升级完成后Boot置AppFlag=APP_BOOT_UPGRADE_FLAG(每次升级均置位,不限首次)。
|
||||
App启动时据此擦除参数分区(仅扇区0~1,非全片擦除)并恢复APP_START_FLAG;
|
||||
随后ReadPara读到0xFF→SavFlag无效→自动加载默认参数,传感器重新注册。
|
||||
须在下方升级异常检测之前处理,避免AppFlag!=APP_START_FLAG误触发全片擦除*/
|
||||
if(bootParam.AppFlag == APP_BOOT_UPGRADE_FLAG) {
|
||||
rt_kprintf("Upgrade done, erasing parameter partition...\r\n");
|
||||
for(uint32_t Sector = GATEWEY_PARA_SAV_SECTOR; Sector < LOG_INFO_START_SECTOR; Sector++) {
|
||||
SpiFlashEraseSector(Sector * SPIFLASH_SECTORSIZE);
|
||||
}
|
||||
bootParam.AppFlag = APP_START_FLAG;
|
||||
dev_boot_write_param(bootParam);
|
||||
}
|
||||
/*检测升级异常(UpdateFlag仍为APP_UPDATE_FLAG 或 非首次且AppFlag无效)时擦外置Flash*/
|
||||
if(bootParam.UpdateFlag == APP_UPDATE_FLAG
|
||||
|| (bootParam.FirstRunFlag == 0 && bootParam.AppFlag != APP_START_FLAG)) {
|
||||
rt_kprintf("Boot upgrade detected, erasing external Flash...\r\n");
|
||||
SpiFlashEraseChip();
|
||||
bootParam.UpdateFlag = 0;
|
||||
dev_boot_write_param(bootParam);
|
||||
}
|
||||
|
||||
bool NeedSavePara = false;
|
||||
int ret = ReadPara((uint8_t *)&GateWay.ConfigPara, sizeof(GWConfigPara_t));
|
||||
if(GateWay.ConfigPara.SavFlag != LOG_SAV_FLAG) {
|
||||
/*ReadPara返回-1表示CRC校验失败(参数镜像损坏)。原实现只检查SavFlag:
|
||||
SavFlag位于结构体最前部,"部分损坏"的镜像(前部有效后部乱码)恰好保留合法
|
||||
SavFlag,坏数据会被整体装入RAM——正是culs显示后面设备参数乱码的根源。
|
||||
CRC失败必须回退默认参数,让传感器走重新注册流程*/
|
||||
if(ret != 0) {
|
||||
rt_kprintf("Para CRC Error, reset to default!\r\n");
|
||||
}
|
||||
if(ret != 0 || GateWay.ConfigPara.SavFlag != LOG_SAV_FLAG) {
|
||||
/*CRC正常但SavFlag无效:flash参数为空(全新设备/曾执行res gxjt/Boot整片擦除后),
|
||||
打印区分于CRC错误路径,便于现场排障判断走的是默认参数还是正常恢复*/
|
||||
if(ret == 0)
|
||||
rt_kprintf("Para empty, load default!\r\n");
|
||||
NeedSavePara = true;
|
||||
memset((uint8_t *)&GateWay.ConfigPara, 0x00, sizeof(GWConfigPara_t));
|
||||
GateWay.ConfigPara.SavFlag = LOG_SAV_FLAG;
|
||||
GateWay.ConfigPara.Comm = CATONE_COMM;
|
||||
#if MAC_ADDR_TYPE == 0//测试服务器
|
||||
GateWay.ConfigPara.LTENet.DestAddr[0] = 39;
|
||||
GateWay.ConfigPara.LTENet.DestAddr[1] = 106;
|
||||
GateWay.ConfigPara.LTENet.DestAddr[2] = 103;
|
||||
GateWay.ConfigPara.LTENet.DestAddr[3] = 147;
|
||||
GateWay.ConfigPara.LTENet.DestPort = 8080;
|
||||
#elif MAC_ADDR_TYPE > 0
|
||||
GateWay.ConfigPara.LTENet.DestAddr[0] = 103;
|
||||
GateWay.ConfigPara.LTENet.DestAddr[1] = 217;
|
||||
GateWay.ConfigPara.LTENet.DestAddr[2] = 192;
|
||||
GateWay.ConfigPara.LTENet.DestAddr[3] = 248;
|
||||
GateWay.ConfigPara.LTENet.DestPort = 12111;
|
||||
#endif
|
||||
|
||||
GateWay.ConfigPara.EthNet.IpMode = ETH_IP_STATIC;
|
||||
GateWay.ConfigPara.EthNet.IpAddr[0] = 192;
|
||||
GateWay.ConfigPara.EthNet.IpAddr[1] = 168;
|
||||
GateWay.ConfigPara.EthNet.IpAddr[2] = 1;
|
||||
GateWay.ConfigPara.EthNet.IpAddr[3] = 101;
|
||||
GateWay.ConfigPara.EthNet.IpPort = 10000;
|
||||
GateWay.ConfigPara.EthNet.WorkMode = ETH_MODE_TCP_CLIENT;
|
||||
GateWay.ConfigPara.EthNet.SubnetMask[0] = 255;
|
||||
GateWay.ConfigPara.EthNet.SubnetMask[1] = 255;
|
||||
GateWay.ConfigPara.EthNet.SubnetMask[2] = 255;
|
||||
GateWay.ConfigPara.EthNet.SubnetMask[3] = 0;
|
||||
GateWay.ConfigPara.EthNet.Gateway[0] = 192;
|
||||
GateWay.ConfigPara.EthNet.Gateway[1] = 168;
|
||||
GateWay.ConfigPara.EthNet.Gateway[2] = 1;
|
||||
GateWay.ConfigPara.EthNet.Gateway[3] = 1;
|
||||
GateWay.ConfigPara.EthNet.DestIp[0] = 192;
|
||||
GateWay.ConfigPara.EthNet.DestIp[1] = 168;
|
||||
GateWay.ConfigPara.EthNet.DestIp[2] = 1;
|
||||
GateWay.ConfigPara.EthNet.DestIp[3] = 100;
|
||||
GateWay.ConfigPara.EthNet.DestPort = 8080;
|
||||
|
||||
GateWay.ConfigPara.CommUnitReadInterval = COMMUNIT_READ_SENSOR_INTERVAL_MAX;//非低功耗设备
|
||||
/*通道/服务器等默认参数全部从Boot参数区(BootPara_t)获取, 由Boot直接配置*/
|
||||
GateWay.ConfigPara.Much = (Channel_m)bootParam.Much;
|
||||
GateWay.ConfigPara.Auch = (Channel_m)bootParam.Auch;
|
||||
GateWay.ConfigPara.Duch = (Channel_m)bootParam.Duch;
|
||||
GateWay.ConfigPara.CuchMask = bootParam.CuchMask;
|
||||
GateWay.ConfigPara.LTENet.DestAddr[0] = bootParam.SvrAddr[0];
|
||||
GateWay.ConfigPara.LTENet.DestAddr[1] = bootParam.SvrAddr[1];
|
||||
GateWay.ConfigPara.LTENet.DestAddr[2] = bootParam.SvrAddr[2];
|
||||
GateWay.ConfigPara.LTENet.DestAddr[3] = bootParam.SvrAddr[3];
|
||||
GateWay.ConfigPara.LTENet.DestPort = bootParam.SvrPort;
|
||||
GateWay.ConfigPara.CommUnitReadInterval = COMMUNIT_READ_SENSOR_INTERVAL_MAX;//非低功耗设备
|
||||
memset(GateWay.ConfigPara.CommUnitArray, 0x00, sizeof(CommUnitData_t) * COMMUNIT_NUM_MAX);
|
||||
GateWay.ConfigPara.Rs485Ch1.Enable = true;
|
||||
GateWay.ConfigPara.Rs485Ch1.CommUnitEnable = false;
|
||||
@@ -181,9 +135,7 @@ void GateWayInit(void)
|
||||
GateWay.ConfigPara.Rs485Ch2.UpgradeEnable = false;
|
||||
GateWay.ConfigPara.Rs485Ch2.CommUnitEnable = false;
|
||||
GateWay.ConfigPara.Rs485Ch2.Power = false;
|
||||
GateWay.ConfigPara.Rs485Ch1.RS485Send = RS485Ch1UartSend;
|
||||
GateWay.ConfigPara.Rs485Ch2.RS485Send = RS485Ch2UartSend;
|
||||
|
||||
|
||||
GateWay.ConfigPara.Lora.OnOff = true;
|
||||
GateWay.ConfigPara.Lora.ucChannel = 8;
|
||||
GateWay.ConfigPara.Lora.ucPower = 20;
|
||||
@@ -191,56 +143,57 @@ void GateWayInit(void)
|
||||
GateWay.ConfigPara.Lora.SpreadFactor = 9;
|
||||
GateWay.ConfigPara.Lora.ErrorCoding = 2;
|
||||
GateWay.ConfigPara.Lora.RegPreamble = 10;
|
||||
GateWay.ConfigPara.Lora.FreqCent = FREQ_CENT;
|
||||
GateWay.ConfigPara.Lora.FreqCent = bootParam.LoraFreq;
|
||||
|
||||
GateWay.ConfigPara.OutageFlag = false;
|
||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
||||
|
||||
#if MAC_ADDR_TYPE == 0
|
||||
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_Test, 6);
|
||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
||||
#elif MAC_ADDR_TYPE == 1
|
||||
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL1, 6);
|
||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
||||
// GateWay.ConfigPara.DebugChannel = DEBUG_CH_DBG;
|
||||
#elif MAC_ADDR_TYPE == 2
|
||||
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL2, 6);
|
||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
||||
// GateWay.ConfigPara.DebugChannel = DEBUG_CH_DBG;
|
||||
#elif MAC_ADDR_TYPE == 3
|
||||
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL3, 6);
|
||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
||||
#elif MAC_ADDR_TYPE == 4
|
||||
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL4, 6);
|
||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
||||
#elif MAC_ADDR_TYPE == 5
|
||||
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL5, 6);
|
||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
||||
#elif MAC_ADDR_TYPE == 6
|
||||
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL6, 6);
|
||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
||||
#elif MAC_ADDR_TYPE == 7
|
||||
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL7, 6);
|
||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
||||
#elif MAC_ADDR_TYPE == 8
|
||||
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL8, 6);
|
||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
||||
#elif MAC_ADDR_TYPE == 9
|
||||
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL9, 6);
|
||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
||||
#elif MAC_ADDR_TYPE == 10
|
||||
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL10, 6);
|
||||
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
/*防御被"洗白"的脏数据(镜像部分损坏但CRC合法):对通讯单元表做语义校验,
|
||||
清除无效条目,避免乱码条目占用注册槽位导致新设备注册不上*/
|
||||
for(int i = 0; i < COMMUNIT_NUM_MAX; i++) {
|
||||
CommUnitPara_t *CU = &GateWay.ConfigPara.CommUnitArray[i];
|
||||
uint8_t RegByte;
|
||||
memcpy(&RegByte, &CU->RegFlag, 1); //绕过编译器对bool取值0/1的假定,读取原始字节
|
||||
bool EntryValid = (RegByte == 0 || RegByte == 1);
|
||||
if(EntryValid && RegByte == 1) {
|
||||
bool MacAllFF = true, MacAll00 = true;
|
||||
for(int j = 0; j < 6; j++) {
|
||||
if(CU->Mac[0][j] != 0xFF) MacAllFF = false;
|
||||
if(CU->Mac[0][j] != 0x00) MacAll00 = false;
|
||||
}
|
||||
if(CU->SensorN == 0 || CU->SensorN > SENSOR_NUM_MAX || MacAllFF || MacAll00)
|
||||
EntryValid = false;
|
||||
}
|
||||
if(!EntryValid) {
|
||||
memset(CU, 0x00, sizeof(CommUnitPara_t));
|
||||
NeedSavePara = true;
|
||||
}
|
||||
}
|
||||
if(NeedSavePara)
|
||||
rt_kprintf("CommUnit table dirty, cleaned!\r\n");
|
||||
}
|
||||
|
||||
/*函数指针不允许从Flash恢复:正常加载路径下RS485Send来自旧固件写入Flash的
|
||||
代码地址,固件升级后代码布局变化会使该指针失效(野指针)。每次开机统一重设*/
|
||||
GateWay.ConfigPara.Rs485Ch1.RS485Send = RS485Ch1UartSend;
|
||||
GateWay.ConfigPara.Rs485Ch2.RS485Send = RS485Ch2UartSend;
|
||||
|
||||
/*网关MAC编码从Boot参数区(BootPara_t.GwMac)获取, 由Boot从固定地址0x4000同步
|
||||
(协议规定: Mac[0]=VerInfo, Mac[1:3]=PrjNum, Mac[4:5]=GwNum)*/
|
||||
for(int i = 0; i < 6; i++) {
|
||||
GateWay.ConfigPara.GwMac[i] = bootParam.GwMac[i];
|
||||
}
|
||||
|
||||
/*参照hc32l170_app UpdateInit: 保证AppFlag=APP_START_FLAG, 使Boot下次直接跳转App*/
|
||||
UpdateInit();
|
||||
|
||||
if(GateWay.ConfigPara.OutageFlag != true && GateWay.ConfigPara.OutageFlag != false)
|
||||
GateWay.ConfigPara.OutageFlag = false;
|
||||
|
||||
GateWay.SvrRegFlag = false;
|
||||
GateWay.MuchRegFlag = false;
|
||||
memset(GateWay.SvrMac, 0x00, 6);
|
||||
|
||||
if(GateWay.ConfigPara.DebugChannel == DEBUG_CH_RS485_1) {
|
||||
if(ChannelIsActive(GateWay.ConfigPara, CH_RS485_1)) {
|
||||
GateWay.ConfigPara.Rs485Ch1.Enable = true;
|
||||
GateWay.ConfigPara.Rs485Ch1.BaudRate = 500000;
|
||||
}
|
||||
@@ -248,7 +201,7 @@ void GateWayInit(void)
|
||||
GateWay.ConfigPara.Rs485Ch1.BaudRate = 500000;
|
||||
RS485Ch1_Config(GateWay.ConfigPara.Rs485Ch1.BaudRate);
|
||||
|
||||
if(GateWay.ConfigPara.DebugChannel == DEBUG_CH_RS485_2) {
|
||||
if(ChannelIsActive(GateWay.ConfigPara, CH_RS485_2)) {
|
||||
GateWay.ConfigPara.Rs485Ch2.Enable = true;
|
||||
GateWay.ConfigPara.Rs485Ch2.BaudRate = 500000;
|
||||
}
|
||||
@@ -282,8 +235,8 @@ void GateWayInit(void)
|
||||
}
|
||||
if(LoraSetFreqCent(GateWay.ConfigPara.Lora.FreqCent) == false)
|
||||
{
|
||||
GateWay.ConfigPara.Lora.FreqCent = 433100000;
|
||||
LoraSetFreqCent(GateWay.ConfigPara.Lora.ucChannel);
|
||||
GateWay.ConfigPara.Lora.FreqCent = 470100000;
|
||||
LoraSetFreqCent(GateWay.ConfigPara.Lora.FreqCent);
|
||||
}
|
||||
if(LoraSetPower(GateWay.ConfigPara.Lora.ucPower) == false) {
|
||||
GateWay.ConfigPara.Lora.ucPower = 20;
|
||||
@@ -311,7 +264,11 @@ void GateWayInit(void)
|
||||
//WritePara((uint8_t *)&GateWay.ConfigPara, sizeof(GWConfigPara_t));
|
||||
}
|
||||
|
||||
WritePara((uint8_t *)&GateWay.ConfigPara, sizeof(GWConfigPara_t));
|
||||
/*原实现开机无条件回写参数:一方面无谓增加一次擦写磨损;另一方面若读出的
|
||||
是坏数据,回写会重新计算CRC把脏数据"洗白"成永久合法,无法自愈。
|
||||
仅在参数被重置或清洗过时才落盘*/
|
||||
if(NeedSavePara)
|
||||
WritePara((uint8_t *)&GateWay.ConfigPara, sizeof(GWConfigPara_t));
|
||||
|
||||
LogInit();
|
||||
|
||||
@@ -328,14 +285,11 @@ void GateWayInit(void)
|
||||
}
|
||||
else
|
||||
rt_kprintf("History Num: 0\r\n");
|
||||
if(GateWay.ConfigPara.Comm == CATONE_COMM) {
|
||||
CAT1_ON();
|
||||
}
|
||||
else {
|
||||
ETH_ON();
|
||||
rt_thread_delay(1000);
|
||||
ETHReset();
|
||||
}
|
||||
bool cat1Active = ChannelIsActive(GateWay.ConfigPara, CH_CAT1);
|
||||
bool ethActive = ChannelIsActive(GateWay.ConfigPara, CH_ETH);
|
||||
if(cat1Active) { DbgOrCat1Uart_Config(115200); CAT1_ON(); }
|
||||
else { DBG_ON(); DbgOrCat1Uart_Config(500000); }
|
||||
if(ethActive) { ETH_ON(); rt_thread_delay(1000); ETHReset(); }
|
||||
}
|
||||
|
||||
void OutageUpdate(uint8_t AlarmType, bool AlarmState, uint8_t Batt)
|
||||
@@ -351,16 +305,16 @@ void OutageUpdate(uint8_t AlarmType, bool AlarmState, uint8_t Batt)
|
||||
Alarm->AlarmType = AlarmType;
|
||||
Alarm->AlarmState = AlarmState;
|
||||
Alarm->AlarmPara = Batt;
|
||||
CatOneEthSendQueue(MegData, 6); //发送报警信息
|
||||
UploadSend(MegData, 6); //发送报警信息
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: main
|
||||
* 功能描述: 主函数
|
||||
* 参 数: 无
|
||||
* 返 回 值: 运行错误返回-1
|
||||
* 函数名称: main
|
||||
* 功能描述: 主函数
|
||||
* 参 数: 无
|
||||
* 返 回 值: 运行错误返回-1
|
||||
*****************************************************************************************/
|
||||
static uint8_t LastBattery = 0xff; //上一次电池电压
|
||||
static uint8_t LastBattery = 0xff; //上一次电池电压
|
||||
int main(void)
|
||||
{
|
||||
uint16_t OneSecondDlyCnt = 0;
|
||||
@@ -384,19 +338,18 @@ int main(void)
|
||||
// TimeGet(&cTime);
|
||||
// TimeShow(TimeTs());
|
||||
FeedDog();
|
||||
//rt_thread_delay(500);
|
||||
//InfTest();
|
||||
//FeedDog();
|
||||
|
||||
//Cat1DBGOnOff(true);
|
||||
|
||||
|
||||
GateWay.CommUnitRevCallBack = CommUnitAnalyze;
|
||||
GateWay.SvrRevCallBack = Cat1EthRevCallBack;
|
||||
GateWay.MuchRevCallBack = MuchRevCallBack;
|
||||
GateWay.AuchRevCallBack = AuchRevCallBack;
|
||||
|
||||
GateWay.NetSendData_MQ = rt_mq_create("NetSendMQ", 512, 10, RT_IPC_FLAG_FIFO);
|
||||
if(GateWay.NetSendData_MQ == RT_NULL) {
|
||||
rt_kprintf("CatOne MQ Create Failed!\r\n");
|
||||
for(int i = 0; i < 6; i++) {
|
||||
char name[8];
|
||||
sprintf(name, "ChMQ%d", i);
|
||||
GateWay.ChMQ[i] = rt_mq_create(name, 256, 5, RT_IPC_FLAG_FIFO);
|
||||
}
|
||||
|
||||
GateWay.LoraRev_MQ = rt_mq_create("LoraRevMQ", 256, 10, RT_IPC_FLAG_FIFO);
|
||||
@@ -409,8 +362,11 @@ int main(void)
|
||||
rt_kprintf("UR Mutex Create Failed!\r\n");
|
||||
}
|
||||
|
||||
GateWay.SvrRevCallBack = Cat1EthRevCallBack;
|
||||
|
||||
GateWay.EthTxMutex = rt_mutex_create("ethtxmtx", RT_IPC_FLAG_FIFO);
|
||||
if(GateWay.EthTxMutex == RT_NULL) {
|
||||
rt_kprintf("EthTx Mutex Create Failed!\r\n");
|
||||
}
|
||||
|
||||
RS485Ch1_Thread = rt_thread_create("RS485Ch1", RS485Ch1_Thread_Entry, &GateWay, 2048, 3, 20);
|
||||
if (RS485Ch1_Thread != RT_NULL)
|
||||
rt_thread_startup(RS485Ch1_Thread);
|
||||
@@ -424,14 +380,20 @@ int main(void)
|
||||
return -1;
|
||||
|
||||
Debug_Thread = rt_thread_create("DebugUart", Debug_Thread_Entry, &GateWay, 2048, 3, 20);
|
||||
if (RS485Ch2_Thread != RT_NULL)
|
||||
if (Debug_Thread != RT_NULL)
|
||||
rt_thread_startup(Debug_Thread);
|
||||
else
|
||||
return -1;
|
||||
|
||||
Cat1Eth_Thread = rt_thread_create("Cat1Eth", CatOne_Eth_Thread_Entry, &GateWay, 4096, 3, 20);
|
||||
if (Cat1Eth_Thread != RT_NULL)
|
||||
rt_thread_startup(Cat1Eth_Thread);
|
||||
Cat1_Thread = rt_thread_create("Cat1", CatOne_Thread_Entry, &GateWay, 4096, 3, 20);
|
||||
if (Cat1_Thread != RT_NULL)
|
||||
rt_thread_startup(Cat1_Thread);
|
||||
else
|
||||
return -1;
|
||||
|
||||
Eth_Thread = rt_thread_create("Eth", Eth_Thread_Entry, &GateWay, 4096, 3, 20);
|
||||
if (Eth_Thread != RT_NULL)
|
||||
rt_thread_startup(Eth_Thread);
|
||||
else
|
||||
return -1;
|
||||
|
||||
@@ -448,9 +410,11 @@ int main(void)
|
||||
POWER_LED_OFF();
|
||||
}
|
||||
}
|
||||
EthRxOverhandler();
|
||||
RS485RxOverhandler();
|
||||
DebugRxOverhandler();
|
||||
if(ChannelIsActive(GateWay.ConfigPara, CH_ETH)) EthOverHandler();
|
||||
if(ChannelIsActive(GateWay.ConfigPara, CH_RS485_1) || ChannelIsActive(GateWay.ConfigPara, CH_RS485_2)
|
||||
|| GateWay.ConfigPara.Rs485Ch1.UpgradeEnable || GateWay.ConfigPara.Rs485Ch2.UpgradeEnable)
|
||||
RS485RxOverhandler();
|
||||
DebugOrCat1RxOverhandler();
|
||||
if(OneSecondDlyCnt % 200 == 0) {
|
||||
FeedDog();
|
||||
LORA_RX_TOGGLE();
|
||||
@@ -467,15 +431,15 @@ int main(void)
|
||||
|
||||
uint16_t ADValue = GetADCBuffPoint();
|
||||
//V = (AD * 3.3 / 4096) * (R1+R2) / R1; R1 = 200, R2 = 120
|
||||
//计算出常数为0.0021484375,扩大1000倍
|
||||
//计算出常数为0.0021484375,扩大1000倍
|
||||
float Voltage = ADValue * 2.1484375;
|
||||
GateWay.Battery = toPercentage(Voltage);
|
||||
|
||||
//上电判断电量
|
||||
//上电判断电量
|
||||
if(LastBattery == 0xff) {
|
||||
LastBattery = GateWay.Battery;
|
||||
|
||||
if(GateWay.ConfigPara.OutageFlag == true) { //有报警
|
||||
if(GateWay.ConfigPara.OutageFlag == true) { //有报警
|
||||
AlarmType = 1;
|
||||
}
|
||||
else {
|
||||
@@ -485,7 +449,7 @@ int main(void)
|
||||
BatteryUpdateDlyCnt = 10;
|
||||
}
|
||||
else {
|
||||
if(GateWay.ConfigPara.OutageFlag == false) { //没有告警,判断电池电压是否降低
|
||||
if(GateWay.ConfigPara.OutageFlag == false) { //没有告警,判断电池电压是否降低
|
||||
if(GateWay.Battery <= LastBattery) {
|
||||
if(LastBattery <= 5) {
|
||||
GateWay.ConfigPara.OutageFlag = true;
|
||||
@@ -506,7 +470,7 @@ int main(void)
|
||||
BatteryUpdateDlyCnt = 20 * 60;
|
||||
}
|
||||
}
|
||||
else { //充电,更新上一次电池电压
|
||||
else { //充电,更新上一次电池电压
|
||||
LastBattery = GateWay.Battery;
|
||||
}
|
||||
}
|
||||
@@ -533,14 +497,14 @@ int main(void)
|
||||
AlarmType = 0;
|
||||
}
|
||||
}
|
||||
else { //电池继续放电,更新上一次电池电压
|
||||
else { //电池继续放电,更新上一次电池电压
|
||||
LastBattery = GateWay.Battery;
|
||||
}
|
||||
}
|
||||
}
|
||||
BatteryUpdateDlyCnt--;
|
||||
if(BatteryUpdateDlyCnt == 0) {
|
||||
if(GateWay.ConfigPara.OutageFlag) { //有报警
|
||||
if(GateWay.ConfigPara.OutageFlag) { //有报警
|
||||
BatteryUpdateDlyCnt = 20 * 60;
|
||||
}
|
||||
else {
|
||||
@@ -554,7 +518,7 @@ int main(void)
|
||||
if(SystemRseetDlyCnt > (24 * 60 * 60 * 1000)) {
|
||||
SystemRseetDlyCnt = 0;
|
||||
Debug_Printf("The system resets periodically.\r\n");
|
||||
rt_thread_delay(10);
|
||||
rt_thread_delay(3000);
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
rt_thread_delay(1);
|
||||
@@ -563,81 +527,4 @@ int main(void)
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
static FATFS SDFatFs;
|
||||
static FIL TestFile;
|
||||
static uint8_t u8WorkBuffer[FF_MAX_SS];
|
||||
|
||||
void FSInit(void)
|
||||
{
|
||||
FRESULT fRet;
|
||||
uint32_t u32WBNbr, u32RBNbr;
|
||||
char SDPath[] = "1:";
|
||||
MKFS_PARM opt;
|
||||
uint8_t u8ReadText[100];
|
||||
en_result_t enTestRet = Error;
|
||||
uint8_t u8WriteText[] = "This is a string used to test the FatFs";
|
||||
|
||||
if (FR_OK != f_mount(&SDFatFs, (TCHAR const*)SDPath, 0U)) {
|
||||
rt_kprintf("FatFs Initialization Error!\r\n");
|
||||
}
|
||||
else {
|
||||
memset(&opt, 0, sizeof(MKFS_PARM));
|
||||
opt.fmt = (BYTE)FM_FAT32;
|
||||
/* Create a FAT file system (format) on the logical drive */
|
||||
if (FR_OK != f_mkfs((TCHAR const*)SDPath, &opt, u8WorkBuffer, sizeof(u8WorkBuffer))) {
|
||||
rt_kprintf("FatFs Format Error!\r\n");
|
||||
}
|
||||
else {
|
||||
/* Create and Open a new text file object with write access */
|
||||
if (FR_OK != f_open(&TestFile, "1:Test.txt", ((BYTE)FA_CREATE_ALWAYS | (BYTE)FA_WRITE))) {
|
||||
rt_kprintf("\"Test.txt\" file Open for write Error!\r\n");
|
||||
}
|
||||
else {
|
||||
/* Write data to the text file */
|
||||
fRet = f_write(&TestFile, u8WriteText, sizeof(u8WriteText), (void *)&u32WBNbr);
|
||||
if ((0UL == u32WBNbr) || (FR_OK != fRet)) {
|
||||
rt_kprintf("\"Test.txt\" file Write or EOF Error!\r\n");
|
||||
else {
|
||||
/* Close the open text file */
|
||||
f_close(&TestFile);
|
||||
/* Open the text file object with read access */
|
||||
if (FR_OK != f_open(&TestFile, "1:Test.txt", (BYTE)FA_READ)) {
|
||||
rt_kprintf("\"Test.txt\" file Open for read Error!\r\n");
|
||||
}
|
||||
else {
|
||||
memset(u8ReadText, 0, sizeof(u8ReadText));
|
||||
/* Read data from the text file */
|
||||
fRet = f_read(&TestFile, u8ReadText, sizeof(u8ReadText), (UINT*)(uint32_t)&u32RBNbr);
|
||||
if ((0UL == u32RBNbr) || (FR_OK != fRet)) {
|
||||
rt_kprintf("\"Test.txt\" file Read or EOF Error!\r\n");
|
||||
}
|
||||
else {
|
||||
/* Close the open text file */
|
||||
f_close(&TestFile);
|
||||
/* Compare read data with the expected data */
|
||||
if (u32RBNbr == u32WBNbr) {
|
||||
/* Check data value */
|
||||
if (0 == memcmp(u8WriteText, u8ReadText, u32RBNbr)) {
|
||||
enTestRet = Ok;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Unlink the micro SD disk I/O driver */
|
||||
f_mount(NULL, (TCHAR const*)SDPath, 0U);
|
||||
|
||||
if(enTestRet != Ok) {
|
||||
rt_kprintf("Error!\r\n");
|
||||
}
|
||||
else {
|
||||
rt_kprintf("Ok!\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,120 +0,0 @@
|
||||
#include "protocol.h"
|
||||
#include "string.h"
|
||||
#include "utils.h"
|
||||
|
||||
int protocol_pack_frame(
|
||||
uint16_t slave_addr,
|
||||
uint8_t command,const
|
||||
uint8_t *payload,
|
||||
uint16_t payload_len,
|
||||
uint8_t *buffer,uint16_t buffer_size,
|
||||
uint16_t *packed_len)
|
||||
{
|
||||
|
||||
// 构建基础帧头
|
||||
|
||||
buffer[0] = PROTOCOL_HEAD & 0xFF;
|
||||
buffer[1] = (PROTOCOL_HEAD >> 8) & 0xFF;
|
||||
buffer[2] = slave_addr & 0xFF;
|
||||
buffer[3] = (slave_addr >> 8) & 0xFF;
|
||||
|
||||
buffer[4] = command;
|
||||
|
||||
buffer[5] = payload_len & 0xFF;
|
||||
buffer[6] = (payload_len >> 8) & 0xFF;
|
||||
|
||||
// 复制有效载荷(保持小端格式)
|
||||
if (payload_len > 0 && payload != NULL) {
|
||||
memcpy(buffer + PROTOCOL_FRAME_HEAD_SIZE , payload, payload_len);
|
||||
}
|
||||
|
||||
// 设置实际长度
|
||||
int fram_len = PROTOCOL_FRAME_MIN_SIZE + payload_len;
|
||||
|
||||
|
||||
// 计算CRC(覆盖地址、命令、长度和有效载荷)
|
||||
uint16_t crc = 0xFFFF;
|
||||
|
||||
crc = modbus_crc16(buffer,fram_len -2);
|
||||
|
||||
// 写入CRC(保持小端格式)
|
||||
|
||||
buffer[fram_len-2] = (uint8_t)(crc & 0xFF);
|
||||
buffer[fram_len-1] = (uint8_t)(crc >> 8);
|
||||
|
||||
*packed_len =fram_len;
|
||||
|
||||
return PROTOCOL_SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
int protocol_unpack_frame(
|
||||
const uint8_t *frame,
|
||||
uint16_t frame_len,
|
||||
uint16_t *slave_addr,
|
||||
uint8_t *command,
|
||||
uint8_t *payload,
|
||||
uint16_t *payload_len
|
||||
) {
|
||||
// 参数校验
|
||||
if (frame == NULL || slave_addr == NULL || command == NULL || payload_len == NULL) {
|
||||
return PROTOCOL_ERR_INVALID_PARAM;
|
||||
}
|
||||
if (frame_len < PROTOCOL_FRAME_MIN_SIZE) {
|
||||
return PROTOCOL_ERR_INVALID_PARAM;
|
||||
}
|
||||
|
||||
// 帧头校验
|
||||
uint16_t header = (frame[0] | frame[1] <<8);
|
||||
|
||||
if (header != PROTOCOL_HEAD) {
|
||||
|
||||
return PROTOCOL_ERR_INVALID_PARAM;
|
||||
}
|
||||
|
||||
// 基础字段解析
|
||||
*slave_addr = (frame[2] | frame[3] << 8);
|
||||
|
||||
|
||||
*command = frame[4];
|
||||
|
||||
|
||||
*payload_len = (frame[5] | frame[6] << 8);
|
||||
|
||||
// 数据完整性校验
|
||||
if (*payload_len > (frame_len - PROTOCOL_FRAME_MIN_SIZE)) {
|
||||
|
||||
return PROTOCOL_ERR_BUFFER_OVERFLOW;
|
||||
}
|
||||
|
||||
int frame_size = *payload_len + 9;
|
||||
|
||||
uint16_t calc_crc =0xffff;
|
||||
|
||||
calc_crc = modbus_crc16((uint8_t *)frame, frame_size -2 );
|
||||
|
||||
// 校验CRC(保持小端格式)
|
||||
union{
|
||||
|
||||
uint16_t value;
|
||||
struct{
|
||||
uint8_t crcl;
|
||||
uint8_t crch;
|
||||
}bytes;
|
||||
|
||||
}crc_data;
|
||||
|
||||
crc_data.bytes.crcl =(frame[frame_size - 2] ) ;
|
||||
crc_data.bytes.crch =(frame[frame_size - 1] ) ;
|
||||
|
||||
if (calc_crc != crc_data.value) {
|
||||
return PROTOCOL_ERR_CRC;
|
||||
}
|
||||
|
||||
// 复制有效载荷(保持小端格式)
|
||||
if (*payload_len > 0 && payload != NULL) {
|
||||
memcpy(payload, frame + PROTOCOL_FRAME_HEAD_SIZE, *payload_len);
|
||||
}
|
||||
|
||||
return PROTOCOL_SUCCESS;
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
/******************************************************************************
|
||||
* @brief 环形缓冲区管理(参考linux/kfifo)
|
||||
*
|
||||
* Copyright (c) 2016~2020, <morro_luo@163.com>
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2016-05-30 Morro 初版完成
|
||||
******************************************************************************/
|
||||
#include "ringbuffer.h"
|
||||
#include <string.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#define min(a,b) ( (a) < (b) )? (a):(b)
|
||||
|
||||
/*
|
||||
*@brief 构造一个空环形缓冲区
|
||||
*@param[in] r - 环形缓冲区管理器
|
||||
*@param[in] buf - 数据缓冲区
|
||||
*@param[in] len - buf长度(必须是2的N次幂)
|
||||
*@retval bool
|
||||
*/
|
||||
bool ring_buf_init(ring_buf_t *r,unsigned char *buf, unsigned int len)
|
||||
{
|
||||
r->buf = buf;
|
||||
r->size = len;
|
||||
r->front = r->rear = 0;
|
||||
return (buf != NULL) && ((len & len -1) == 0);
|
||||
}
|
||||
|
||||
/*
|
||||
*@brief 清空环形缓冲区
|
||||
*@param[in] r - 待清空的环形缓冲区
|
||||
*@retval none
|
||||
*/
|
||||
void ring_buf_clr(ring_buf_t *r)
|
||||
{
|
||||
r->front = r->rear = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
*@brief 获取环形缓冲区数据长度
|
||||
*@retval 环形缓冲区中有效字节数
|
||||
*/
|
||||
int ring_buf_len(ring_buf_t *r)
|
||||
{
|
||||
return r->rear - r->front;
|
||||
}
|
||||
|
||||
/*
|
||||
*@brief 将指定长度的数据放到环形缓冲区中
|
||||
*@param[in] buf - 数据缓冲区
|
||||
* len - 缓冲区长度
|
||||
*@retval 实际放到中的数据
|
||||
*/
|
||||
int ring_buf_put(ring_buf_t *r,unsigned char *buf,unsigned int len)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int left;
|
||||
left = r->size + r->front - r->rear;
|
||||
len = min(len , left);
|
||||
i = min(len, r->size - (r->rear & r->size - 1));
|
||||
memcpy(r->buf + (r->rear & r->size - 1), buf, i);
|
||||
memcpy(r->buf, buf + i, len - i);
|
||||
r->rear += len;
|
||||
return len;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
*@brief 从环形缓冲区中读取指定长度的数据
|
||||
*@param[in] len - 读取长度
|
||||
*@param[out] buf - 输出数据缓冲区
|
||||
*@retval 实际读取长度
|
||||
*/
|
||||
int ring_buf_get(ring_buf_t *r,unsigned char *buf,unsigned int len)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int left;
|
||||
left = r->rear - r->front;
|
||||
len = min(len , left);
|
||||
i = min(len, r->size - (r->front & r->size - 1));
|
||||
memcpy(buf, r->buf + (r->front & r->size - 1), i);
|
||||
memcpy(buf + i, r->buf, len - i);
|
||||
r->front += len;
|
||||
return len;
|
||||
}
|
||||
@@ -9,6 +9,28 @@
|
||||
uint8_t flashtestbuff[SPIFLASH_SIZE];
|
||||
#endif
|
||||
|
||||
/*SPI Flash操作互斥保护:ReadPara/WritePara/AddLog/SavLogNum会被多个线程
|
||||
(Lora/RS485/Cat1/Eth/调试/主线程)并发调用,无保护时SPI事务交错会写坏参数镜像
|
||||
(传感器注册风暴与网关向服务器注册并发写Flash即触发此问题)。
|
||||
RT-Thread互斥量支持同线程递归持有(AddLog内调SavLogNum不会死锁)*/
|
||||
static rt_mutex_t FlashMutex = RT_NULL;
|
||||
static void FlashLock(void)
|
||||
{
|
||||
if(FlashMutex == RT_NULL) {
|
||||
rt_enter_critical();
|
||||
if(FlashMutex == RT_NULL)
|
||||
FlashMutex = rt_mutex_create("flsmux", RT_IPC_FLAG_PRIO);
|
||||
rt_exit_critical();
|
||||
}
|
||||
if(FlashMutex != RT_NULL)
|
||||
rt_mutex_take(FlashMutex, RT_WAITING_FOREVER);
|
||||
}
|
||||
static void FlashUnlock(void)
|
||||
{
|
||||
if(FlashMutex != RT_NULL)
|
||||
rt_mutex_release(FlashMutex);
|
||||
}
|
||||
|
||||
static uint8_t SpiFlashReadByte(void)
|
||||
{
|
||||
return Spi1SendReceive(0);
|
||||
@@ -39,7 +61,7 @@ static void SpiFlashWaitForWriteEnd(void)
|
||||
SpiFlashSetNss();
|
||||
}
|
||||
|
||||
//扇区擦除
|
||||
//扇区擦除
|
||||
void SpiFlashEraseSector(uint32_t SectorAddr)
|
||||
{
|
||||
#ifdef FLASH_TEST
|
||||
@@ -57,7 +79,7 @@ void SpiFlashEraseSector(uint32_t SectorAddr)
|
||||
#endif
|
||||
}
|
||||
|
||||
//整片擦除
|
||||
//整片擦除
|
||||
void SpiFlashEraseChip(void)
|
||||
{
|
||||
SpiFlashWriteEnable();
|
||||
@@ -67,7 +89,7 @@ void SpiFlashEraseChip(void)
|
||||
SpiFlashWaitForWriteEnd();
|
||||
}
|
||||
|
||||
//写数据
|
||||
//写数据
|
||||
void SpiFlashWriteData(uint8_t* wData, uint32_t wAddr, uint16_t wLen)
|
||||
{
|
||||
#ifdef FLASH_TEST
|
||||
@@ -89,15 +111,15 @@ void SpiFlashWriteData(uint8_t* wData, uint32_t wAddr, uint16_t wLen)
|
||||
|
||||
void SpiFlashWriteAnyLengthData(uint8_t* wData, uint32_t wAddr, uint16_t wLen)
|
||||
{
|
||||
uint16_t PageCnt; //需要写入页数
|
||||
uint16_t FirstPageWriteSize; //在起始地址不为页起始地址的情况下,先写入当前页剩余空间
|
||||
uint16_t LastPageWriteSize; //最后一页写入长度
|
||||
uint16_t PageCnt; //需要写入页数
|
||||
uint16_t FirstPageWriteSize; //在起始地址不为页起始地址的情况下,先写入当前页剩余空间
|
||||
uint16_t LastPageWriteSize; //最后一页写入长度
|
||||
uint32_t AddrOffset = 0;
|
||||
uint32_t WriteAddr;
|
||||
LogHeader LogH;
|
||||
WriteAddr = wAddr;
|
||||
|
||||
//写入的长度超出最大空间,从起始开始写起
|
||||
//写入的长度超出最大空间,从起始开始写起
|
||||
if((WriteAddr + wLen) > SPIFLASH_SIZE) {
|
||||
LogH = (LogHeader)wData;
|
||||
WriteAddr = LOG_SAV_START_SECTOR * SPIFLASH_SECTORSIZE;
|
||||
@@ -106,21 +128,21 @@ void SpiFlashWriteAnyLengthData(uint8_t* wData, uint32_t wAddr, uint16_t wLen)
|
||||
|
||||
uint16_t FirstPageRemainSpace = SPIFLASH_PAGESIZE - (WriteAddr % SPIFLASH_PAGESIZE);
|
||||
|
||||
// //判断是否跨扇区,跨扇区需要先擦除下一扇区
|
||||
CheckDelSecter(wAddr, wLen);
|
||||
// //判断是否跨扇区,跨扇区需要先擦除下一扇区
|
||||
// CheckDelSecter(wAddr, wLen);
|
||||
|
||||
if(wLen < FirstPageRemainSpace) {
|
||||
FirstPageWriteSize = wLen; //计算首页写入长度
|
||||
FirstPageWriteSize = wLen; //计算首页写入长度
|
||||
PageCnt = 0;
|
||||
LastPageWriteSize = 0;
|
||||
}
|
||||
else {
|
||||
// FirstPageWriteSize = FirstPageRemainSpace % SPIFLASH_PAGESIZE;
|
||||
// PageCnt = (wLen - (FirstPageWriteSize % SPIFLASH_PAGESIZE)) / SPIFLASH_PAGESIZE; //计算需要写入多少整页
|
||||
// LastPageWriteSize = (wLen - (FirstPageWriteSize % SPIFLASH_PAGESIZE)) % SPIFLASH_PAGESIZE; //计算剩余需要写入的长度
|
||||
// PageCnt = (wLen - (FirstPageWriteSize % SPIFLASH_PAGESIZE)) / SPIFLASH_PAGESIZE; //计算需要写入多少整页
|
||||
// LastPageWriteSize = (wLen - (FirstPageWriteSize % SPIFLASH_PAGESIZE)) % SPIFLASH_PAGESIZE; //计算剩余需要写入的长度
|
||||
FirstPageWriteSize = FirstPageRemainSpace;
|
||||
PageCnt = (wLen - FirstPageWriteSize) / SPIFLASH_PAGESIZE; //计算需要写入多少整页
|
||||
LastPageWriteSize = (wLen - FirstPageWriteSize) % SPIFLASH_PAGESIZE; //计算剩余需要写入的长度
|
||||
PageCnt = (wLen - FirstPageWriteSize) / SPIFLASH_PAGESIZE; //计算需要写入多少整页
|
||||
LastPageWriteSize = (wLen - FirstPageWriteSize) % SPIFLASH_PAGESIZE; //计算剩余需要写入的长度
|
||||
}
|
||||
|
||||
if(FirstPageWriteSize > 0) {
|
||||
@@ -170,17 +192,17 @@ uint32_t SpiFlashReadId(void)
|
||||
|
||||
typedef struct {
|
||||
uint16_t Flag;
|
||||
uint16_t LoopSavFlag; //循环存储标志
|
||||
uint32_t LogCnt; //日志最大数量
|
||||
uint32_t FirstLogStartAddr; //第一个数据的起始地址
|
||||
uint32_t LastLogEndAddr; //最后一个数据的结束地址
|
||||
uint16_t LoopSavFlag; //循环存储标志
|
||||
uint32_t LogCnt; //日志最大数量
|
||||
uint32_t FirstLogStartAddr; //第一个数据的起始地址
|
||||
uint32_t LastLogEndAddr; //最后一个数据的结束地址
|
||||
}LogNumSav_t;
|
||||
|
||||
static LogNumSav_t LogNumArray[256];
|
||||
static __IO uint32_t gLogCnt = 0;
|
||||
static __IO uint32_t FirstLogStartAddr = 0; //第一个日志起始地址
|
||||
static __IO uint32_t LastLogEndAddr = 0; //最后一个日志结束地址
|
||||
static __IO uint16_t LoopSavFlag = 0; //循环存储标志
|
||||
static __IO uint32_t FirstLogStartAddr = 0; //第一个日志起始地址
|
||||
static __IO uint32_t LastLogEndAddr = 0; //最后一个日志结束地址
|
||||
static __IO uint16_t LoopSavFlag = 0; //循环存储标志
|
||||
static uint16_t LogNumIdx;
|
||||
|
||||
uint16_t ReadLoopSavFlag(void)
|
||||
@@ -235,7 +257,7 @@ void LogInit(void)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(LogNumIdx == 0xffff) { //256条记录满,读最后一条记录
|
||||
if(LogNumIdx == 0xffff) { //256条记录满,读最后一条记录
|
||||
LogNumIdx = 0;
|
||||
SetLogNum(LogNumArray[255].LogCnt);
|
||||
SetLoopSavFlag(LogNumArray[255].LoopSavFlag);
|
||||
@@ -243,7 +265,7 @@ void LogInit(void)
|
||||
SetLastLogEndAddr(LogNumArray[255].LastLogEndAddr);
|
||||
return;
|
||||
}
|
||||
if(LogNumIdx == 0) { //没有记录
|
||||
if(LogNumIdx == 0) { //没有记录
|
||||
LogNumIdx = 0;
|
||||
SetLogNum(0);
|
||||
SetLoopSavFlag(0);
|
||||
@@ -260,7 +282,8 @@ void LogInit(void)
|
||||
void SavLogNum(uint32_t LogNum)
|
||||
{
|
||||
LogNumSav_t CLogSav;
|
||||
|
||||
|
||||
FlashLock();
|
||||
if(LogNum == 0) {
|
||||
LogNumIdx = 0;
|
||||
SetLogNum(0);
|
||||
@@ -268,35 +291,35 @@ void SavLogNum(uint32_t LogNum)
|
||||
SetFirstLogStartAddr(LOG_SAV_START_SECTOR * SPIFLASH_SECTORSIZE);
|
||||
SetLastLogEndAddr(LOG_SAV_START_SECTOR * SPIFLASH_SECTORSIZE);
|
||||
SpiFlashEraseSector(LOG_INFO_START_SECTOR * SPIFLASH_SECTORSIZE);
|
||||
FlashUnlock();
|
||||
return;
|
||||
}
|
||||
|
||||
SetLogNum(LogNum);
|
||||
CLogSav.Flag = LOG_INFO_SAV_FLAG;
|
||||
CLogSav.LogCnt = LogNum;
|
||||
CLogSav.FirstLogStartAddr = ReadFirstLogStartAddr();
|
||||
CLogSav.LastLogEndAddr = ReadLastLogEndAddr();
|
||||
|
||||
if(LogNumIdx == 256) {
|
||||
SpiFlashEraseSector(LOG_INFO_START_SECTOR * SPIFLASH_SECTORSIZE);
|
||||
LogNumIdx = 0;
|
||||
}
|
||||
SpiFlashWriteData((uint8_t *)&CLogSav, LogNumIdx * sizeof(LogNumSav_t) + LOG_INFO_START_SECTOR * SPIFLASH_SECTORSIZE, sizeof(LogNumSav_t));
|
||||
LogNumIdx++;
|
||||
FlashUnlock();
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: CheckDelSecter
|
||||
* 功能描述: 检查需要删除的扇区,跨扇区删除下一扇区,如果到了删除最后一个扇区,循环到起始扇区
|
||||
* 参 数: wAddr, 写入地址
|
||||
wLen, 写入长度
|
||||
* 返 回 值: 返回写入起始地址
|
||||
* 函数名称: CheckDelSecter
|
||||
* 功能描述: 检查需要删除的扇区,跨扇区删除下一扇区,如果到了删除最后一个扇区,循环到起始扇区
|
||||
* 参 数: wAddr, 写入地址
|
||||
wLen, 写入长度
|
||||
* 返 回 值: 返回写入起始地址
|
||||
*****************************************************************************************/
|
||||
uint8_t LogBuff[LOG_SAV_SIZE_MAX];
|
||||
const uint8_t SavFlag[4] ={0xAA, 0x55, 0x55, 0xAA};
|
||||
void CheckDelSecter(uint32_t wAddr, uint16_t wLen)
|
||||
{
|
||||
uint32_t DelOffsetAddr, FindFirstLogAddr; //存储起始地址
|
||||
uint32_t DelOffsetAddr, FindFirstLogAddr; //存储起始地址
|
||||
uint32_t DelSectorNum = 0;
|
||||
uint32_t SurplusSpace = SPIFLASH_SECTORSIZE - (wAddr % SPIFLASH_SECTORSIZE);
|
||||
|
||||
@@ -308,7 +331,7 @@ void CheckDelSecter(uint32_t wAddr, uint16_t wLen)
|
||||
FindFirstLogAddr = DelOffsetAddr + SPIFLASH_SECTORSIZE;
|
||||
}
|
||||
else {
|
||||
if(wLen < SurplusSpace) { //长度没有超过扇区剩余容量
|
||||
if(wLen < SurplusSpace) { //长度没有超过扇区剩余容量
|
||||
SetLastLogEndAddr(wAddr + wLen);
|
||||
return;
|
||||
}
|
||||
@@ -332,7 +355,7 @@ void CheckDelSecter(uint32_t wAddr, uint16_t wLen)
|
||||
while(1) {
|
||||
SpiFlashReadAnyLengthData(LogBuff, ReadAddr, LOG_SAV_SIZE_MAX);
|
||||
int i;
|
||||
for(i = 0; i < LOG_SAV_SIZE_MAX; i++) {
|
||||
for(i = 0; i <= LOG_SAV_SIZE_MAX - 4; i++) {
|
||||
if(memcmp(&LogBuff[i], SavFlag, 4) == 0) {
|
||||
SetFirstLogStartAddr(ReadAddr + i);
|
||||
return;;
|
||||
@@ -340,7 +363,7 @@ void CheckDelSecter(uint32_t wAddr, uint16_t wLen)
|
||||
}
|
||||
if(i == LOG_SAV_SIZE_MAX) {
|
||||
ReadAddr += LOG_SAV_SIZE_MAX;
|
||||
if(ReadAddr >= SPIFLASH_SIZE) { //找不到下一条数据,重置flash
|
||||
if(ReadAddr >= SPIFLASH_SIZE) { //找不到下一条数据,重置flash
|
||||
Debug_Printf("Add LOG Error, Next Data No Find!\r\n");
|
||||
SetLogNum(0);
|
||||
SetLoopSavFlag(0);
|
||||
@@ -363,6 +386,7 @@ void AddLog(uint8_t *wData, uint32_t wLen)
|
||||
// uint32_t SectorN;
|
||||
LogHeader LogH;
|
||||
|
||||
FlashLock();
|
||||
LogH = (LogHeader)LogBuffTemp;
|
||||
|
||||
LogNum = ReadLogNum();
|
||||
@@ -381,7 +405,7 @@ void AddLog(uint8_t *wData, uint32_t wLen)
|
||||
LogH->TimeStamp = TimeTs();
|
||||
memcpy(&LogBuffTemp[sizeof(LogHeader_t)], wData, wLen);
|
||||
|
||||
//判断是否跨扇区,跨扇区需要先擦除下一扇区
|
||||
//判断是否跨扇区,跨扇区需要先擦除下一扇区
|
||||
CheckDelSecter(LLEndAddr, LogSize);
|
||||
if(LogH->LogEndAddr > SPIFLASH_SIZE) {
|
||||
LLEndAddr = LOG_SAV_START_SECTOR * SPIFLASH_SECTORSIZE;
|
||||
@@ -390,18 +414,19 @@ void AddLog(uint8_t *wData, uint32_t wLen)
|
||||
SpiFlashWriteAnyLengthData(LogBuffTemp, LLEndAddr, LogSize);
|
||||
|
||||
SavLogNum(LogNum);
|
||||
FlashUnlock();
|
||||
//Debug_Printf("Add LOG: %d,endaddr = %d\r\n", LogNum, ReadLastLogEndAddr());
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: ReadLog
|
||||
* 功能描述: 读取日志
|
||||
* 参 数: Header, 上一包日志头信息,连续读取时传入上一包数据信息,缩短日志遍历时间,
|
||||
Header->LogEndAddr为0读取第一包数据,LogIdx数据无效
|
||||
rData, 日志出口,需要释放
|
||||
LogIdx, 读取的日志的序号,为0读取Header->LogEndAddr对应日志
|
||||
* 返 回 值: 返回数据长度
|
||||
* 函数名称: ReadLog
|
||||
* 功能描述: 读取日志
|
||||
* 参 数: Header, 上一包日志头信息,连续读取时传入上一包数据信息,缩短日志遍历时间,
|
||||
Header->LogEndAddr为0读取第一包数据,LogIdx数据无效
|
||||
rData, 日志出口,需要释放
|
||||
LogIdx, 读取的日志的序号,为0读取Header->LogEndAddr对应日志
|
||||
* 返 回 值: 返回数据长度
|
||||
*****************************************************************************************/
|
||||
int ReadLog(LogHeader Header, uint8_t **rData, uint32_t LogIdx)
|
||||
{
|
||||
@@ -426,7 +451,7 @@ int ReadLog(LogHeader Header, uint8_t **rData, uint32_t LogIdx)
|
||||
while(1) {
|
||||
SpiFlashReadAnyLengthData((uint8_t *)Header, FSAddr, sizeof(LogHeader_t));
|
||||
if(Header->LogSavFlag != LOG_SAV_FLAG) {
|
||||
if((SPIFLASH_SIZE - FSAddr) < LOG_SAV_SIZE_MAX) { //判断是否到片尾
|
||||
if((SPIFLASH_SIZE - FSAddr) < LOG_SAV_SIZE_MAX) { //判断是否到片尾
|
||||
FSAddr = LOG_SAV_START_SECTOR * SPIFLASH_SECTOR_NUM;
|
||||
continue;
|
||||
}
|
||||
@@ -461,16 +486,18 @@ int ReadLog(LogHeader Header, uint8_t **rData, uint32_t LogIdx)
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: ReadPara
|
||||
* 功能描述: 读取参数
|
||||
* 参 数: Para, 网关参数
|
||||
ParaLen, 参数长度
|
||||
* 返 回 值: 无
|
||||
* 函数名称: ReadPara
|
||||
* 功能描述: 读取参数
|
||||
* 参 数: Para, 网关参数
|
||||
ParaLen, 参数长度
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
int ReadPara(uint8_t *Para, uint32_t ParaLen)
|
||||
{
|
||||
SpiFlashReadAnyLengthData(Para, GATEWEY_PARA_SAV_ADDR, ParaLen); //读取片尾数据
|
||||
uint16_t Check = CRC_Modbus(0xA001, Para, ParaLen - 2);
|
||||
{
|
||||
FlashLock();
|
||||
SpiFlashReadAnyLengthData(Para, GATEWEY_PARA_SAV_ADDR, ParaLen);
|
||||
FlashUnlock();
|
||||
uint16_t Check = CRC_Modbus(CRC16_BASE, Para, ParaLen - 2);
|
||||
GWConfigPara CfgPara = (GWConfigPara)Para;
|
||||
if(CfgPara->crc16 != Check)
|
||||
return -1;
|
||||
@@ -478,21 +505,36 @@ int ReadPara(uint8_t *Para, uint32_t ParaLen)
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: WritePara
|
||||
* 功能描述: 写入参数
|
||||
* 参 数: Para, 网关参数
|
||||
ParaLen, 参数长度
|
||||
* 返 回 值: 无
|
||||
* 函数名称: WritePara
|
||||
* 功能描述: 写入参数
|
||||
* 参 数: Para, 网关参数
|
||||
ParaLen, 参数长度
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
int WritePara(uint8_t *Para, uint32_t ParaLen)
|
||||
{
|
||||
SpiFlashEraseSector(GATEWEY_PARA_SAV_ADDR);
|
||||
|
||||
uint16_t Check = CRC_Modbus(0xA001, Para, ParaLen - 2);
|
||||
{
|
||||
FlashLock();
|
||||
/*参数区只能占用扇区0~1(8KB),扇区2为日志信息区(LogNumArray)。
|
||||
参数越界会擦除日志簿记数据,此处直接拒绝写入*/
|
||||
if(GATEWEY_PARA_SAV_ADDR + ParaLen > LOG_INFO_START_SECTOR * SPIFLASH_SECTORSIZE) {
|
||||
FlashUnlock();
|
||||
return -1;
|
||||
}
|
||||
uint16_t Check = CRC_Modbus(CRC16_BASE, Para, ParaLen - 2);
|
||||
GWConfigPara CfgPara = (GWConfigPara)Para;
|
||||
CfgPara->crc16 = Check;
|
||||
SpiFlashWriteAnyLengthData(Para, GATEWEY_PARA_SAV_ADDR, ParaLen); //读取片尾数据
|
||||
/*擦除参数区覆盖的所有扇区(当前GWConfigPara_t约7.5KB,跨扇区0和1)。
|
||||
原实现只擦扇区0,跨扇区部分依赖SpiFlashWriteAnyLengthData内部的
|
||||
CheckDelSecter擦除,该函数会顺带改写日志系统的LastLogEndAddr等簿记
|
||||
变量并可能误擦日志信息区,现已移除该调用,扇区擦除由本函数自行完成*/
|
||||
uint32_t SectorCnt = (GATEWEY_PARA_SAV_ADDR + ParaLen + SPIFLASH_SECTORSIZE - 1) / SPIFLASH_SECTORSIZE;
|
||||
for(uint32_t i = 0; i < SectorCnt; i++) {
|
||||
SpiFlashEraseSector((GATEWEY_PARA_SAV_SECTOR + i) * SPIFLASH_SECTORSIZE);
|
||||
}
|
||||
SpiFlashWriteAnyLengthData(Para, GATEWEY_PARA_SAV_ADDR, ParaLen);
|
||||
FlashUnlock();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* USER CODE END */
|
||||
|
||||
|
||||
@@ -8,6 +8,13 @@ static struct
|
||||
|
||||
}g_update_protoc;
|
||||
|
||||
static uint8_t s_DevMac[6] = {0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01};
|
||||
|
||||
void update_set_devmac(uint8_t *DevMac)
|
||||
{
|
||||
if(DevMac != NULL)
|
||||
memcpy(s_DevMac, DevMac, 6);
|
||||
}
|
||||
|
||||
void update_send_cmd(uint8_t Cmd, uint16_t Indx, int PageNum)
|
||||
{
|
||||
@@ -17,8 +24,8 @@ void update_send_cmd(uint8_t Cmd, uint16_t Indx, int PageNum)
|
||||
|
||||
update_protocol_hd_t *Frame = (update_protocol_hd_t*)sData;
|
||||
|
||||
Frame->Header = 0x7a;
|
||||
Frame->SlvAddr = 0x01;
|
||||
Frame->Header = 0x7d;
|
||||
memcpy(Frame->DevMac, s_DevMac, 6);
|
||||
Frame->Cmd = Cmd;
|
||||
|
||||
if (Cmd == 0x01)
|
||||
@@ -58,14 +65,20 @@ int update_unpack(uint8_t* rxData, int rLen,uint8_t *cmd, uint8_t* dev_addr, vo
|
||||
|
||||
crc16 = (rxData[rLen - 1] << 8) | rxData[rLen - 2];
|
||||
|
||||
if (check != crc16 || rxData[0] !=0x7a || pload ==0)
|
||||
if (check != crc16 || rxData[0] !=0x7d || pload ==0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
update_protocol_hd_t *Frame = (update_protocol_hd_t*)rxData;
|
||||
|
||||
*dev_addr = Frame->SlvAddr;
|
||||
/*仅精确匹配网关MAC*/
|
||||
if(memcmp(Frame->DevMac, s_DevMac, 6) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(dev_addr != NULL)
|
||||
memcpy(dev_addr, Frame->DevMac, 6);
|
||||
|
||||
*cmd = Frame->Cmd;
|
||||
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
#include "utils.h"
|
||||
|
||||
/*
|
||||
生成多项式 (x^16 + x^15 + x^2 + 1)
|
||||
*/
|
||||
uint16_t modbus_crc16(uint8_t* data, int length)
|
||||
{
|
||||
|
||||
uint16_t crc = 0xFFFF; // 初始值FFFF
|
||||
uint16_t polynomial = 0x8005; // 多项式8005
|
||||
|
||||
for (int i = 0; i < length; i++) {
|
||||
// 输入反转(REFIN):对每个字节进行位反转
|
||||
uint8_t byte = data[i];
|
||||
uint8_t reversed_byte = 0;
|
||||
|
||||
for (int j = 0; j < 8; j++) {
|
||||
reversed_byte = (reversed_byte << 1) | (byte & 0x01);
|
||||
byte >>= 1;
|
||||
}
|
||||
|
||||
crc ^= (reversed_byte << 8); // 与高字节异或
|
||||
|
||||
for (int j = 0; j < 8; j++) {
|
||||
if (crc & 0x8000) { // 检查最高位
|
||||
crc = (crc << 1) ^ polynomial;
|
||||
} else {
|
||||
crc <<= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 输出反转(REFOUT):对16位CRC结果进行位反转
|
||||
uint16_t reversed_crc = 0;
|
||||
|
||||
for (int i = 0; i < 16; i++) {
|
||||
reversed_crc = (reversed_crc << 1) | (crc & 0x0001);
|
||||
crc >>= 1;
|
||||
}
|
||||
|
||||
// 结果异或值(XOROUT):0000(实际不变)
|
||||
return reversed_crc ^ 0x0000;
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
<<<<<<< HEAD
|
||||
# GateWay
|
||||
|
||||
一代网关
|
||||
=======
|
||||
# LaserTracing_Debug
|
||||
|
||||
>>>>>>> aaff1aeec5ea03de83eee8888e10da1bf6a62ded
|
||||
@@ -1,8 +0,0 @@
|
||||
<<<<<<< HEAD
|
||||
# GateWay
|
||||
|
||||
一代网关
|
||||
=======
|
||||
# LaserTracing_Debug
|
||||
|
||||
>>>>>>> aaff1aeec5ea03de83eee8888e10da1bf6a62ded
|
||||
@@ -1,3 +0,0 @@
|
||||
# GateWay
|
||||
|
||||
一代网关
|
||||
@@ -1,3 +0,0 @@
|
||||
# GateWay
|
||||
|
||||
一代网关
|
||||
@@ -1,2 +0,0 @@
|
||||
# LaserTracing_Debug
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
# LaserTracing_Debug
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user