[Ovmsdev] e: OVMS Poller module/singleton

Michael Balzer dexter at expeedo.de
Fri Jan 24 00:28:10 HKT 2025


The CAN status variables are all explained in can.h:

// CAN status
typedef struct
   {
   uint32_t interrupts;              // interrupts
   uint32_t packets_rx;              // frames reveiced
   uint32_t packets_tx;              // frames sent successfully
   uint32_t txbuf_delay;             // frames routed through TX queue
   uint16_t rxbuf_overflow;          // frames lost due to RX buffers full
   uint16_t txbuf_overflow;          // TX queue overflows
   uint32_t tx_fails;                // TX failures/aborts
   uint32_t error_flags;             // driver specific bitset
   uint16_t errors_rx;               // RX error counter
   uint16_t errors_tx;               // TX error counter
   uint16_t invalid_rx;              // RX invalid frame counter
   uint16_t watchdog_resets;         // Watchdog reset counter
   uint16_t error_resets;            // Error resolving reset counter
   uint32_t error_time;              // monotonictime of last error 
state detection
   } CAN_status_t;


The driver specific error flags need to be decoded in the context of the 
transceiver type: can1 = esp32can driver, losely SJA1000 compatible, 
can2 & can3 = mcp2515 driver.

esp32can:
     error_flags = error_irqs << 16 | (status & 0b11001110) << 8 | (ecc 
& 0xff);

esp32can error & status bits are documented in "esp32can_regdef.h", see 
SJA1000 documentation for more details.

mcp2515:
     error_flags = (intstat << 24) | (errflag << 16) | intflag;

mcp2515 interrupt & error bits are documtented in "mcp2515_regdef.h", 
see MCP2515 documentation for more details, plus some synthetic internal 
debugging flags as ORed in by the driver in 
`mcp2515::AsynchronousInterruptHandler()` beginning on line 500.

> Interestingly both of us saw can2 errors in pairs: one with 
> errflags=0x23401c01 and one with 0x22401c02. In my case these were 
> either 0 or 10 ms apart.
>
  * intstat 0x23 = 0b00100011 = Error state change (details in EFLG) |
    RX buffer 1 full | RX buffer 0 full
      o … 0x22 = same, but only RX buffer 1 full (RXB0 has just been
        cleared by the driver)
  * errflag 0x40 = 0x01000000 = Receive Buffer 0 Overflow
  * intflag 0x1c01 = all indications detected & processed at RX buffer 0
      o … 0x1c02 = same, but at RX buffer 1

So these are simply indications of RX buffer 0 overflows. These are no 
"real" overflows, as RX buffer 1 was still available, so the frames were 
not lost and the rxbuf_overflow counter was not incremented.

The driver could clear this condition to avoid signaling this as a CAN 
error. I think we kept it that way because an RXB0 overflow already 
indicates a lot of traffic on the bus. This could also result in a 
warning log, but the CAN framework doesn't know how to distinguish 
driver specific errors from warnings.

> Err flags: 0x01000001

  * …simply means RXB0 has been received & read.


Regards,
Michael


Am 23.01.25 um 14:48 schrieb Chris Box via OvmsDev:
>
> On 2025-01-23 12:11, Developer From Jokela via OvmsDev wrote:
>
>> E (445282) can: can2: intr=240803 rxpkt=242887 txpkt=6 
>> errflags=0x22401c02 rxerr=0 txerr=0 rxinval=0 rxovr=0 txovr=0 
>> txdelay=0 txfail=0 wdgreset=0 errreset=0
>
> Ok, now putting Developer From Jokela's post together with Michael's I 
> think I understand what this is telling us.
>
> First, E means error.
>
> The presence of this line in the log means there has been an error on 
> can bus 2. The values given appear to be the current values of some 
> counters.
>
> The code is in can/src/can.cpp. This has basic deduplication by 
> summing most of the counters and errflags, and only logging if this 
> changes. Interestingly both of us saw can2 errors in pairs: one with 
> errflags=0x23401c01 and one with 0x22401c02. In my case these were 
> either 0 or 10 ms apart.
>
> The flags appear to derive from mcp2515/src/mcp2515.cpp but it's not 
> clear to me what they mean.
>
>> OVMS# can can2 status
>> CAN:       can2
>> Mode:      Active
>> Speed:     500000
>> DBC:       none
>> Interrupts:              291197
>> Rx pkt:                  293642
>> Rx ovrflw:                    0
>> Tx pkt:                       6
>> Tx delays:                    0
>> Tx ovrflw:                    0
>> Tx fails:                     0
>> Err flags: 0x01000001
>> Rx err:                       0
>> Tx err:                       0
>> Rx invalid:                   0
>> Wdg Resets:                   0
>> Wdg Timer:                    9 sec(s)
>> Err Resets:                   0
> Question: If the log tells us that can2 errors have occurred, why does 
> "can can2 status" report zero values for errors?
>
> Chris
>
>
> _______________________________________________
> OvmsDev mailing list
> OvmsDev at lists.openvehicles.com
> http://lists.openvehicles.com/mailman/listinfo/ovmsdev

-- 
Michael Balzer * Am Rahmen 5 * D-58313 Herdecke
Fon 02330 9104094 * Handy 0176 20698926

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openvehicles.com/pipermail/ovmsdev/attachments/20250123/0c18f665/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature.asc
Type: application/pgp-signature
Size: 203 bytes
Desc: OpenPGP digital signature
URL: <http://lists.openvehicles.com/pipermail/ovmsdev/attachments/20250123/0c18f665/attachment-0001.sig>


More information about the OvmsDev mailing list