diff --git a/hwconf/hw_gesc.c b/hwconf/hw_gesc.c index 5971a937..505fe34f 100644 --- a/hwconf/hw_gesc.c +++ b/hwconf/hw_gesc.c @@ -2,18 +2,18 @@ Copyright 2018 Benjamin Vedder benjamin@vedder.se This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ #include "hw.h" #include "ch.h" @@ -36,7 +36,7 @@ #include "lora/rfm95w.h" #endif -// Threads + // Threads THD_FUNCTION(mag_thread, arg); static THD_WORKING_AREA(mag_thread_wa, 512); static bool mag_thread_running = false; @@ -46,7 +46,7 @@ static volatile bool i2c_running = false; static volatile int angle = 0; //private functions -static void terminal_cmd_doublepulse(int argc, const char **argv); +static void terminal_cmd_doublepulse(int argc, const char** argv); // I2C configuration @@ -66,32 +66,32 @@ void hw_init_gpio(void) { // LEDs palSetPadMode(LED_GREEN_GPIO, LED_GREEN_PIN, - PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); + PAL_MODE_OUTPUT_PUSHPULL | + PAL_STM32_OSPEED_HIGHEST); palSetPadMode(LED_RED_GPIO, LED_RED_PIN, - PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); + PAL_MODE_OUTPUT_PUSHPULL | + PAL_STM32_OSPEED_HIGHEST); // GPIOA Configuration: Channel 1 to 3 as alternate function push-pull palSetPadMode(GPIOA, 8, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | - PAL_STM32_OSPEED_HIGHEST | - PAL_STM32_PUDR_FLOATING); + PAL_STM32_OSPEED_HIGHEST | + PAL_STM32_PUDR_FLOATING); palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | - PAL_STM32_OSPEED_HIGHEST | - PAL_STM32_PUDR_FLOATING); + PAL_STM32_OSPEED_HIGHEST | + PAL_STM32_PUDR_FLOATING); palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | - PAL_STM32_OSPEED_HIGHEST | - PAL_STM32_PUDR_FLOATING); + PAL_STM32_OSPEED_HIGHEST | + PAL_STM32_PUDR_FLOATING); palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | - PAL_STM32_OSPEED_HIGHEST | - PAL_STM32_PUDR_FLOATING); + PAL_STM32_OSPEED_HIGHEST | + PAL_STM32_PUDR_FLOATING); palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | - PAL_STM32_OSPEED_HIGHEST | - PAL_STM32_PUDR_FLOATING); + PAL_STM32_OSPEED_HIGHEST | + PAL_STM32_PUDR_FLOATING); palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | - PAL_STM32_OSPEED_HIGHEST | - PAL_STM32_PUDR_FLOATING); + PAL_STM32_OSPEED_HIGHEST | + PAL_STM32_PUDR_FLOATING); // Hall sensors palSetPadMode(HW_HALL_ENC_GPIO1, HW_HALL_ENC_PIN1, PAL_MODE_INPUT_PULLUP); @@ -100,22 +100,22 @@ void hw_init_gpio(void) { // Phase filters palSetPadMode(PHASE_FILTER_GPIO, PHASE_FILTER_PIN, - PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); + PAL_MODE_OUTPUT_PUSHPULL | + PAL_STM32_OSPEED_HIGHEST); PHASE_FILTER_OFF(); - // Current filter + // Current filter palSetPadMode(GPIOD, 2, - PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); + PAL_MODE_OUTPUT_PUSHPULL | + PAL_STM32_OSPEED_HIGHEST); CURRENT_FILTER_OFF(); // AUX pin AUX_OFF(); palSetPadMode(AUX_GPIO, AUX_PIN, - PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); + PAL_MODE_OUTPUT_PUSHPULL | + PAL_STM32_OSPEED_HIGHEST); // ADC Pins palSetPadMode(GPIOA, 0, PAL_MODE_INPUT_ANALOG); @@ -149,26 +149,26 @@ void hw_init_gpio(void) { } void hw_setup_adc_channels(void) { -/* - * ADC Vector - * - * 0 (1): IN0 SENS1 - * 1 (2): IN1 SENS2 - * 2 (3): IN2 SENS3 - * 3 (1): IN10 CURR1 - * 4 (2): IN11 CURR2 - * 5 (3): IN12 CURR3 - * 6 (1): IN5 ADC_EXT1 - * 7 (2): IN6 ADC_EXT2 - * 8 (3): IN3 TEMP_MOS - * 9 (1): IN14 TEMP_MOTOR - * 10 (2): IN15 - * 11 (3): IN13 AN_IN - * 12 (1): Vrefint - */ + /* + * ADC Vector + * + * 0 (1): IN0 SENS1 + * 1 (2): IN1 SENS2 + * 2 (3): IN2 SENS3 + * 3 (1): IN10 CURR1 + * 4 (2): IN11 CURR2 + * 5 (3): IN12 CURR3 + * 6 (1): IN5 ADC_EXT1 + * 7 (2): IN6 ADC_EXT2 + * 8 (3): IN3 TEMP_MOS + * 9 (1): IN14 TEMP_MOTOR + * 10 (2): IN15 + * 11 (3): IN13 AN_IN + * 12 (1): Vrefint + */ - // ADC1 regular channels + // ADC1 regular channels ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_15Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 2, ADC_SampleTime_15Cycles); ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 3, ADC_SampleTime_15Cycles); @@ -212,15 +212,15 @@ void hw_start_i2c(void) { if (!i2c_running) { palSetPadMode(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN, - PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) | - PAL_STM32_OTYPE_OPENDRAIN | - PAL_STM32_OSPEED_MID1 | - PAL_STM32_PUDR_PULLUP); + PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) | + PAL_STM32_OTYPE_OPENDRAIN | + PAL_STM32_OSPEED_MID1 | + PAL_STM32_PUDR_PULLUP); palSetPadMode(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN, - PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) | - PAL_STM32_OTYPE_OPENDRAIN | - PAL_STM32_OSPEED_MID1 | - PAL_STM32_PUDR_PULLUP); + PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) | + PAL_STM32_OTYPE_OPENDRAIN | + PAL_STM32_OSPEED_MID1 | + PAL_STM32_PUDR_PULLUP); i2cStart(&HW_I2C_DEV, &i2cfg); i2c_running = true; @@ -252,21 +252,21 @@ void hw_try_restore_i2c(void) { i2cAcquireBus(&HW_I2C_DEV); palSetPadMode(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN, - PAL_STM32_OTYPE_OPENDRAIN | - PAL_STM32_OSPEED_MID1 | - PAL_STM32_PUDR_PULLUP); + PAL_STM32_OTYPE_OPENDRAIN | + PAL_STM32_OSPEED_MID1 | + PAL_STM32_PUDR_PULLUP); palSetPadMode(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN, - PAL_STM32_OTYPE_OPENDRAIN | - PAL_STM32_OSPEED_MID1 | - PAL_STM32_PUDR_PULLUP); + PAL_STM32_OTYPE_OPENDRAIN | + PAL_STM32_OSPEED_MID1 | + PAL_STM32_PUDR_PULLUP); palSetPad(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN); palSetPad(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN); chThdSleep(1); - for(int i = 0;i < 16;i++) { + for (int i = 0;i < 16;i++) { palClearPad(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN); chThdSleep(1); palSetPad(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN); @@ -283,16 +283,16 @@ void hw_try_restore_i2c(void) { palSetPad(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN); palSetPadMode(HW_I2C_SCL_PORT, HW_I2C_SCL_PIN, - PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) | - PAL_STM32_OTYPE_OPENDRAIN | - PAL_STM32_OSPEED_MID1 | - PAL_STM32_PUDR_PULLUP); + PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) | + PAL_STM32_OTYPE_OPENDRAIN | + PAL_STM32_OSPEED_MID1 | + PAL_STM32_PUDR_PULLUP); palSetPadMode(HW_I2C_SDA_PORT, HW_I2C_SDA_PIN, - PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) | - PAL_STM32_OTYPE_OPENDRAIN | - PAL_STM32_OSPEED_MID1 | - PAL_STM32_PUDR_PULLUP); + PAL_MODE_ALTERNATE(HW_I2C_GPIO_AF) | + PAL_STM32_OTYPE_OPENDRAIN | + PAL_STM32_OSPEED_MID1 | + PAL_STM32_PUDR_PULLUP); HW_I2C_DEV.state = I2C_STOP; i2cStart(&HW_I2C_DEV, &i2cfg); @@ -316,7 +316,7 @@ THD_FUNCTION(mag_thread, arg) { hw_start_i2c(); chThdSleepMilliseconds(10); - for(;;) { + for (;;) { if (i2c_running) { txbuf[0] = 0x0c; txbuf[1] = 0x0d; @@ -324,8 +324,8 @@ THD_FUNCTION(mag_thread, arg) { status = i2cMasterTransmitTimeout(&HW_I2C_DEV, temp_addr, txbuf, 2, rxbuf, 2, tmo); i2cReleaseBus(&HW_I2C_DEV); - if (status == MSG_OK){ - angle = rxbuf[0] | rxbuf[1]<<8; + if (status == MSG_OK) { + angle = rxbuf[0] | rxbuf[1] << 8; } else { hw_try_restore_i2c(); } @@ -338,12 +338,12 @@ int gsvesc_get_angle() { return angle; } -static void terminal_cmd_doublepulse(int argc, const char **argv) +static void terminal_cmd_doublepulse(int argc, const char** argv) { (void)argc; (void)argv; - int preface,pulse1,breaktime,pulse2; + int preface, pulse1, breaktime, pulse2; int utick; int deadtime = -1; @@ -369,7 +369,7 @@ static void terminal_cmd_doublepulse(int argc, const char **argv) } timeout_configure_IWDT_slowest(); - utick = (int)( SYSTEM_CORE_CLOCK / 1000000 ); + utick = (int)(SYSTEM_CORE_CLOCK / 1000000); mcpwm_deinit(); mcpwm_foc_deinit(); gpdrive_deinit(); @@ -395,7 +395,7 @@ static void terminal_cmd_doublepulse(int argc, const char **argv) // Time Base configuration TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseStructure.TIM_Period = (preface+pulse1)*utick; + TIM_TimeBaseStructure.TIM_Period = (preface + pulse1) * utick; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); @@ -404,7 +404,7 @@ static void terminal_cmd_doublepulse(int argc, const char **argv) TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; - TIM_OCInitStructure.TIM_Pulse = preface*utick; + TIM_OCInitStructure.TIM_Pulse = preface * utick; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; @@ -460,14 +460,14 @@ static void terminal_cmd_doublepulse(int argc, const char **argv) //Timer 4 triggert Timer 1 TIM_Cmd(TIM4, ENABLE); TIM_Cmd(TIM4, DISABLE); - TIM1->ARR = (breaktime+pulse2)*utick; - TIM1->CCR1 = breaktime*utick; - while ( TIM1->CNT != 0 ); + TIM1->ARR = (breaktime + pulse2) * utick; + TIM1->CCR1 = breaktime * utick; + while (TIM1->CNT != 0); TIM_Cmd(TIM4, ENABLE); chThdSleepMilliseconds(1); TIM_CtrlPWMOutputs(TIM1, DISABLE); - mc_configuration *mcconf = mempools_alloc_mcconf(); + mc_configuration* mcconf = mempools_alloc_mcconf(); *mcconf = *mc_interface_get_configuration(); switch (mcconf->motor_type) { @@ -477,7 +477,7 @@ static void terminal_cmd_doublepulse(int argc, const char **argv) break; case MOTOR_TYPE_FOC: - mcpwm_foc_init(mcconf,mcconf); + mcpwm_foc_init(mcconf, mcconf); break; case MOTOR_TYPE_GPD: diff --git a/lora/SX1278.c b/lora/SX1278.c index e2c13d29..3654801e 100644 --- a/lora/SX1278.c +++ b/lora/SX1278.c @@ -6,6 +6,21 @@ * * work based on DORJI.COM sample code and * https://github.com/realspinner/SX1278_LoRa + * + * Modified for vesc firmware by schardt@team-ctech.de + + This code uses InvertIQ function to create a simple Gateway/Node logic. + VESC = Gateway + Gateway - Sends messages with enableInvertIQ() + - Receives messages with disableInvertIQ() + + Node - Sends messages with disableInvertIQ() + - Receives messages with enableInvertIQ() + + With this arrangement a Gateway never receive messages from another Gateway + and a Node never receive message from another Node. + Only Gateway to Node and vice versa. + * */ #include "conf_general.h" diff --git a/lora/lora.c b/lora/lora.c index ed9bc623..a7910bac 100644 --- a/lora/lora.c +++ b/lora/lora.c @@ -47,74 +47,70 @@ PACKET_STATE_t packet_state; SX1278_t SX1278; // Private functions -static void process_packet(unsigned char *data, unsigned int len); -static void send_packet(unsigned char *data, unsigned int len); +static void process_packet(unsigned char* data, unsigned int len); +static void send_packet(unsigned char* data, unsigned int len); -void rfm95w_send_packet(unsigned char *data, unsigned int len) { +void lora_send_packet(unsigned char* data, unsigned int len) { if (!send_mutex_init_done) { chMtxObjectInit(&send_mutex); send_mutex_init_done = true; -} + } chMtxLock(&send_mutex); packet_send_packet(data, len, &packet_state); chMtxUnlock(&send_mutex); } -static void process_packet(unsigned char *data, unsigned int len) { - commands_process_packet(data, len, rfm95w_send_packet); +static void process_packet(unsigned char* data, unsigned int len) { + commands_process_packet(data, len, lora_send_packet); } -static void send_packet(unsigned char *data, unsigned int len) { +static void send_packet(unsigned char* data, unsigned int len) { int erg; - commands_printf("Send, len %d",len); - erg= SX1278_LoRaEntryTx(&SX1278, len, 2000); - commands_printf("EntryTX: %d",erg); - erg=SX1278_LoRaTxPacket(&SX1278, (uint8_t*) data, len, 2000); - commands_printf("TXPacket: %d",erg); + erg = SX1278_LoRaEntryTx(&SX1278, len, 100); + erg = SX1278_LoRaTxPacket(&SX1278, (uint8_t*)data, len, 100); } -void rfm95w_init(void) { +void lora_init(void) { packet_init(send_packet, process_packet, &packet_state); - palSetPadMode(HW_RFM95W_SPI_PORT_SCK, HW_RFM95W_SPI_PIN_SCK, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); - palSetPadMode(HW_RFM95W_SPI_PORT_MISO, HW_RFM95W_SPI_PIN_MISO,PAL_MODE_INPUT); - palSetPadMode(HW_RFM95W_SPI_PORT_NSS, HW_RFM95W_SPI_PIN_NSS, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); - palSetPadMode(HW_RFM95W_SPI_PORT_MOSI, HW_RFM95W_SPI_PIN_MOSI, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); - palSetPadMode(HW_RFM95W_SPI_PORT_DIO0, HW_RFM95W_SPI_PIN_DIO0, PAL_MODE_INPUT); - palSetPadMode(HW_RFM95W_SPI_PORT_RESET, HW_RFM95W_SPI_PIN_RESET, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); - SX1278_init(&SX1278, 868000000, SX1278_POWER_17DBM, SX1278_LORA_SF_7, SX1278_LORA_BW_125KHZ, SX1278_LORA_CR_4_5, SX1278_LORA_CRC_DIS, 100); + palSetPadMode(HW_LORA_SPI_PORT_SCK, HW_LORA_SPI_PIN_SCK, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(HW_LORA_SPI_PORT_MISO, HW_LORA_SPI_PIN_MISO, PAL_MODE_INPUT); + palSetPadMode(HW_LORA_SPI_PORT_NSS, HW_LORA_SPI_PIN_NSS, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(HW_LORA_SPI_PORT_MOSI, HW_LORA_SPI_PIN_MOSI, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(HW_LORA_SPI_PORT_DIO0, HW_LORA_SPI_PIN_DIO0, PAL_MODE_INPUT); + palSetPadMode(HW_LORA_SPI_PORT_RESET, HW_LORA_SPI_PIN_RESET, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + SX1278_init(&SX1278, 868000000, SX1278_POWER_17DBM, SX1278_LORA_SF_7, SX1278_LORA_BW_250KHZ, SX1278_LORA_CR_4_5, SX1278_LORA_CRC_DIS, 100); if (!thread_is_running) { chThdCreateStatic(packet_process_thread_wa, sizeof(packet_process_thread_wa), NORMALPRIO, packet_process_thread, NULL); - thread_is_running = true; + thread_is_running = true; } } -void rfm95w_stop(void) { +void lora_stop(void) { } static THD_FUNCTION(packet_process_thread, arg) { (void)arg; unsigned char buffer[128]; - chRegSetThreadName("rfm95w proc"); + chRegSetThreadName("LoRa proc"); - buffer[0]=COMM_GET_VALUES; + buffer[0] = COMM_GET_VALUES; - while(!commands_is_initialized() ) { - chThdSleepMilliseconds(10); + while (!commands_is_initialized()) { + chThdSleepMilliseconds(10); } - for(;;) { + for (;;) { //simulate a received packet to trigger send_packet - commands_process_packet(buffer, 1, rfm95w_send_packet); - //SX1278_LoRaEntryRx(&SX1278,100,100); - //if ( SX1278_LoRaRxPacket(&SX1278) ) { - //process_packet(SX1278.rxBuffer, SX1278.readBytes); - //} - chThdSleepMilliseconds(500); + commands_process_packet(buffer, 1, lora_send_packet); + SX1278_LoRaEntryRx(&SX1278, 100, 100); + if (SX1278_LoRaRxPacket(&SX1278)) { + process_packet(SX1278.rxBuffer, SX1278.readBytes); + } } }