Made adc_read_injected() return signed int because result can become negative

Added function can_fifo_pending() - number of pending RX messages
can_receive() returns number of pending messages prior to release
This commit is contained in:
johannes
2018-10-21 22:17:56 +02:00
committed by Piotr Esden-Tempski
parent 3b892e4a18
commit d1b43a7bb9
4 changed files with 32 additions and 8 deletions

View File

@@ -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
/**@}*/

View File

@@ -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[]);

View File

@@ -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;
}
}

View File

@@ -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;
}