I’m
trying to recreate this with my
three-can-buses-connected DB9 plugged
in. Transmitting on CAN1 should make
it appear on CAN2 and CAN3.
Here is what I see:
OVMS#
can can1 start active
1000000
Can
bus can1 started in mode
active at speed 1000000bps
OVMS#
can can2 start active
1000000
Can
bus can2 started in mode
active at speed 1000000bps
OVMS#
test cantx can1 25000
Testing
25000 frames on can1
Transmitted
25000 frames in 6.466209s =
258us/frame
OVMS#
can can1 status
CAN:
can1
Mode:
Active
Speed:
1000000
Interrupts:
24771
Rx
pkt: 0
Rx
err: 0
Rx
ovrflw: 0
Tx
pkt: 24880
Tx
delays: 24703
Tx
err: 0
Tx
ovrflw: 109
Err
flags: 0
OVMS#
can can2 status
CAN:
can2
Mode:
Active
Speed:
1000000
Interrupts:
19084
Rx
pkt: 24770
Rx
err: 0
Rx
ovrflw: 1
Tx
pkt: 0
Tx
delays: 0
Tx
err: 0
Tx
ovrflw: 0
Err
flags: 0x2040
Note the err flags
0x2040 on CAN2, but the bus
remains up and working fine.
Repeating the test
gives us:
OVMS#
test cantx can1 25000
Testing
25000 frames on can1
Transmitted
25000 frames in 6.479670s
= 259us/frame
OVMS#
can can1 status
CAN:
can1
Mode:
Active
Speed:
1000000
Interrupts:
49546
Rx
pkt:
0
Rx
err:
0
Rx
ovrflw:
0
Tx
pkt:
49771
Tx
delays:
49417
Tx
err:
0
Tx
ovrflw:
207
Err
flags: 0
OVMS#
can can2 status
CAN:
can2
Mode:
Active
Speed:
1000000
Interrupts:
38288
Rx
pkt:
49545
Rx
err:
0
Rx
ovrflw:
3
Tx
pkt:
0
Tx
delays:
0
Tx
err:
0
Tx
ovrflw:
0
Err
flags: 0x2040
Looking at the mcp2515
code, it seems that Err flags are
only stored "if (intstat &
0b10100000)”. That is "ERRF 0x80 =
message tx/rx error” or "ERRIF
0x20 = overflow / error state
change”. It is also set to
"(intstat & 0b10100000)
<< 8 | errflag”, so doesn’t
show all the error statuses. It is
hard to rely on that for other
errors/status on lock-up. Given
that error_flags is a uint32_t, I
think we can store more in it to
allow for better diagnosis.
I changed the mcp2515
driver to always set error_flags,
on each interrupt handled (except
spurious interrupts with no flags
found), as follows:
SSSSSSSSFFFFFFFF***EB01TLLLLLLLL
- SSSSSSSS = intstat
- FFFFFFFF = errflag
- B = RXB0 or RXB1
overflow flags cleared
- 0 = RXB0
overflowed
- 1 = RXB1
overflowed
- T = TX buffer has
become available
- E = Error/WakeUp
flags were cleared
- LLLLLLLL = intflag
I did find a problem
on line 300: if (intstat &
0b10100000). It think that should
be 0b11100000 (to also pickup the
RXB0 overflow), and removed
the m_status.rxbuf_overflow++ from
RXB0 overflow (as it is not really
an overflow - as RXB1 got the
data).
With those changes
made, I get:
OVMS#
test cantx can1 25000
Testing 25000 frames on
can1
Transmitted 25000 frames
in 6.389849s = 255us/frame
OVMS# can can1 status
CAN: can1
Mode: Active
Speed: 1000000
Interrupts:
24777
Rx pkt:
0
Rx err:
0
Rx ovrflw:
0
Tx pkt:
24884
Tx delays:
24739
Tx err:
0
Tx ovrflw:
116
Err flags: 0x00000000
OVMS# can can2 status
CAN: can2
Mode: Active
Speed: 1000000
Interrupts:
18935
Rx pkt:
24777
Rx err:
0
Rx ovrflw:
0
Tx pkt:
0
Tx delays:
0
Tx err:
0
Tx ovrflw:
0
Err flags: 0x01000001
I don’t think I’ve
fixed anything (apart from that
minor issue with RXB0 overflow
diagnostics), but hopefully the
new error_flags display should
help finding out what is causing
this lockup. Hopefully I haven’t
broken anything.
Regards, Mark.
On 07/07/18
00:05, Mark Webb-Johnson
wrote:
Err
flags 0x2040. The 0x20
part is the error
interrupt. The 0x40 part
is "RX0OVR: Receive Buffer
0 Overflow Flag bit”.
Where the number on ‘can
can2 status’ moving at
all? Or completely stuck?
None of the can can2 status
numbers change when the can
bus is broken. After power
cycling it they move.
Seems
different than the fault
Greg and I are seeing.
This one likely to be
interrupt flag, or buffer
overflow, not being
cleared correctly. I’m
guessing the overflow
because that just doesn’t
seem correct in
mcp2515::RxCallback().
I’ll focus on that and
have a look.
I just checked the car again
and it stopped with Rx
ovrflw number only 1281,
half what it got to last
time.
_______________________________________________
OvmsDev mailing list
OvmsDev@lists.openvehicles.com
http://lists.openvehicles.com/mailman/listinfo/ovmsdev
OvmsDev mailing list