This is an old revision of the document!
CAN interface
Example available on GitHub. Check liteboard CAN example.
|
CAN interface is a message-oriented multi-master serial communications protocol which efficiently supports distributed realtime control.
liteSOM contains two CAN modules compatible with |
Device Tree
can1: flexcan@02090000 { compatible = "fsl,imx6ul-flexcan", "fsl,imx6q-flexcan"; reg = <0x02090000 0x4000>; interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clks IMX6UL_CLK_CAN1_IPG>, <&clks IMX6UL_CLK_CAN1_SERIAL>; clock-names = "ipg", "per"; status = "disabled"; }; can2: flexcan@02094000 { compatible = "fsl,imx6ul-flexcan", "fsl,imx6q-flexcan"; reg = <0x02094000 0x4000>; interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>; clocks = <&clks IMX6UL_CLK_CAN2_IPG>, <&clks IMX6UL_CLK_CAN2_SERIAL>; clock-names = "ipg", "per"; status = "disabled"; }; |
Generic configuration for both
To enable -> Networking support -> CAN bus subsystem support -> CAN Device Drivers -> Platform CAN drivers with Netlink support -> Support for Freescale FLEXCAN based chips This option will activate FLEXCAN driver. Documentation for this driver you can find in fsl-flexcan.txt file. |
&iomuxc { pinctrl-names = "default"; pinctrl_flexcan1: flexcan1grp{ fsl,pins = < MX6UL_PAD_UART3_RTS_B__FLEXCAN1_RX 0x1b020 MX6UL_PAD_UART3_CTS_B__FLEXCAN1_TX 0x1b020 >; }; }; &can1 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_flexcan1>; status = "okay"; }; |
|
SocketCAN
Linux
supports CAN interface via SocketCAN.
SocketCAN
is defined on top of the network layer therefore it can be automatically configured via /etc/network/interfaces
file
auto can0 iface can0 inet manual pre-up /sbin/ip link set can0 type can bitrate 125000 up /sbin/ifconfig can0 up down /sbin/ifconfig can0 down
or configured in the runtime by the following commands:
ifconfig can0 down
- disabling CAN interface,ip link set can0 type can bitrate 250000
- changing CAN bus baudrate to 250kbps,ifconfig can0 up
- enabling CAN interface.
CAN bus info
SocketCAN
provides to the userspace various information about CAN bus.
SocketCAN version
# cat /proc/net/can/version rev 20120528 abi 9
CAN status
# ifconfig can0 can0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 UP RUNNING NOARP MTU:16 Metric:1 RX packets:1 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:1 overruns:0 carrier:1 collisions:0 txqueuelen:10 RX bytes:8 (8.0 B) TX bytes:0 (0.0 B) Interrupt:19
# ip -details link show can0 2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10 link/can promiscuity 0 can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0 bitrate 461538 sample-point 0.846 tq 166 prop-seg 5 phase-seg1 5 phase-seg2 2 sjw 1 flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1 clock 30000000
CAN statistics
# cat /proc/net/can/stats 2 transmitted frames (TXF) 1 received frames (RXF) 0 matched frames (RXMF) 0 % total match ratio (RXMR) 0 frames/s total tx rate (TXR) 0 frames/s total rx rate (RXR) 0 % current match ratio (CRXMR) 0 frames/s current tx rate (CTXR) 0 frames/s current rx rate (CRXR) 0 % max match ratio (MRXMR) 1 frames/s max tx rate (MTXR) 1 frames/s max rx rate (MRXR) 0 current receive list entries (CRCV) 0 maximum receive list entries (MRCV)
can-utils
Buildroot allows you to build various tools developed by can-utils project.
To compile can-utils
package please enable BR2_PACKAGE_CAN_UTILS
option located in
-> Target packages -> Networking applications -> can-utils
To read description about all implemented by can-utils
applications please read project README file.
Below you can find few examples with frequently used commands.
CAN sniffer
# candump -x can0 can0 TX - - 1000101F [0] can0 RX - - 10B05002 [8] 00 00 00 00 00 00 00 00 can0 RX - - 10B05001 [8] 00 00 00 00 00 00 00 00 can0 RX - - 10B05004 [8] 82 85 00 00 80 00 00 00 can0 RX - - 10B0F002 [8] 00 00 00 00 00 00 00 00 can0 RX - - 10B0F001 [8] 00 00 00 00 00 00 00 00 can0 RX - - 10B0F004 [8] 87 85 00 00 80 00 00 00 can0 RX - - 10B19002 [8] 00 00 00 00 00 00 00 00 can0 RX - - 10B19001 [8] 00 00 00 00 00 00 00 00 can0 RX - - 10B19004 [8] 8C 85 00 00 A3 00 00 00
CAN sender
To send 0 data frame to the node with address 1000101F
you can use following command
cansend can0 1000101F#
To send remote frame to the node with address 1000101F
you can use following command
cansend can0 1000101F#R
CAN bus load test
To test CAN bus load you can use following command
canbusload can0@125000 -r -t -b -c