From a0c1beb61fda70a59ee6146cf0ea496aa90272d8 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 27 Apr 2018 08:45:00 +0200 Subject: [PATCH] [X-Lite] Next round of changes (#5847) * [X-Lite] PXX is now sent every 4ms * New option PXX_FREQUENCY (HIGH / LOW) * [X-Lite] It now sends 16 channels per 4ms --- radio/src/pulses/pulses_arm.cpp | 2 +- radio/src/pulses/pulses_arm.h | 16 ++++++ radio/src/pulses/pxx_arm.cpp | 55 +++++++++++++++---- .../arm/stm32/intmodule_serial_driver.cpp | 6 +- radio/src/targets/taranis/CMakeLists.txt | 4 ++ .../src/targets/taranis/extmodule_driver.cpp | 6 +- 6 files changed, 72 insertions(+), 17 deletions(-) mode change 100644 => 100755 radio/src/pulses/pulses_arm.cpp mode change 100644 => 100755 radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp old mode 100644 new mode 100755 index 6f8d66027..f92a9b2e9 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -168,7 +168,7 @@ void setupPulses(uint8_t port) switch (required_protocol) { case PROTO_PXX: setupPulsesPXX(port); - scheduleNextMixerCalculation(port, 9); + scheduleNextMixerCalculation(port, MODULES_TIMER_PXX_PERIOD); break; case PROTO_SBUS: setupPulsesSbus(port); diff --git a/radio/src/pulses/pulses_arm.h b/radio/src/pulses/pulses_arm.h index 58c768da3..7a955884a 100644 --- a/radio/src/pulses/pulses_arm.h +++ b/radio/src/pulses/pulses_arm.h @@ -44,6 +44,16 @@ template struct PpmPulsesData { T * ptr; }; +#if defined(PXX_FREQUENCY_HIGH) +#define EXTMODULE_USART_PXX_BAUDRATE 420000 +#define INTMODULE_USART_PXX_BAUDRATE 450000 +#define MODULES_TIMER_PXX_PERIOD 4 // 4ms +#else +#define EXTMODULE_USART_PXX_BAUDRATE 115200 +#define INTMODULE_USART_PXX_BAUDRATE 115200 +#define MODULES_TIMER_PXX_PERIOD 9 // 9ms +#endif + #if defined(PPM_PIN_SERIAL) PACK(struct PxxSerialPulsesData { uint8_t pulses[64]; @@ -75,11 +85,17 @@ PACK(struct PxxUartPulsesData { #define MULTIMODULE_BAUDRATE 100000 #if defined(INTMODULE_PULSES) || defined(EXTMODULE_PULSES) + /* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */ /* DSM2 uses 2 header + 12 channel bytes, with max 10 changes (8n2) per byte + 16 bits trailer ~= 156 max pulses */ /* Multimodule uses 3 bytes header + 22 channel bytes with max 11 changes per byte (8e2) + 16 bits trailer ~= 291 max pulses */ /* Multimodule reuses some of the DSM2 function and structs since the protocols are similar enough */ /* sbus is 1 byte header, 22 channel bytes (11bit * 16ch) + 1 byte flags */ + +#if defined(PXX_FREQUENCY_HIGH) +#error "Pulses array needs to be increased (PXX_FREQUENCY=HIGH)" +#endif + PACK(struct PxxTimerPulsesData { pulse_duration_t pulses[200]; pulse_duration_t * ptr; diff --git a/radio/src/pulses/pxx_arm.cpp b/radio/src/pulses/pxx_arm.cpp index cdea5a00f..480377e0f 100644 --- a/radio/src/pulses/pxx_arm.cpp +++ b/radio/src/pulses/pxx_arm.cpp @@ -85,6 +85,10 @@ void uartPutPcmByte(uint8_t port, uint8_t byte) void uartInitPcmArray(uint8_t port) { modulePulsesData[port].pxx_uart.ptr = modulePulsesData[port].pxx_uart.pulses; +} + +void uartInitPcmCrc(uint8_t port) +{ modulePulsesData[port].pxx_uart.pcmCrc = 0; } @@ -159,7 +163,6 @@ void pxxPutPcmBit(uint8_t port, uint8_t bit) pxxPutPcmPart(port, 0); modulePulsesData[port].pxx.pcmOnesCount = 0; } - } void pxxPutPcmByte(uint8_t port, uint8_t byte) @@ -179,10 +182,15 @@ void pxxInitPcmArray(uint8_t port) #else modulePulsesData[port].pxx.rest = 18000; #endif - modulePulsesData[port].pxx.pcmCrc = 0; + modulePulsesData[port].pxx.pcmOnesCount = 0; } +void pxxInitPcmCrc(uint8_t port) +{ + modulePulsesData[port].pxx.pcmCrc = 0; +} + void pxxPutPcmHead(uint8_t port) { // send 7E, do not CRC @@ -213,6 +221,14 @@ inline void initPcmArray(uint8_t port) pxxInitPcmArray(port); } +inline void initPcmCrc(uint8_t port) +{ + if (IS_UART_MODULE(port)) + uartInitPcmCrc(port); + else + pxxInitPcmCrc(port); +} + inline void putPcmHead(uint8_t port) { if (IS_UART_MODULE(port)) @@ -248,6 +264,11 @@ inline void initPcmArray(uint8_t port) pxxInitPcmArray(port); } +inline void initPcmCrc(uint8_t port) +{ + pxxInitPcmCrc(port); +} + inline void putPcmHead(uint8_t port) { pxxPutPcmHead(port); @@ -269,11 +290,11 @@ inline void putPcmTail(uint8_t port) } #endif -void setupPulsesPXX(uint8_t port) +inline void setupFramePXX(uint8_t port, uint8_t sendUpperChannels) { uint16_t pulseValue=0, pulseValueLow=0; - initPcmArray(port); + initPcmCrc(port); /* Sync */ putPcmHead(port); @@ -304,12 +325,7 @@ void setupPulsesPXX(uint8_t port) /* FLAG2 */ putPcmByte(port, 0); - /* PPM */ - static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; - int sendUpperChannels = 0; - if (pass[port]++ & 0x01) { - sendUpperChannels = g_model.moduleData[port].channelsCount; - } + /* CHANNELS */ for (int i=0; i<8; i++) { if (flag1 & PXX_SEND_FAILSAFE) { if (g_model.moduleData[port].failsafeMode == FAILSAFE_HOLD) { @@ -405,3 +421,22 @@ void setupPulsesPXX(uint8_t port) putPcmTail(port); } + +void setupPulsesPXX(uint8_t port) +{ + initPcmArray(port); + +#if defined(PXX_FREQUENCY_HIGH) + setupFramePXX(port, 0); + if (NUM_CHANNELS(port) > 8) { + setupFramePXX(port, 8); + } +#else + static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) }; + uint8_t sendUpperChannels = 0; + if (pass[port]++ & 0x01) { + sendUpperChannels = g_model.moduleData[port].channelsCount; + } + setupFramePXX(port, sendUpperChannels); +#endif +} diff --git a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp old mode 100644 new mode 100755 index 07f9a55c6..ff4c3551d --- a/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/intmodule_serial_driver.cpp @@ -86,7 +86,7 @@ void intmodulePxxStart() // UART config USART_DeInit(INTMODULE_USART); USART_InitTypeDef USART_InitStructure; - USART_InitStructure.USART_BaudRate = 115200; + USART_InitStructure.USART_BaudRate = INTMODULE_USART_PXX_BAUDRATE; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; @@ -98,8 +98,8 @@ void intmodulePxxStart() // Timer INTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; INTMODULE_TIMER->PSC = INTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz) - INTMODULE_TIMER->ARR = 18000; // 9mS - INTMODULE_TIMER->CCR2 = 15000; // Update time + INTMODULE_TIMER->ARR = 2000 * MODULES_TIMER_PXX_PERIOD; + INTMODULE_TIMER->CCR2 = (2000 * MODULES_TIMER_PXX_PERIOD) - 2000; // Update time INTMODULE_TIMER->CCER = TIM_CCER_CC3E; INTMODULE_TIMER->CCMR2 = 0; INTMODULE_TIMER->EGR = 1; // Restart diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index dc8d6ffe1..c1e3fe61c 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -76,6 +76,7 @@ elseif(PCB STREQUAL X7) set(LCD_DRIVER lcd_driver_spi.cpp) set(GVAR_SCREEN model_gvars.cpp) elseif(PCB STREQUAL XLITE) + option(PXX_FREQUENCY "PXX Frequency (LOW / HIGH)" HIGH) set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)") set(CPU_TYPE STM32F2) set(CPU_TYPE_FULL STM32F205xE) # for size report @@ -94,6 +95,9 @@ elseif(PCB STREQUAL XLITE) endif() if(PCB STREQUAL XLITE) + if(PXX_FREQUENCY STREQUAL HIGH) + add_definitions(-DPXX_FREQUENCY_HIGH) + endif() set(TARGET_SRC ${TARGET_SRC} ../common/arm/stm32/intmodule_serial_driver.cpp diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 7dfe34340..95b6878c4 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -138,7 +138,7 @@ void extmodulePxxStart() // UART config USART_DeInit(EXTMODULE_USART); USART_InitTypeDef USART_InitStructure; - USART_InitStructure.USART_BaudRate = 115200; + USART_InitStructure.USART_BaudRate = EXTMODULE_USART_PXX_BAUDRATE; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; @@ -150,8 +150,8 @@ void extmodulePxxStart() // Timer EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS from 30MHz - EXTMODULE_TIMER->ARR = 18000; // 9mS - EXTMODULE_TIMER->CCR2 = 16000; // Update time + EXTMODULE_TIMER->ARR = 2000 * MODULES_TIMER_PXX_PERIOD; + EXTMODULE_TIMER->CCR2 = (2000 * MODULES_TIMER_PXX_PERIOD) - 2000; // Update time EXTMODULE_TIMER->EGR = 1; // Restart EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF; EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt