diff --git a/include/libopencm3/stm32/can.h b/include/libopencm3/stm32/can.h index 1855c15b..7983b84c 100644 --- a/include/libopencm3/stm32/can.h +++ b/include/libopencm3/stm32/can.h @@ -668,12 +668,13 @@ void can_disable_irq(uint32_t canport, uint32_t irq); int can_transmit(uint32_t canport, uint32_t id, bool ext, bool rtr, uint8_t length, uint8_t *data); -void can_receive(uint32_t canport, uint8_t fifo, bool release, uint32_t *id, +uint32_t can_receive(uint32_t canport, uint8_t fifo, bool release, uint32_t *id, bool *ext, bool *rtr, uint8_t *fmi, uint8_t *length, uint8_t *data, uint16_t *timestamp); void can_fifo_release(uint32_t canport, uint8_t fifo); bool can_available_mailbox(uint32_t canport); +uint32_t can_fifo_pending(uint32_t canport, uint8_t fifo); END_DECLS /**@}*/ diff --git a/include/libopencm3/stm32/common/adc_common_v1.h b/include/libopencm3/stm32/common/adc_common_v1.h index 29ff0d0b..6d0752fe 100644 --- a/include/libopencm3/stm32/common/adc_common_v1.h +++ b/include/libopencm3/stm32/common/adc_common_v1.h @@ -399,7 +399,7 @@ void adc_set_right_aligned(uint32_t adc); bool adc_eoc(uint32_t adc); bool adc_eoc_injected(uint32_t adc); uint32_t adc_read_regular(uint32_t adc); -uint32_t adc_read_injected(uint32_t adc, uint8_t reg); +int32_t adc_read_injected(uint32_t adc, uint8_t reg); void adc_set_continuous_conversion_mode(uint32_t adc); void adc_set_single_conversion_mode(uint32_t adc); void adc_set_regular_sequence(uint32_t adc, uint8_t length, uint8_t channel[]); diff --git a/lib/stm32/can.c b/lib/stm32/can.c index f404a4a7..9941e7a3 100644 --- a/lib/stm32/can.c +++ b/lib/stm32/can.c @@ -466,11 +466,15 @@ void can_fifo_release(uint32_t canport, uint8_t fifo) @param[out] data Unsigned int8[]. Message payload data. @param[out] timestamp Pointer to store the message timestamp. Only valid on time triggered CAN. Use NULL to ignore. +@returns int 0-3 depending on how many messages where pending before + releasing the FIFO. + when 0 is returned no message could be retrieved */ -void can_receive(uint32_t canport, uint8_t fifo, bool release, uint32_t *id, +uint32_t can_receive(uint32_t canport, uint8_t fifo, bool release, uint32_t *id, bool *ext, bool *rtr, uint8_t *fmi, uint8_t *length, uint8_t *data, uint16_t *timestamp) { + uint32_t pending_cnt = can_fifo_pending(canport, fifo); uint32_t fifo_id = 0; union { uint8_t data8[4]; @@ -542,9 +546,28 @@ void can_receive(uint32_t canport, uint8_t fifo, bool release, uint32_t *id, if (release) { can_fifo_release(canport, fifo); } + + return pending_cnt; } bool can_available_mailbox(uint32_t canport) { return CAN_TSR(canport) & (CAN_TSR_TME0 | CAN_TSR_TME1 | CAN_TSR_TME2); } + +/*---------------------------------------------------------------------------*/ +/** @brief CAN get number of pending RX messages + +@param[in] canport Unsigned int32. CAN block register base @ref can_reg_base. +@param[in] fifo Unsigned int8. FIFO id. +@returns int 1, 2 or 3 if messages are pending in given fifo, 0 otherwise. + */ +uint32_t can_fifo_pending(uint32_t canport, uint8_t fifo) +{ + if (fifo == 0) { + return CAN_RF0R(canport) & CAN_RF0R_FMP0_MASK; + } else { + return CAN_RF1R(canport) & CAN_RF1R_FMP1_MASK; + } +} + diff --git a/lib/stm32/common/adc_common_v1.c b/lib/stm32/common/adc_common_v1.c index 227855d0..1edceb7a 100644 --- a/lib/stm32/common/adc_common_v1.c +++ b/lib/stm32/common/adc_common_v1.c @@ -480,17 +480,17 @@ adc_set_injected_offset. @returns Unsigned int32 conversion result. */ -uint32_t adc_read_injected(uint32_t adc, uint8_t reg) +int32_t adc_read_injected(uint32_t adc, uint8_t reg) { switch (reg) { case 1: - return ADC_JDR1(adc); + return (int16_t)ADC_JDR1(adc); case 2: - return ADC_JDR2(adc); + return (int16_t)ADC_JDR2(adc); case 3: - return ADC_JDR3(adc); + return (int16_t)ADC_JDR3(adc); case 4: - return ADC_JDR4(adc); + return (int16_t)ADC_JDR4(adc); } return 0; }