/Arduino-STM32-CAN

Can Example for Arduino Core STM32

Primary LanguageC

Arduino-STM32-CAN

Can communication example for Arduino Core STM32.

Hardware requirements

  • STM32F103 Development Board.
  • STM32F303 Development Board.
  • STM32F405 Development Board.
  • STM32F407 Development Board.
  • STM32F446 Development Board.
  • CAN Transceiver.
    MCP2551/2561(5V)
    TJA1040/1050/1055(5V)
    SN65HVD230/231/232(3.3V)

NOTE:3V CAN Trasnceviers are fully interoperable with 5V CAN trasnceviers.
Check here and here.

Software requirements

STM32 core support for Arduino.
https://github.com/stm32duino/Arduino_Core_STM32

Wirering

  • USB power supply (board with 5V pin)
    STM32F103-CAN-1

  • Board without 5V pin, such as BlackPill, or ST-Link power supply
    STM32F103-CAN-2

Transmitter

  • from STM32F103
    STM32F103_Send

  • from STM32F303
    STM32F303_Send

  • from STM32F407
    STM32F405_Send

Receiver

Serial printing goes to PA9.
STM32-Receive

Communication with Arduino-UNO

You can use this library.

Communication with Arduino-DUE

You can use this library. STM32F103-CAN-DUO

Communication with ESP8266

You can use this library. STM32F103-CAN-ESP8266

Communication with ESP32

ESP-IDE has a CAN Network example.
https://github.com/espressif/esp-idf/tree/master/examples/peripherals/can/can_network STM32F103-CAN-ESP32

Communication with Raspberry Pi

Edit /boot/config.txt and reboot.

dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi-bcm2835-overlay

Make sure the device is ready after reboot.

$ dmesg | grep mcp251x
[   19.992025] mcp251x spi0.0 can0: MCP2515 successfully initialized.

$ ls /sys/bus/spi/devices/spi0.0
driver  modalias  net  of_node  power  statistics  subsystem  uevent

$ ls /sys/bus/spi/devices/spi0.0/net
can0

$ sudo /sbin/ip link set can0 up type can bitrate 1000000

$ dmesg | grep can0
[   19.992025] mcp251x spi0.0 can0: MCP2515 successfully initialized.
[ 1309.525795] IPv6: ADDRCONF(NETDEV_CHANGE): can0: link becomes ready

$ sudo ifconfig can0
can0: flags=193<UP,RUNNING,NOARP>  mtu 16
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ sudo ifconfig can0 txqueuelen 1000

Install can-utils.

$ sudo apt-get install can-utils

#Receiver
$ candump can0

#Transmitter
$ cansend can0 123#11223344AABBCCDD

STM32F103-CAN-RPI

Troubleshooting

There is a module of SN65HVD230 like this.
The terminating resistance is 120 ohms.
SN65HVD230-1 SN65HVD230-2

A transmission error will occur.
SendFail

I have removed the terminating resistor.
And I used a external resistance of 150 ohms.
The error is fixed.
SN65HVD230-3