From 5b6b8f5c527f7460fea85cd7ab1914fefdfaba48 Mon Sep 17 00:00:00 2001 From: bob Date: Thu, 12 Jul 2018 22:42:03 +1000 Subject: [PATCH] Fix EI2C for 10B board. Enable debug UART. Handle ICU zer0. --- tracker/software/cfg/pp10a/portab.h | 3 + tracker/software/cfg/pp10b/portab.h | 5 +- .../software/source/drivers/wrapper/ei2c.c | 32 +++---- tracker/software/source/pkt/channels/rxafsk.c | 8 +- tracker/software/source/pkt/channels/rxafsk.h | 2 +- tracker/software/source/pkt/channels/rxpwm.c | 12 +++ tracker/software/source/pkt/channels/rxpwm.h | 2 +- tracker/software/source/pkt/devices/dbguart.c | 3 + tracker/software/source/pkt/devices/dbguart.h | 85 ++++++++++--------- tracker/software/source/threads/collector.c | 2 +- 10 files changed, 88 insertions(+), 66 deletions(-) diff --git a/tracker/software/cfg/pp10a/portab.h b/tracker/software/cfg/pp10a/portab.h index c9068865..83524370 100644 --- a/tracker/software/cfg/pp10a/portab.h +++ b/tracker/software/cfg/pp10a/portab.h @@ -150,6 +150,9 @@ /* The external port can be used for bit bang I2C. */ #define ENABLE_EXTERNAL_I2C TRUE +#define EI2C_SCL LINE_IO_TXD /* SCL */ +#define EI2C_SDA LINE_IO_RXD /* SDA */ + /* To use IO_TXD/IO_RXD for UART debug channel. */ #define ENABLE_SERIAL_DEBUG FALSE diff --git a/tracker/software/cfg/pp10b/portab.h b/tracker/software/cfg/pp10b/portab.h index 1a4336a4..b702b0d4 100644 --- a/tracker/software/cfg/pp10b/portab.h +++ b/tracker/software/cfg/pp10b/portab.h @@ -149,7 +149,10 @@ //#define LINE_UART4_RX PAL_LINE(GPIOA, 11U) /* The external port can be used for bit bang I2C. */ -#define ENABLE_EXTERNAL_I2C FALSE +#define ENABLE_EXTERNAL_I2C TRUE + +#define EI2C_SCL LINE_GPIO_PIN1 /* SCL */ +#define EI2C_SDA LINE_GPIO_PIN2 /* SDA */ /* To use IO_TXD/IO_RXD for UART debug channel. */ #define ENABLE_SERIAL_DEBUG TRUE diff --git a/tracker/software/source/drivers/wrapper/ei2c.c b/tracker/software/source/drivers/wrapper/ei2c.c index 73512719..fce7ad5c 100644 --- a/tracker/software/source/drivers/wrapper/ei2c.c +++ b/tracker/software/source/drivers/wrapper/ei2c.c @@ -3,8 +3,9 @@ * pins of the Pecan. The I2C bus is bitbanged and operates at 45 kHz if the * STM32 is operated at SYSCLK=48MHz. * - * TXD pin: SCL - * RXD pin: SDA + * GPIO pins... + * EI2C_SCL + * EI2C_SDA * * @see https://en.wikipedia.org/wiki/I%C2%B2C */ @@ -14,32 +15,29 @@ #include "debug.h" #include "portab.h" -#define SCL LINE_IO_TXD /* SCL is connected to the TXD labeled line */ -#define SDA LINE_IO_RXD /* SDA is connected to the RXD labeled line */ - static bool started = false; static inline bool read_SCL(void) { // Return current level of SCL line, 0 or 1 - palSetLineMode(SCL, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); - return palReadLine(SCL); + palSetLineMode(EI2C_SCL, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); + return palReadLine(EI2C_SCL); } static inline bool read_SDA(void) { // Return current level of SDA line, 0 or 1 - palSetLineMode(SDA, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); - return palReadLine(SDA); + palSetLineMode(EI2C_SDA, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); + return palReadLine(EI2C_SDA); } static inline void set_SCL(void) { // Do not drive SCL(set pin high-impedance) - palSetLineMode(SCL, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); + palSetLineMode(EI2C_SCL, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); } static inline void clear_SCL(void) { // Actively drive SCL signal low - palSetLineMode(SCL, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); - palClearLine(SCL); + palSetLineMode(EI2C_SCL, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palClearLine(EI2C_SCL); } static inline void set_SDA(void) { // Do not drive SDA(set pin high-impedance) - palSetLineMode(SDA, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); + palSetLineMode(EI2C_SDA, PAL_MODE_INPUT_PULLUP | PAL_STM32_OSPEED_HIGHEST); } static inline void clear_SDA(void) { // Actively drive SDA signal low - palSetLineMode(SDA, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); - palClearLine(SDA); + palSetLineMode(EI2C_SDA, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palClearLine(EI2C_SDA); } static inline void arbitration_lost(void) { TRACE_ERROR("arbitration_lost"); @@ -53,7 +51,6 @@ static void i2c_start_cond(void) { set_SCL(); sysinterval_t t0 = chVTGetSystemTime(); while(read_SCL() == 0 && TIME_I2MS(chVTGetSystemTime()-t0) < 10) { // Clock stretching - // You should add timeout to this loop } } if(read_SDA() == 0) @@ -71,7 +68,6 @@ static void i2c_stop_cond(void) { // Clock stretching sysinterval_t t0 = chVTGetSystemTime(); while(read_SCL() == 0 && TIME_I2MS(chVTGetSystemTime()-t0) < 10) { // Clock stretching - // add timeout to this loop. } // SCL is high, set SDA from 0 to 1 @@ -95,7 +91,6 @@ static void i2c_write_bit(bool bit) { // Wait for SDA value to be read by slave, minimum of 4us for standard mode sysinterval_t t0 = chVTGetSystemTime(); while(read_SCL() == 0 && TIME_I2MS(chVTGetSystemTime()-t0) < 10) { // Clock stretching - // You should add timeout to this loop } // SCL is high, now data is valid @@ -118,7 +113,6 @@ static bool i2c_read_bit(void) { sysinterval_t t0 = chVTGetSystemTime(); while(read_SCL() == 0 && TIME_I2MS(chVTGetSystemTime()-t0) < 10) { // Clock stretching - // You should add timeout to this loop } // SCL is high, read out bit diff --git a/tracker/software/source/pkt/channels/rxafsk.c b/tracker/software/source/pkt/channels/rxafsk.c index 753626a1..e5d442a3 100644 --- a/tracker/software/source/pkt/channels/rxafsk.c +++ b/tracker/software/source/pkt/channels/rxafsk.c @@ -15,6 +15,7 @@ */ #include "pktconf.h" +#include "portab.h" /*===========================================================================*/ /* Driver exported variables. */ @@ -593,7 +594,7 @@ AFSKDemodDriver *pktCreateAFSKDecoder(packet_svc_t *pktHandler) { /* Create the AFSK decoder thread. */ extern memory_heap_t *ccm_heap; - myDriver->decoder_thd = chThdCreateFromHeap(ccm_heap, + myDriver->decoder_thd = chThdCreateFromHeap(NULL, THD_WORKING_AREA_SIZE(PKT_AFSK_DECODER_WA_SIZE), myDriver->decoder_name, NORMALPRIO - 10, @@ -931,6 +932,11 @@ THD_FUNCTION(pktAFSKDecoder, arg) { continue; /* Decoder state switch. */ } /* End case. */ + /* If PWM reports a zero valley. + * The PWM side has already posted a PWM_STREAM_CLOSE event. + */ + case PWM_TERM_ICU_ZERO: + /* If CCA ends and the decoder has not validated any frame. * The PWM side has already posted a PWM_STREAM_CLOSE event. */ diff --git a/tracker/software/source/pkt/channels/rxafsk.h b/tracker/software/source/pkt/channels/rxafsk.h index 4d4a7338..cad399d5 100644 --- a/tracker/software/source/pkt/channels/rxafsk.h +++ b/tracker/software/source/pkt/channels/rxafsk.h @@ -53,7 +53,7 @@ #define AFSK_PWM_DATA_CAPTURE_DEBUG 7 #define AFSK_PWM_DATA_REPLAY_DEBUG 8 -#define AFSK_DEBUG_TYPE AFSK_NO_DEBUG +#define AFSK_DEBUG_TYPE AFSK_PWM_DATA_CAPTURE_DEBUG /* Error output type selection. */ #define AFSK_NO_ERROR 0 diff --git a/tracker/software/source/pkt/channels/rxpwm.c b/tracker/software/source/pkt/channels/rxpwm.c index 323b7148..ae30c48c 100644 --- a/tracker/software/source/pkt/channels/rxpwm.c +++ b/tracker/software/source/pkt/channels/rxpwm.c @@ -665,6 +665,18 @@ void pktRadioICUPeriod(ICUDriver *myICU) { chSysUnlockFromISR(); return; } + + /* + * Check if either ICU value is zero and thus invalid. + */ + icucnt_t impulse = icuGetWidthX(myICU); + icucnt_t valley = icuGetPeriodX(myICU) - impulse; + if(impulse == 0 || valley == 0) { + pktClosePWMChannelI(myICU, EVT_PWM_STREAM_CLOSE, PWM_TERM_ICU_ZERO); + chSysUnlockFromISR(); + return; + } + /* Write ICU data to PWM queue. */ msg_t qs = pktQueuePWMDataI(myICU); diff --git a/tracker/software/source/pkt/channels/rxpwm.h b/tracker/software/source/pkt/channels/rxpwm.h index b642366d..fd041612 100644 --- a/tracker/software/source/pkt/channels/rxpwm.h +++ b/tracker/software/source/pkt/channels/rxpwm.h @@ -45,7 +45,7 @@ #define PWM_ACK_DECODE_END 4 #define PWM_TERM_DECODE_STOP 5 #define PWM_TERM_NO_DATA 6 -//#define PWM_TERM_QUEUE_LOCK 7 +#define PWM_TERM_ICU_ZERO 7 #define PWM_INFO_QUEUE_SWAP 8 #define PWM_ACK_DECODE_ERROR 9 diff --git a/tracker/software/source/pkt/devices/dbguart.c b/tracker/software/source/pkt/devices/dbguart.c index f23eef75..351a2542 100644 --- a/tracker/software/source/pkt/devices/dbguart.c +++ b/tracker/software/source/pkt/devices/dbguart.c @@ -11,6 +11,7 @@ /*===========================================================================*/ #include "pktconf.h" +#include "dbguart.h" /** * @file dbguart.c @@ -22,4 +23,6 @@ binary_semaphore_t debug_out_sem; +BaseSequentialStream* pkt_out = (BaseSequentialStream*)SERIAL_CFG_DEBUG_DRIVER; + /** @} */ diff --git a/tracker/software/source/pkt/devices/dbguart.h b/tracker/software/source/pkt/devices/dbguart.h index 69d593fe..0a513e99 100644 --- a/tracker/software/source/pkt/devices/dbguart.h +++ b/tracker/software/source/pkt/devices/dbguart.h @@ -1,42 +1,43 @@ -/* - Aerospace Decoder - Copyright (C) 2018 Bob Anderson (VK2GJ) - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -*/ - -/** - * @file dbguart.h - * @brief Definitions for UART4. - * - * @addtogroup IODevices - * @{ - */ - -#ifndef DEVICES_DBGUART_H_ -#define DEVICES_DBGUART_H_ - -#include "portab.h" - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#define DBG_ERROR 1 -#define DBG_WARN 2 -#define DBG_INFO 3 -#define DBG_DEBUG 4 - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* DEVICES_DBGUART_H_ */ - -/** @} */ - +/* + Aerospace Decoder - Copyright (C) 2018 Bob Anderson (VK2GJ) + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +*/ + +/** + * @file dbguart.h + * @brief Definitions for UART4. + * + * @addtogroup IODevices + * @{ + */ + +#ifndef DEVICES_DBGUART_H_ +#define DEVICES_DBGUART_H_ + +#include "portab.h" + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#define DBG_ERROR 1 +#define DBG_WARN 2 +#define DBG_INFO 3 +#define DBG_DEBUG 4 + +#ifdef __cplusplus +extern "C" { +#endif + + extern BaseSequentialStream* pkt_out; +#ifdef __cplusplus +} +#endif + +#endif /* DEVICES_DBGUART_H_ */ + +/** @} */ + diff --git a/tracker/software/source/threads/collector.c b/tracker/software/source/threads/collector.c index 3f461ce3..e630010e 100644 --- a/tracker/software/source/threads/collector.c +++ b/tracker/software/source/threads/collector.c @@ -560,7 +560,7 @@ THD_FUNCTION(collectorThread, arg) { extern uint8_t gps_model; // Trace data unixTimestamp2Date(&time, tp->gps_time); - TRACE_INFO( "COLL > GPS status: state=%s model=%s)", + TRACE_INFO( "COLL > GPS status: state=%s model=%s", get_gps_state_name(tp->gps_state), gps_get_model_name(gps_model)); TRACE_INFO( "COLL > New data point (ID=%d)\r\n"