Error Flags and bus off on SocketCAN
Posted: Wed 18. Nov 2015, 14:22
Hello Folks,
my question is about the CAN error flags - which ones are created and how are they transferred to the application when using the PEAK PCAN SocketCAN driver on Linux.
I am using the PCAN-USB Device with socketcan on Linux Kernel 3.18.11 with device Firmware Version 02.8.01. My network contains only two nodes (each PCAN-USB) at 250kBits with two times 120Ohm Termination at the ends. I am running the CANopen protocol on the bus. Node A is the linux device, Node B is connected to Windows and uses PCAN-View just for having a seccond node.
Node A cyclic sends a heartbeat at 250ms interval. Node B is enabled (sends ACK) and error active but only listens to the bus. Now I unplug the CAN cable directly at the interface of Node A.
My application continues to send frames to the SocketCAN interface until I get the following message:
When I reconnect the bus, the SocketCAN continues to send, and will send the frames in the buffer first.
Using a patched version of candump (see http://git.pengutronix.de/?p=tools/canu ... f2df1618e6 ) I can visualize the error frames from SocketCAN (!= CAN Error Frames) on terminal. I observe:
Applying the CAN_ERR_MASK (see can.h) to the can_id we get Error Type: CAN_ERR_CRTL
Controller Status [byte 1] (see error.h) is: CAN_ERR_CRTL_RX_PASSIVE, CAN_ERR_CRTL_TX_PASSIVE, CAN_ERR_CRTL_RX_WARNING, CAN_ERR_CRTL_TX_WARNING
The following questions arise:
Greetings, Martin
my question is about the CAN error flags - which ones are created and how are they transferred to the application when using the PEAK PCAN SocketCAN driver on Linux.
I am using the PCAN-USB Device with socketcan on Linux Kernel 3.18.11 with device Firmware Version 02.8.01. My network contains only two nodes (each PCAN-USB) at 250kBits with two times 120Ohm Termination at the ends. I am running the CANopen protocol on the bus. Node A is the linux device, Node B is connected to Windows and uses PCAN-View just for having a seccond node.
Node A cyclic sends a heartbeat at 250ms interval. Node B is enabled (sends ACK) and error active but only listens to the bus. Now I unplug the CAN cable directly at the interface of Node A.
My application continues to send frames to the SocketCAN interface until I get the following message:
Code: Select all
root@device:~ cansend can0 "my_frame"
write: No buffer space available
Using a patched version of candump (see http://git.pengutronix.de/?p=tools/canu ... f2df1618e6 ) I can visualize the error frames from SocketCAN (!= CAN Error Frames) on terminal. I observe:
Code: Select all
root@device: candump can0 --error
interface = can0, family = 29, type = 3, proto = 1
// Normal Operation
<0x710> [1] 7f
// Unplug CAN Cable
<0x710> [1] 7f
<0x004> [8] 00 0c 00 00 00 00 00 00
<0x710> [1] 7f
<0x004> [8] 00 30 00 00 00 00 00 00
<0x710> [1] 7f
[...]
<0x710> [1] 7f
<0x004> [8] 00 30 00 00 00 00 00 00
<0x710> [1] 7f
[...]
// Repeats until SocketCAN "No buffer space available"
// Then silence
// Plug in CAN again
<0x710> [1] 7f // repeatedly as the buffer contains a bunch of them
<0x004> [8] 00 0c 00 00 00 00 00 00
<0x710> [1] 7f // normal operation
Controller Status [byte 1] (see error.h) is: CAN_ERR_CRTL_RX_PASSIVE, CAN_ERR_CRTL_TX_PASSIVE, CAN_ERR_CRTL_RX_WARNING, CAN_ERR_CRTL_TX_WARNING
The following questions arise:
- 1) I can observe the transitions Error Active -> Error Warning --> Error Passive? Why don't we transit to CAN_ERR_BUSOFF?
2) When reconnecting we return to Error Warning. Why is there no error frame for return to Error Active (flag is cleared)?
3) How can I dump the buffer of the SocketCAN to avoid sending these old messages? And when shall I do it? I would execute the dump when busoff happens, but if it doesn't happen what trigger could I use?

Greetings, Martin