CAN

From Wiki at Neela Nurseries
Revision as of 13:39, 19 September 2025 by Ted (talk | contribs) (Zephyr CAN default bitrate symbol)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Controller Area Network (CAN) developed and first released by Bosch in 1973.

2025-09-09

Basic CAN frames versus Canopennode frames . . .

2025-09-14

Masters thesis by William Fornaciari . . .

Supported Boards

Zephyr 3.7.0 supported STMicro boards with CAN controllers:

ted@localhost:~/projects/zephyr-project/zephyr/boards/st$ grep -nr can ./* | grep '&' | grep can
grep: ./nucleo_f030r8/doc/img/nucleo_f030r8.jpg: binary file matches
grep: ./nucleo_f070rb/doc/img/nucleo_f070rb.jpg: binary file matches
grep: ./nucleo_f091rc/doc/img/nucleo_f091rc.jpg: binary file matches
grep: ./nucleo_f103rb/doc/img/nucleo_f103rb.jpg: binary file matches
grep: ./nucleo_f207zg/doc/img/nucleo_f207zg_zio_left.jpg: binary file matches
./nucleo_f091rc/nucleo_f091rc.dts:23:		zephyr,canbus = &can1;
./nucleo_f091rc/nucleo_f091rc.dts:116:&can1 {
./nucleo_f091rc/nucleo_f091rc.dts:117:	pinctrl-0 = <&can_rx_pa11 &can_tx_pa12>;
./nucleo_f303re/nucleo_f303re.dts:23:		zephyr,canbus = &can1;
./nucleo_f303re/nucleo_f303re.dts:96:&can1 {
./nucleo_f303re/nucleo_f303re.dts:97:	pinctrl-0 = <&can_rx_pb8 &can_tx_pb9>;
./nucleo_f446re/nucleo_f446re.dts:23:		zephyr,canbus = &can2;
./nucleo_f446re/nucleo_f446re.dts:146:&can1 {
./nucleo_f446re/nucleo_f446re.dts:148:	pinctrl-0 = <&can1_rx_pb8 &can1_tx_pb9>;
./nucleo_f446re/nucleo_f446re.dts:153:&can2 {
./nucleo_f446re/nucleo_f446re.dts:154:	pinctrl-0 = <&can2_rx_pb12 &can2_tx_pb13>;
./nucleo_f446ze/nucleo_f446ze.dts:22:		zephyr,canbus = &can1;
./nucleo_f446ze/nucleo_f446ze.dts:180:&can1 {
./nucleo_f446ze/nucleo_f446ze.dts:181:	pinctrl-0 = <&can1_rx_pd0 &can1_tx_pd1>;
./nucleo_f722ze/nucleo_f722ze.dts:24:		zephyr,canbus = &can1;
./nucleo_f722ze/nucleo_f722ze.dts:123:&can1 {
./nucleo_f722ze/nucleo_f722ze.dts:124:	pinctrl-0 = <&can1_rx_pd0 &can1_tx_pd1>;
./nucleo_f746zg/nucleo_f746zg.dts:30:		zephyr,canbus = &can1;
./nucleo_f746zg/nucleo_f746zg.dts:166:&can1 {
./nucleo_f746zg/nucleo_f746zg.dts:167:	pinctrl-0 = <&can1_rx_pd0 &can1_tx_pd1>;
./nucleo_f767zi/nucleo_f767zi.dts:31:		zephyr,canbus = &can1;
./nucleo_f767zi/nucleo_f767zi.dts:165:&can1 {
./nucleo_f767zi/nucleo_f767zi.dts:166:	pinctrl-0 = <&can1_rx_pd0 &can1_tx_pd1>;
./nucleo_g0b1re/nucleo_g0b1re.dts:25:		zephyr,canbus = &fdcan1;
./nucleo_g0Zephyr 3.7.0 supported STMicro boards with CAN controllersb1re/nucleo_g0b1re.dts:181:&fdcan1 {
./nucleo_g0b1re/nucleo_g0b1re.dts:184:	pinctrl-0 = <&fdcan1_rx_pa11 &fdcan1_tx_pa12>;
./nucleo_g0b1re/nucleo_g0b1re.dts:189:&fdcan2 {
./nucleo_g0b1re/nucleo_g0b1re.dts:192:	pinctrl-0 = <&fdcan2_rx_pb0 &fdcan2_tx_pb1>;
./nucleo_g474re/nucleo_g474re.dts:22:		zephyr,canbus = &fdcan1;
./nucleo_g474re/nucleo_g474re.dts:221:&fdcan1 {
./nucleo_g474re/nucleo_g474re.dts:224:	pinctrl-0 = <&fdcan1_rx_pa11 &fdcan1_tx_pa12>;
./nucleo_h563zi/nucleo_h563zi-common.dtsi:155:&fdcan1 {
./nucleo_h563zi/nucleo_h563zi-common.dtsi:156:	pinctrl-0 = <&fdcan1_rx_pd0 &fdcan1_tx_pd1>;
./nucleo_h563zi/nucleo_h563zi.dts:25:		zephyr,canbus = &fdcan1;
./nucleo_h743zi/nucleo_h743zi.dts:24:		zephyr,canbus = &fdcan1;
./nucleo_h743zi/nucleo_h743zi.dts:180:&fdcan1 {
./nucleo_h743zi/nucleo_h743zi.dts:181:	pinctrl-0 = <&fdcan1_rx_pd0 &fdcan1_tx_pd1>;
./nucleo_h753zi/nucleo_h753zi.dts:24:		zephyr,canbus = &fdcan1;
./nucleo_h753zi/nucleo_h753zi.dts:159:&fdcan1 {
./nucleo_h753zi/nucleo_h753zi.dts:162:	pinctrl-0 = <&fdcan1_rx_pd0 &fdcan1_tx_pd1>;
./nucleo_l432kc/nucleo_l432kc.dts:20:		zephyr,canbus = &can1;
./nucleo_l432kc/nucleo_l432kc.dts:99:&can1 {
./nucleo_l432kc/nucleo_l432kc.dts:100:	pinctrl-0 = <&can1_rx_pa11 &can1_tx_pa12>;
./nucleo_l433rc_p/nucleo_l433rc_p.dts:22:		zephyr,canbus = &can1;
./nucleo_l433rc_p/nucleo_l433rc_p.dts:118:&can1 {
./nucleo_l433rc_p/nucleo_l433rc_p.dts:119:	pinctrl-0 = <&can1_rx_pa11 &can1_tx_pa12>;
./nucleo_l452re/nucleo_l452re_common.dtsi:22:		zephyr,canbus = &can1;
./nucleo_l452re/nucleo_l452re_common.dtsi:102:&can1 {
./nucleo_l452re/nucleo_l452re_common.dtsi:103:	pinctrl-0 = <&can1_rx_pa11 &can1_tx_pa12>;
./nucleo_u575zi_q/nucleo_u575zi_q.dts:22:		zephyr,canbus = &fdcan1;
./nucleo_u575zi_q/nucleo_u575zi_q-common.dtsi:181:&fdcan1 {
./nucleo_u575zi_q/nucleo_u575zi_q-common.dtsi:184:	pinctrl-0 = <&fdcan1_rx_pd0 &fdcan1_tx_pd1>;
./nucleo_u5a5zj_q/nucleo_u5a5zj_q-common.dtsi:173:&fdcan1 {
./nucleo_u5a5zj_q/nucleo_u5a5zj_q-common.dtsi:176:	pinctrl-0 = <&fdcan1_rx_pd0 &fdcan1_tx_pd1>;
./nucleo_u5a5zj_q/nucleo_u5a5zj_q.dts:22:		zephyr,canbus = &fdcan1;
./stm32f072b_disco/stm32f072b_disco.dts:21:		zephyr,canbus = &can1;
./stm32f072b_disco/stm32f072b_disco.dts:118:&can1 {
./stm32f072b_disco/stm32f072b_disco.dts:119:	pinctrl-0 = <&can_rx_pb8 &can_tx_pb9>;
./stm32f3_disco/stm32f3_disco.dts:21:		zephyr,canbus = &can1;
./stm32f3_disco/stm32f3_disco.dts:184:&can1 {
./stm32f3_disco/stm32f3_disco.dts:185:	pinctrl-0 = <&can_rx_pd0 &can_tx_pd1>;
./stm32f4_disco/stm32f4_disco.dts:22:		zephyr,canbus = &can2;
./stm32f4_disco/stm32f4_disco.dts:129:&can1 {
./stm32f4_disco/stm32f4_disco.dts:130:	pinctrl-0 = <&can1_rx_pb8 &can1_tx_pb9>;
./stm32f4_disco/stm32f4_disco.dts:135:&can2 {
./stm32f4_disco/stm32f4_disco.dts:136:	pinctrl-0 = <&can2_rx_pb5 &can2_tx_pb13>;
./stm32h573i_dk/stm32h573i_dk.dts:24:		zephyr,canbus = &fdcan1;
./stm32h573i_dk/stm32h573i_dk.dts:253:&fdcan1 {
./stm32h573i_dk/stm32h573i_dk.dts:256:	pinctrl-0 = <&fdcan1_rx_pa11 &fdcan1_tx_pa12>;
./stm32h735g_disco/stm32h735g_disco.dts:22:		zephyr,canbus = &fdcan1;
./stm32h735g_disco/stm32h735g_disco.dts:213:&fdcan1 {
./stm32h735g_disco/stm32h735g_disco.dts:214:	pinctrl-0 = <&fdcan1_rx_ph14 &fdcan1_tx_ph13>;
./stm32h735g_disco/stm32h735g_disco.dts:225:&fdcan2 {
./stm32h735g_disco/stm32h735g_disco.dts:226:	pinctrl-0 = <&fdcan2_rx_pb5 &fdcan2_tx_pb6>;
./stm32h735g_disco/stm32h735g_disco.dts:237:&fdcan3 {
./stm32h735g_disco/stm32h735g_disco.dts:238:	pinctrl-0 = <&fdcan3_rx_pf6 &fdcan3_tx_pf7>;
./stm32h745i_disco/stm32h745i_disco_stm32h745xx_m7.dts:24:		zephyr,canbus = &fdcan1;
./stm32h745i_disco/stm32h745i_disco_stm32h745xx_m7.dts:220:&fdcan1 {
./stm32h745i_disco/stm32h745i_disco_stm32h745xx_m7.dts:222:	pinctrl-0 = <&fdcan1_tx_ph13 &fdcan1_rx_ph14>;
./stm32h745i_disco/stm32h745i_disco_stm32h745xx_m7.dts:234:&fdcan2 {
./stm32h745i_disco/stm32h745i_disco_stm32h745xx_m7.dts:236:	pinctrl-0 = <&fdcan2_tx_pb13 &fdcan2_rx_pb5>;
./stm32h7b3i_dk/stm32h7b3i_dk.dts:24:		zephyr,canbus = &fdcan1;

CAN default bit rate from Zephyr 3.7.0 menuconfig:

Name: CAN_DEFAULT_BITRATE
Prompt: Default CAN bitrate
Type: int
Value: 125000

Help:

  Default initial CAN bitrate in bits/s. This can be overridden per CAN controller using the
  "bitrate" devicetree property.

Direct dependencies (=y):
     CAN(=y)

Default:
  - 125000

Kconfig definition, with parent deps. propagated to 'depends on'
================================================================

At drivers/can/Kconfig:26
Included via /home/ted/projects/zephyr-project/psas-ers-board-bringup/samples/can/counter/Kconfig:15 -> Kconfig.zephyr:48 -> drivers/Kconfig:15
Menu path: (Top) -> Device Drivers -> Controller Area Network (CAN) drivers

  config CAN_DEFAULT_BITRATE
        int "Default CAN bitrate"
        default 125000
        depends on CAN(=y)
        help
          Default initial CAN bitrate in bits/s. This can be overridden per CAN controller using the
          "bitrate" devicetree property.

Example Projects and Code

Vulcan Boards

Getting started sending and receiving bytes using Vulcan USB adapter and Python script: