Google Chat: zj734465502@gmail.com
+86-0755-88291180
sales01@spotpear.com
dragon_manager@163.com
services01@spotpear.com
manager01@spotpear.com
WhatsApp:13246739196
2-Channel Isolated CAN Bus Expansion HAT for Raspberry Pi, MCP2515 + SN65HVD230 Dual Chips Solution, Multi Onboard Protection Circuits
Introduction
This is a 2-Channel CAN bus expansion HAT designed for Raspberry Pi, supports CAN FD (CAN with Flexible Data-Rate), the speed is higher than the traditional 1Mbps of CAN2.0, features multi onboard protection circuits, high anti-interference capability, and stable operation. It suits for fields such as automotive devices or industrial automation.
PIN | Raspberry Pi (BCM) | Raspberry Pi (WPI) | Description |
5V | 5V | 5V | 5V Power input |
GND | GND | GND | Ground |
MISO | 9(MISO) | 13(MISO) | SPI clock input |
MOSI | 10(MOSI) | 12(MOSI) | SPI data input |
SCK | 11(SCLK) | 14(SCLK) | SPI data output |
CS_0 | 8(CE0) | 10(CE0) | CAN_0 chip select |
INT_0 | 25(Default)/24 | 6(Default)/5 | CAN_0 interrupt output |
CS_1 | 7(CE1) | 11(CE1) | CAN_1 chip select |
INT_1 | 23(Default)/22 | 4(Default)/3 | CAN_1 interrupt output |
CAN module could process packets transmit/receive on CAN bus. Packets transmit: first store packet to related buffer and control register. Use SPI interface to set the bits on control register or enable transmit pin for transmitting. Registers could be read for detecting communication states and errors. It will first check if there are any errors of packets detected on CAN bus, then verify it with filter which is defined by user. And store packet to one of buffers if it has no errors.
Raspberry Pi cannot support SPI bus, so this module use SPI interface and on board a receiver/transmitter for CAN communication.
Microchip Technology’s MCP2515 is a stand-alone Controller Area Network (CAN) controller that implements the CAN specification,version 2.0B. It is capable of transmitting and receiving both standard and extended data and remote frames. The MCP2515 has two acceptance masks and six acceptance filters that are used to filter out unwanted messages, thereby reducing the host MCUs overhead. The MCP2515 interfaces with microcontrollers (MCUs) via anindustry standard Serial Peripheral Interface (SPI), that is Raspberry Pi can communicate with MCP2515 via SPI interface without external driver. What we need todo is to enable the kernel driver on devices tree. For more details, please refer to datasheet.
SN65HVD230 from TEXAS INSTRUMENTS is a CAN transceiver, which is designed for high communication frequency, anti-jamming and high reliability CAN bus communication. SN65HVD230 provide three different modes of operation: highspeed, slope control and low-power modes. The operation mode can be controlled by Rs pin. Connect the Tx of CAN controller to SN65HVD230’s data input pin D, can transmit the data of CAN node to CAN network; And connect the RX of CAN controller to SN65HVD230’s data input pin R to receive data.
The working voltage level of Raspberry Pi is 3.3V, therefore we need to set the VIO of 2-CH CAN FD HAT to 3.3V as below:
Open terminal and run commands below to install bcm2835 library
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.60.tar.gz tar zxvf bcm2835-1.60.tar.gz cd bcm2835-1.60/ sudo ./configure sudo make sudo make check sudo make install # For More:http://www.airspayce.com/mikem/bcm2835/
sudo apt-get install wiringpi #When used on Raspberry Pi 4B, you may need to upgrade first: wget https://project-downloads.drogon.net/wiringpi-latest.deb sudo dpkg -i wiringpi-latest.deb gpio -v # Run the command "gpio -v". If the version 2.52 is displayed, the installation is successful
Install python library
#python2 sudo apt-get update sudo apt-get install python-pip sudo apt-get install python-pil sudo apt-get install python-numpy sudo pip install RPi.GPIO sudo pip install spidev sudo pip2 install python-can #python3 sudo apt-get update sudo apt-get install python3-pip sudo apt-get install python3-pil sudo apt-get install python3-numpy sudo pip3 install RPi.GPIO sudo pip3 install spidev sudo pip3 install python-can
Insert the module to Raspberry Pi, and then modify config.txt file:
sudo nano /boot/config.txt
Append these statements to the file:
dtparam=spi=on dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=23 dtoverlay=mcp2515-can1,oscillator=16000000,interrupt=25
sudo reboot
dmesg | grep spi
sudo ip link set can0 up type can bitrate 1000000 sudo ip link set can1 up type can bitrate 1000000 sudo ifconfig can0 txqueuelen 65536 sudo ifconfig can1 txqueuelen 65536
https://www.kernel.org/doc/Documentation/networking/can.txt
ifconfig
If there is only one 2-CH CAN HAT on hand, you can connect CAN0_H and CAN1_H and CAN0_L and CAN1_L of the module as shown in the following figure:
sudo apt-get install can-utils
One terminal input receives CAN0 data command:
candump can0
Another terminal input sends CAN1 data command:
cansend can1 000#11.22.33.44
If you have two 2-CH CAN HAT on hand, you can directly connect CAN_H and CAN_L two by two. The effect is the same as the above, pay attention to match the communication rate, identify the ID, and output the interface serial number.
sudo python reveive.py
sudo python send.py
【Note】 The CAN1 is used as sender, and CAN0 is used as receiver.
The demo codes provided is based on python, please check that if you installed the python-can library.
Before you send data, you should create a CAN device firstly,
os.system('sudo ip link set can0 type can bitrate 100000') os.system('sudo ifconfig can0 up')
This code is used to initialize CAN0 as receiver/sender. If you want to change it to CNA1, you can use this one:
os.system('sudo ip link set can1 type can bitrate 100000') os.system('sudo ifconfig can1 up')
can0 = can.interface.Bus(channel = 'can0', bustyp = 'socketcan_ctypes')
can0 = can.interface.Bus(channel = 'can1', bustyp = 'socketcan_ctypes')
msg = can.Message(arbitration_id=0x123, data=[0, 1, 2, 3, 4, 5, 6, 7], extended_id=False)
can0.send(msg)
can1.send(msg)
os.system('sudo ifconfig can0 down')
os.system('sudo ifconfig can1 down')
msg = can0.recv(10.0)
The variables of recv() function is the timeout of receving.
For more information, please refer to:https://python-can.readthedocs.io/en/stable/interfaces/socketcan.html
cd 2-CH_CAN_HAT_Code/wiringPi/receive/ make clean sudo make sudo ./can_receive
cd 2-CH_CAN_HAT_Code/ wiringPi/receive/ make clean sudo make sudo ./can_send