Hi everyone,
I’ve been working on getting CAN communication running on my Jetson Orin Nano Super Developer Kit, and I’m stuck on an issue that I can’t seem to resolve. I’m trying to connect a Keya KY173 steering motor, which communicates over CAN, directly to the Jetson through a WaveShare SN65HVD230 CAN transceiver.
I followed NVIDIA’s official Control Area Network (CAN) setup guide for the Orin Nano. The setup seemed to go,I used the busybox devmem commands to configure the pinmux registers, loaded the mttcan driver, and brought up the interface with:
sudo ip link set can0 type can bitrate 250000
sudo ip link set can0 up
The loopback test works perfectly. When I run cansend and candump on the Jetson, I can send and receive frames locally, so the software side of SocketCAN seems fine.
The problem appears when I connect the actual hardware.
If I connect the motor directly to the Jetson’s transceiver (CAN_H, CAN_L, and common ground), and run candump can0, I don’t see any messages,not even heartbeat frames. The motor definitely transmits, because when I connect it back to my Windows laptop using the manufacturer’s USB-to-CAN adapter and their own configuration/debug software, everything works: I can control the motor, change modes, and see continuous feedback.
To dig deeper, I tried connecting all three devices, the Windows laptop, Jetson, and motor, in parallel on the same CAN bus. In that setup, the Windows tool still communicates perfectly with the motor, but the Jetson still sees nothing in candump. I also wrote a simple Python SocketCAN script to monitor frames; same result…silence.
I’ve triple-checked the baud rate (250 kbit/s) on both the motor and the Jetson, and ensured that the bus is properly powered and terminated. The WaveShare board is powered at 3.3 V from the Jetson, and the EN pin is tied high. Termination resistors are in place,120 Ω at both physical ends. Grounds are shared.
Here’s what puzzles me:
If loopback works, and the Windows setup proves that the motor and cabling are fine, then the issue must be either with the transceiver wiring/configuration, the Jetson’s pinmux, or possibly acknowledgment/timing on the bus. It feels like the Jetson’s CAN controller never actually sees the differential signal, or it’s in some passive or listen-only state.
Running ip -details -statistics link show can0 shows the interface as UP, but the RX counters never increase. The TX side increments if I send with cansend, but there are no RX errors, which makes me think the hardware is simply not detecting anything on the bus rather than receiving corrupted frames.
When I connect the USB-CAN dongle to the Jetson and test through that instead of the WaveShare transceiver, everything works,I can both send and receive frames. So I’m fairly sure the issue lies in how the built-in CAN interface and SN65HVD230 board are configured on the Orin Nano.
Has anyone successfully used the WaveShare SN65HVD230 with the Orin Nano Dev Kit?
Do I perhaps need to adjust the devmem addresses for the “Super” version of the developer kit, or is there something subtle about the pinmux that prevents external RX from working even though loopback passes? Any working example (register values or device tree overlay) would be extremely helpful.
Thanks in advance, I feel like I’m one step away from making this work, but missing a key hardware or pinmux detail.