Hello,
We are currently attempting to communicate with an Ingenia EVE-XCR motor driver from a Verdin IMX8MM Q 2GB WBIT V1.1A on Dahlia V1.0C board using CANOpen. We have successfully communicated with the motor driver with cycle delay set to 50 milliseconds (20 Hz). However, we get transmission errors when the CAN cycle delay is set below 10 milliseconds (100 Hz). This behavior is identical when using a Verdin IMX8MM Q 2GB WBIT V1.0B on a custom development board.
Our timing loop is managed by Lely CANopen. This is the kernel error message printed at higher loop rates, which we believe is symptomatic of a low-level CAN hardware issue:
CAN frame successfully queued after dropping 1 frame
warning: CAN transmit queue full; dropping frame: Resource temporarily unavailable
CAN frame successfully queued after dropping 2 frames
warning: CAN transmit queue full; dropping frame: Resource temporarily unavailable
CAN frame successfully queued after dropping 1 frame
warning: CAN transmit queue full; dropping frame: Resource temporarily unavailable
CAN frame successfully queued after dropping 1 frame
warning: CAN transmit queue full; dropping frame: Resource temporarily unavailable
CAN frame successfully queued after dropping 1 frame
warning: CAN transmit queue full; dropping frame: Resource temporarily unavailable
During this error, CANdump produces the following output:
can0 080 [0]
can0 080 [0]
can0 080 [0]
can0 080 [0]
can0 080 [0]
can0 080 [0]
can0 080 [0]
can0 080 [0]
can0 080 [0]
can0 080 [0]
can0 080 [0]
can0 080 [0]
can0 080 [0]
can0 080 [0]
In this case, 080 is the sync message.
If the cycle delay is sufficiently high, no errors will be present and CANdump will show the following output:
can0 1A0 [1] 0A
can0 2A0 [4] 50 42 F0 FF
can0 3A0 [6] 50 42 00 00 00 00
can0 320 [4] 0F 00 00 00
can0 080 [0]
can0 1A0 [1] 0A
can0 2A0 [4] 50 42 03 00
can0 3A0 [6] 50 42 00 00 00 00
can0 320 [4] 0F 00 00 00
can0 080 [0]
can0 1A0 [1] 0A
can0 2A0 [4] 50 42 FF FF
can0 3A0 [6] 50 42 00 00 00 00
can0 320 [4] 0F 00 00 00
We found that the minimum cycle delay before failure increases based on how much information we try to send to the motor driver. The highest minimum delay we found was 100,000 microseconds running all desired tasks, and the lowest minimum delay we found was 2,000 microseconds when sending no information. Note that the motor driver will always send some data to the verdin (the data shown in the error free candump). Our CANOPEN implementation sends messages in a synchronous manner; every 1 millisecond 8 messages are sent in a burst between the verdin and our motordrive over the CAN bus.
The main program is running inside a docker container on the Verdin.
Our system is as follows:
SOM:
Verdin IMX8MM Q 2GB WB IT, V1.1A
Carrier board:
Dahlia V1.0C
Motor Driver:
Ingenia EVE-XCR
CAN protocol:
CANOpen
CAN library:
Lely CANOpen in C++
OS:
5.4.115-rt57-5.3.0-devel
Running:
Docker containers
Device tree:
Imx8mm-verdin-wifi-dev.dts on Toradex Kernel 5.3 - branch: toradex_5.4-2.3.x-imx