“2-CH CAN FD HAT”的版本间的差异
Waveshare-admin(讨论 | 贡献) (→代码分析) |
(→固定设备号) |
||
(未显示3个用户的33个中间版本) | |||
第1行: | 第1行: | ||
− | <div class="wiki-pages | + | <div class="wiki-pages blue-color"> |
<div class="tabberlive newwsnav" id="wsnavbar"> | <div class="tabberlive newwsnav" id="wsnavbar"> | ||
<ul class="tabbernav"> | <ul class="tabbernav"> | ||
第33行: | 第33行: | ||
#默认配置支持官方驱动,驱动安装操作更简单;同时预留配置电阻以支持老版本驱动(老版本使用第三方驱动),实现完全兼容老版本<br/> | #默认配置支持官方驱动,驱动安装操作更简单;同时预留配置电阻以支持老版本驱动(老版本使用第三方驱动),实现完全兼容老版本<br/> | ||
'''新版本使用只有驱动安装方式不同,详细见‘驱动安装’章节'''<br/></font> | '''新版本使用只有驱动安装方式不同,详细见‘驱动安装’章节'''<br/></font> | ||
− | + | *新版本仅支持内核版本为5.4.77及之后的系统 | |
− | |||
− | |||
− | |||
− | |||
− | * | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==产品参数== | ==产品参数== | ||
第57行: | 第44行: | ||
==接口说明== | ==接口说明== | ||
− | {|border=1; style="width:900px;" | + | {| border="1;" style="width:900px;" |
− | |-style="background:#00ff00; color:gary;" align="center" | + | |- style="background:#00ff00; color:gary;" align="center" |
− | |'''功能引脚''' | + | | '''功能引脚''' |
− | |- | + | | '''树莓派接口'''<br/>(BCM) |
− | |5V | + | | '''树莓派接口'''<br/>(WPI) |
− | |-align="center" | + | | '''描述''' |
− | |GND | + | |- align="center" |
− | |-align="center" | + | | 5V |
− | |MISO_0 | + | | 5V |
− | |-align="center" | + | | 5V |
− | |MOSI_0 | + | | 5V电源正 |
− | |-align="center" | + | |- align="center" |
− | |SCK_0 | + | | GND |
− | |-align="center" | + | | GND |
− | |CS_0 | + | | GND |
− | |-align="center" | + | | 电源地 |
− | |INT_0 | + | |- align="center" |
− | |-align="center" | + | | MISO_0 |
− | |MISO_1| | + | | 9(MISO) |
− | |-align="center" | + | | 13(MISO) |
− | |MOSI_1| | + | | SPI_0数据输出 |
− | |-align="center" | + | |- align="center" |
− | |SCK_1| | + | | MOSI_0 |
− | |-align="center" | + | | 10(MOSI) |
− | |CS_1| | + | | 12(MOSI) |
− | |-align="center" | + | | SPI_0数据输入 |
− | |INT_1| | + | |- align="center" |
+ | | SCK_0 | ||
+ | | 11(SCLK) | ||
+ | | 14(SCLK) | ||
+ | | SPI_0时钟输入 | ||
+ | |- align="center" | ||
+ | | CS_0 | ||
+ | | 8(CE0)/7(CE1) | ||
+ | | 10(CE0)/11(CE1) | ||
+ | | CAN_0片选 | ||
+ | |- align="center" | ||
+ | | INT_0 | ||
+ | | 25/13 | ||
+ | | 6/23 | ||
+ | | CAN_0中断输出 | ||
+ | |- align="center" | ||
+ | | MISO_1 | ||
+ | | 19(MISO)/9 | ||
+ | | 24(MISO)/<span style="text-align: -webkit-center;">13</span> | ||
+ | | SPI_1数据输出 | ||
+ | |- align="center" | ||
+ | | MOSI_1 | ||
+ | | 20(MOSI)/<span style="text-align: -webkit-center;">10</span> | ||
+ | | 28(MOSI)/<span style="text-align: -webkit-center;">12</span> | ||
+ | | SPI_1数据输入 | ||
+ | |- align="center" | ||
+ | | SCK_1 | ||
+ | | 21(SCLK)/<span style="text-align: -webkit-center;">11</span> | ||
+ | | 29(SCLK)/<span style="text-align: -webkit-center;">14</span> | ||
+ | | SPI_1时钟输入 | ||
+ | |- align="center" | ||
+ | | CS_1 | ||
+ | | 18(SPI1_CE0)/17/16/26 | ||
+ | | 1/0/27/25 | ||
+ | | CAN_1片选 | ||
+ | |- align="center" | ||
+ | | INT_1 | ||
+ | | 24/23/22/16 | ||
+ | | 5/4/3/27 | ||
+ | | CAN_1中断输出 | ||
|} | |} | ||
+ | |||
+ | [[File:2-CH-CAN-FD-HAT-details-inter.jpg]] | ||
==总线说明== | ==总线说明== | ||
第91行: | 第119行: | ||
MCP2518FD是Microchip公司生产的一款CAN FD(灵活数据速率)控制器,完全支持经典格式(CAN2.0)和CAN灵活数据速率(CAN FD)格式的CAN成帧。仲裁比特率高达1Mbps,数据波特率也突破传统CAN2.0的1Mbps限制,SPI时钟速度高达20MHz符合ISO11898-1:2015标准。该器件能发送和接收标准和扩展数据帧以及远程帧。 MCP2518FD 自带的32个灵活的滤波器和屏蔽对象可以过滤掉不想要的报文,因此减少了主单片机(MCU)的开销。MCU通过SPI接口与该器件连接,即树莓派通过SPI接口连接芯片,对于树莓派使用该芯片,可以通过已编写好的设备树文件来驱动该器件,更多详细请参考数据手册。<br /> | MCP2518FD是Microchip公司生产的一款CAN FD(灵活数据速率)控制器,完全支持经典格式(CAN2.0)和CAN灵活数据速率(CAN FD)格式的CAN成帧。仲裁比特率高达1Mbps,数据波特率也突破传统CAN2.0的1Mbps限制,SPI时钟速度高达20MHz符合ISO11898-1:2015标准。该器件能发送和接收标准和扩展数据帧以及远程帧。 MCP2518FD 自带的32个灵活的滤波器和屏蔽对象可以过滤掉不想要的报文,因此减少了主单片机(MCU)的开销。MCU通过SPI接口与该器件连接,即树莓派通过SPI接口连接芯片,对于树莓派使用该芯片,可以通过已编写好的设备树文件来驱动该器件,更多详细请参考数据手册。<br /> | ||
[[File:hardware station.png|450px]]<br /> | [[File:hardware station.png|450px]]<br /> | ||
− | |||
− | |||
</div> | </div> | ||
第100行: | 第126行: | ||
==硬件连接== | ==硬件连接== | ||
接入树莓派使用时,必须加上增高座,然后排针穿过底板,效果如下:<br /> | 接入树莓派使用时,必须加上增高座,然后排针穿过底板,效果如下:<br /> | ||
+ | {{Note|注意:扩展板的排座是是无铅贴片工艺焊锡的,插拔排座的时候,尽量借助工具撬开排座,注意需要两侧均匀晃动撬动插拔;如果是用手作用直接作用在pcba上去掰动的话,因为排座和排针连接处数量多,总体插上去后还是很牢固,这样作业插拔很容易导致pcba和排座部分直接脱离虚焊的。|error}} | ||
[[File:2-CH-CAN-FD-HAT-hardware-connnected.png]] | [[File:2-CH-CAN-FD-HAT-hardware-connnected.png]] | ||
第121行: | 第148行: | ||
==函数库安装== | ==函数库安装== | ||
+ | <!-- | ||
*安装BCM2835, 打开树莓派终端,并运行以下指令 | *安装BCM2835, 打开树莓派终端,并运行以下指令 | ||
<pre> | <pre> | ||
第141行: | 第169行: | ||
# 运行gpio -v会出现2.52版本,如果没有出现说明安装出错 | # 运行gpio -v会出现2.52版本,如果没有出现说明安装出错 | ||
</pre> | </pre> | ||
+ | --> | ||
+ | |||
*安装Python函数库 | *安装Python函数库 | ||
<pre> | <pre> | ||
第170行: | 第200行: | ||
sudo ip link set can0 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on | sudo ip link set can0 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on | ||
sudo ip link set can1 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on | sudo ip link set can1 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on | ||
− | |||
− | |||
</pre> | </pre> | ||
− | '''bitrate xxxxxx (bps) dbitrate xxxxxx (bps)<br />''' | + | '''bitrate xxxxxx (bps):仲裁比特率<br />dbitrate xxxxxx (bps):数据比特率<br />相关比特率的设置参考示例,如下<br />''' |
+ | [[File:2-CH-CAN-FD-HAT-sample-cmd.png]] | ||
+ | |||
+ | '''如果接收不到其他设备发送的 CAN FD 帧数据,可以尝试在命令最后追加 sample-point .8 dsample-point .8,注意:采样点设置(.8)需要和发送端相同<br />''' | ||
+ | |||
*可配置成以下模式: | *可配置成以下模式: | ||
[ loopback { on | off } ]<br /> | [ loopback { on | off } ]<br /> | ||
第193行: | 第225行: | ||
'''更多相关CAN内核指令可以查看:<br /> | '''更多相关CAN内核指令可以查看:<br /> | ||
https://www.kernel.org/doc/Documentation/networking/can.txt'''<br /> | https://www.kernel.org/doc/Documentation/networking/can.txt'''<br /> | ||
+ | *配置缓冲区 | ||
+ | <pre> | ||
+ | sudo ifconfig can0 txqueuelen 65536 | ||
+ | sudo ifconfig can1 txqueuelen 65536 | ||
+ | </pre> | ||
*查看ifconfig: | *查看ifconfig: | ||
<pre> | <pre> | ||
第198行: | 第235行: | ||
</pre> | </pre> | ||
[[File:pre-work5.png|800px]]<br /> | [[File:pre-work5.png|800px]]<br /> | ||
+ | |||
+ | ==CAN测试== | ||
*开始测试: | *开始测试: | ||
若手上只有一个2-CH CAN FD HAT,可以将可通过将模块的CAN0_H与CAN1_H,CAN0_L与CAN1_L相连,如下图所示:<br /> | 若手上只有一个2-CH CAN FD HAT,可以将可通过将模块的CAN0_H与CAN1_H,CAN0_L与CAN1_L相连,如下图所示:<br /> | ||
第213行: | 第252行: | ||
</pre> | </pre> | ||
*演示效果如下:(左边为接收,右边为发送) | *演示效果如下:(左边为接收,右边为发送) | ||
− | [[File:test-2.png|900px]]<br /> | + | [[File:CAN-FD-test-88.png]] |
+ | <!--[[File:test-2.png|900px]]<br />--> | ||
若手上有两个2-CH CAN FD HAT,可以直接将CAN_H,CAN_L两两相连。效果跟上述一样,需注意匹配好通信速率,识别ID,输出接口序号。<br /> | 若手上有两个2-CH CAN FD HAT,可以直接将CAN_H,CAN_L两两相连。效果跟上述一样,需注意匹配好通信速率,识别ID,输出接口序号。<br /> | ||
第221行: | 第261行: | ||
sudo nano /etc/udev/rules.d/80-can.rules | sudo nano /etc/udev/rules.d/80-can.rules | ||
*将下面的内容添加到文件中:<br/> | *将下面的内容添加到文件中:<br/> | ||
− | |||
− | |||
− | |||
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi0.0/net/can?", NAME="can0" | ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi0.0/net/can?", NAME="can0" | ||
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi0.1/net/can?", NAME="can1" | ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi0.1/net/can?", NAME="can1" | ||
第229行: | 第266行: | ||
*如果是堆叠使用可以根据自己需求添加相应的命令,只需要修改 DEVPATH 和 NAME,例如将 spi1-1 命名为 can3:<br/> | *如果是堆叠使用可以根据自己需求添加相应的命令,只需要修改 DEVPATH 和 NAME,例如将 spi1-1 命名为 can3:<br/> | ||
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi1.1/net/can?", NAME="can3" | ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi1.1/net/can?", NAME="can3" | ||
− | * | + | *更多信息请参考:https://wiki.archlinux.org/title/Udev#top-page<br/> |
+ | {{Note|一般推荐固定到CAN10,CAN11以上。|warn}} | ||
==Python例程== | ==Python例程== | ||
第252行: | 第290行: | ||
上面这条则是通过对CAN0的配置初始化并启用,且指定CAN0作为发送/接收接口。如需改成CAN1,则代码如下:<br /> | 上面这条则是通过对CAN0的配置初始化并启用,且指定CAN0作为发送/接收接口。如需改成CAN1,则代码如下:<br /> | ||
<source lang="python">os.system('sudo ip link set can1 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on')</source > | <source lang="python">os.system('sudo ip link set can1 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on')</source > | ||
− | + | ||
+ | ==== 第一步:连接到CAN总线 ==== | ||
<source lang="python"> | <source lang="python"> | ||
− | can0 = can.interface.Bus(channel = 'can0', bustype = 'socketcan_ctypes')# socketcan_native | + | can0 = can.interface.Bus(channel = 'can0', bustype = 'socketcan_ctypes')# socketcan_native |
</source > | </source > | ||
− | + | {{Note|因python-can版本升级为4.0.0后,对应代码改动如下,否则会报错: | |
<source lang="python"> | <source lang="python"> | ||
− | can1 = can.interface.Bus(channel = ' | + | can1 = can.interface.Bus(channel = 'can0', bustype = 'socketcan') |
</source > | </source > | ||
− | + | |warn}} | |
+ | *需改成CAN1,则代码如下:<br /> | ||
<source lang="python"> | <source lang="python"> | ||
− | can1 = can.interface.Bus(channel = 'can1', bustype = 'socketcan')# socketcan_native | + | can1 = can.interface.Bus(channel = 'can1', bustype = 'socketcan')# socketcan_native |
</source > | </source > | ||
− | + | ||
+ | ==== 第二步:创建信息 ==== | ||
<source lang="python"> | <source lang="python"> | ||
− | msg = can.Message(arbitration_id=0x123, data=[0, 1, 2, 3, 4, 5, 6, 7], extended_id=False) | + | msg = can.Message(arbitration_id=0x123, data=[0, 1, 2, 3, 4, 5, 6, 7], extended_id=False) |
</source > | </source > | ||
− | 因python- | + | {{Note|因python-can版本升级为4.0.0后,对应代码改动如下,否则会报错 |
<source lang="python"> | <source lang="python"> | ||
msg = can.Message(is_extended_id=False, arbitration_id=0x123, data=[0, 1, 2, 3, 4, 5, 6, 7]) | msg = can.Message(is_extended_id=False, arbitration_id=0x123, data=[0, 1, 2, 3, 4, 5, 6, 7]) | ||
</source > | </source > | ||
− | + | |warn}} | |
+ | ==== 第三步:发送信息 ==== | ||
<source lang="python"> | <source lang="python"> | ||
− | can0.send(msg) | + | can0.send(msg) |
</source > | </source > | ||
*需改成CAN1,则代码如下:<br /> | *需改成CAN1,则代码如下:<br /> | ||
第341行: | 第383行: | ||
=FAQ= | =FAQ= | ||
− | {{FAQ| | + | {{FAQ| 2-CH CAN FD HAT 支持与 2-CH CAN HAT 叠加使用?| |
− | + | 不支持与2-CH CAN HAT叠加使用,但可以2个2-CH CAN FD叠加使用。|||}} | |
+ | |||
+ | {{FAQ| CAN FD的最高通信速率可以到多高?| | ||
+ | CAN FD的理论速率上限是8Mbps,但实际应用,通信速率会受通信环境的干扰和通信距离等因素影响,具体以实际环境实测为准。|||}} | ||
+ | |||
{{FAQ| CAN初始化失败??| | {{FAQ| CAN初始化失败??| | ||
如果出现初始化失败,可以重启树莓派或者其他主控平台开发板,确保连线是否正确,及逻辑电压跳帽引脚是否选择正确。|||}} | 如果出现初始化失败,可以重启树莓派或者其他主控平台开发板,确保连线是否正确,及逻辑电压跳帽引脚是否选择正确。|||}} | ||
+ | |||
{{FAQ|CAN接口的G引脚是否连接?| | {{FAQ|CAN接口的G引脚是否连接?| | ||
G为信号地,也称隔离地。在工业环境当中,CAN受周围环境多变,为确保稳定性,两通信模块的G需要相连接。|||}} | G为信号地,也称隔离地。在工业环境当中,CAN受周围环境多变,为确保稳定性,两通信模块的G需要相连接。|||}} | ||
+ | |||
{{FAQ|CAN通信速度达不到最高值?| | {{FAQ|CAN通信速度达不到最高值?| | ||
芯片受周围所测环境、通信距离、线材、软件等多因素的影响。在高速通信时,数据波特率可能达不到所所标称的最高熟虑,用户需根据实际测量,确保稳定,选择适合的通信速度。|||}} | 芯片受周围所测环境、通信距离、线材、软件等多因素的影响。在高速通信时,数据波特率可能达不到所所标称的最高熟虑,用户需根据实际测量,确保稳定,选择适合的通信速度。|||}} | ||
+ | |||
{{FAQ|CAN不能正常通信?| | {{FAQ|CAN不能正常通信?| | ||
若初始化成功,且速度设置合适后,仍不可以正常通信。请检查下两块2-CH CAN FD HAT 的CAN_H是否与另外一块CAN_H相连,CAN_L是否与另外一块CAN_L相连,需注意的是这两条线不能接反,H对应H,L对应L。若没问题,请检查程序配置的CAN口是否正确,比如需要用到CAN0,程序代码却配置CAN1。同时也需要检查硬件是否连接正确且CAN接口存不存在短路问题,如下图所示,CAN接口与树莓派的HDMI接口误触引起短路,使得CAN不能正常通信,这时需要使用购买2-CH CAN FD HAT时配送的配件2×20PIN长排座进行增高处理。[[File:2-CH CAN FD HAT-15.png|800px]]|||}} | 若初始化成功,且速度设置合适后,仍不可以正常通信。请检查下两块2-CH CAN FD HAT 的CAN_H是否与另外一块CAN_H相连,CAN_L是否与另外一块CAN_L相连,需注意的是这两条线不能接反,H对应H,L对应L。若没问题,请检查程序配置的CAN口是否正确,比如需要用到CAN0,程序代码却配置CAN1。同时也需要检查硬件是否连接正确且CAN接口存不存在短路问题,如下图所示,CAN接口与树莓派的HDMI接口误触引起短路,使得CAN不能正常通信,这时需要使用购买2-CH CAN FD HAT时配送的配件2×20PIN长排座进行增高处理。[[File:2-CH CAN FD HAT-15.png|800px]]|||}} | ||
+ | |||
{{FAQ| CAN接口可以接多个设备吗?| | {{FAQ| CAN接口可以接多个设备吗?| | ||
理论上只要CAN ID不同,是可以接多个CAN设备进行通信的。但是,具体可接的数量受CAN子设备的通信量和电气负载等多种因素限制,需要自行根据实际应用实际测试。假设子设备通信数据量大,且实时性要求很高的话,有可能同时带2~3个设备都不行。|||}} | 理论上只要CAN ID不同,是可以接多个CAN设备进行通信的。但是,具体可接的数量受CAN子设备的通信量和电气负载等多种因素限制,需要自行根据实际应用实际测试。假设子设备通信数据量大,且实时性要求很高的话,有可能同时带2~3个设备都不行。|||}} |
2024年3月15日 (五) 13:49的最新版本
| |||||||||||||||||||||
| |||||||||||||||||||||
说明
更新说明
在2022年4月左右我们推出了‘Rev2.1’版本(该版本及后续版本背面板名下有版本号)
新版本特性:
- DC电路进行优化,新版本从DC接口供电能够给树莓派供电并稳定工作
- 背面增加堆叠配置电阻,通过修改电阻可以实现最多5路CAN接口拓展(三块拓展板)
- 默认配置支持官方驱动,驱动安装操作更简单;同时预留配置电阻以支持老版本驱动(老版本使用第三方驱动),实现完全兼容老版本
新版本使用只有驱动安装方式不同,详细见‘驱动安装’章节
- 新版本仅支持内核版本为5.4.77及之后的系统
产品参数
- 输入电压: 8~28V
- 逻辑电压: 3.3V/5V
- CAN控制芯片: MCP2518FD
- 产品尺寸: 65.0x56.5mm
- 固定孔通经: 3.0mm
接口说明
功能引脚 | 树莓派接口 (BCM) |
树莓派接口 (WPI) |
描述 |
5V | 5V | 5V | 5V电源正 |
GND | GND | GND | 电源地 |
MISO_0 | 9(MISO) | 13(MISO) | SPI_0数据输出 |
MOSI_0 | 10(MOSI) | 12(MOSI) | SPI_0数据输入 |
SCK_0 | 11(SCLK) | 14(SCLK) | SPI_0时钟输入 |
CS_0 | 8(CE0)/7(CE1) | 10(CE0)/11(CE1) | CAN_0片选 |
INT_0 | 25/13 | 6/23 | CAN_0中断输出 |
MISO_1 | 19(MISO)/9 | 24(MISO)/13 | SPI_1数据输出 |
MOSI_1 | 20(MOSI)/10 | 28(MOSI)/12 | SPI_1数据输入 |
SCK_1 | 21(SCLK)/11 | 29(SCLK)/14 | SPI_1时钟输入 |
CS_1 | 18(SPI1_CE0)/17/16/26 | 1/0/27/25 | CAN_1片选 |
INT_1 | 24/23/22/16 | 5/4/3/27 | CAN_1中断输出 |
总线说明
CAN 模块的功能是处理所有 CAN 总线上的报文接收和发送。报文发送时,首先将报文装载到正确的报文缓冲器和控制寄存器中。通过 SPI 接口设置控制寄存器中的相应位或使用发送使能引脚均可启动发送操作。通过读取相应的寄存器可以检查通讯状态和错误。 会对在 CAN总线上检测到的任何报文进行错误检查,然后与用户定义的滤波器进行匹配,以确定是否将报文移到两个接收缓冲器中的一个。
由于树莓派本身并不支持CAN总线,因此使用SPI接口的CAN控制器,搭配一个收发器完成CAN功能。
MCP2518FD是Microchip公司生产的一款CAN FD(灵活数据速率)控制器,完全支持经典格式(CAN2.0)和CAN灵活数据速率(CAN FD)格式的CAN成帧。仲裁比特率高达1Mbps,数据波特率也突破传统CAN2.0的1Mbps限制,SPI时钟速度高达20MHz符合ISO11898-1:2015标准。该器件能发送和接收标准和扩展数据帧以及远程帧。 MCP2518FD 自带的32个灵活的滤波器和屏蔽对象可以过滤掉不想要的报文,因此减少了主单片机(MCU)的开销。MCU通过SPI接口与该器件连接,即树莓派通过SPI接口连接芯片,对于树莓派使用该芯片,可以通过已编写好的设备树文件来驱动该器件,更多详细请参考数据手册。
树莓派使用
硬件连接
接入树莓派使用时,必须加上增高座,然后排针穿过底板,效果如下:
在使用树莓派演示该例程时,需注意的是由于树莓派属于3.3V逻辑系统,需改变将2-CH CAN FD HAT的逻辑电压引脚跳帽到3.3V,如下图所示。
前置工作
开启SPI接口
- 打开树莓派终端,输入以下指令进入配置界面
sudo raspi-config 选择Interfacing Options -> SPI -> Yes 开启SPI接口
sudo reboot
请确保SPI没有被其他的设备占用,你可以在/boot/config.txt中间检查
函数库安装
- 安装Python函数库
#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
驱动安装(新版)
注意:在2022年4月左右我们推出了‘Rev2.1’版本(背面板名下有版本号),该章节仅适用于‘Rev2.1’及以后的版本,如果你是用的是旧版本请阅读‘驱动安装(旧版)’章节
可以通过修改0R电阻以灵活调整使用的SPI和中断引脚,选择以下任一模式即可
双SPI模式
'A' 模式(默认模式),分别用 SPI0-0 和 SPI1-0 控制两路CAN,板子正面的AB模式焊点无须做改动,即:
CAN_0 使用 SPI0-0,中断引脚为25,CAN_1 使用 SPI1-0,中断引脚为24。
修改config.txt脚本
请在 /boot/config.txt 中添加:
在最后一行加入如下:
dtparam=spi=on dtoverlay=spi1-3cs dtoverlay=mcp251xfd,spi0-0,interrupt=25 dtoverlay=mcp251xfd,spi1-0,interrupt=24
添加完成后重启,进入‘配置CAN’章节
单SPI模式
'B' 模式,使用 SPI0-0 和 SPI0-1 控制两路 CAN 输出,只需将模块正面的四个0R电阻挪到 'B' 模式位置,即:
CAN_0 使用 SPI0-0,中断引脚为25,CAN_1 使用 SPI0-1,中断引脚为24,如下图所示
请在 /boot/config.txt 中添加:
dtoverlay=spi1-3cs dtoverlay=mcp251xfd,spi0-0,interrupt=25 dtoverlay=mcp251xfd,spi0-1,interrupt=24
添加完成后重启,进入‘配置CAN’章节
堆叠模式
- 原理:修改背面的 CAN_x PIN SELECTION(x为0或1) 区域的 0R 电阻以改变CAN控制器使用的 CE 和 INT 引脚
- 注意:在需要堆叠使用时,硬件配置需要保持在双SPI模式('A' 模式,默认设置)
- CAN_0 有两组可选择:
CE_0 | INT_0 | config 设置 | 描述 |
---|---|---|---|
CE0 | D25 | dtoverlay=mcp251xfd,spi0-0,interrupt=25 | CAN_1 使用 SPI0-0,中断引脚为25 |
CE1 | D13 | dtoverlay=mcp251xfd,spi0-1,interrupt=13 | CAN_1 使用 SPI0-1,中断引脚为13 |
- CAN_1 有三组可选择:
CE_1" | INT_1 | config 设置 | 描述 |
---|---|---|---|
SPI1_CE0 | D24 | dtoverlay=mcp251xfd,spi1-0,interrupt=24 | CAN_1 使用 SPI1-0,中断引脚为24 |
SPI1_CE1 | D23 | dtoverlay=mcp251xfd,spi1-1,interrupt=23 | CAN_1 使用 SPI1-1,中断引脚为23 |
SPI1_CE2 | D22 | dtoverlay=mcp251xfd,spi1-2,interrupt=22 | CAN_1 使用 SPI1-2,中断引脚为22 |
细心的朋友可能会看到还有一组配置没有写出,这是为了兼容老版本预留,新用户可以无视
使用举例
- 你有两块板子需要使用4路CAN怎么配置呢?
答:第一块板子不做修改,第二块板子背面的 CAN_0
配置区选择 CE1 和 D13,CAN_1
配置区选择 SPI1_CE1 和 D23,硬件改动参考下图:
然后在 /boot/config.txt 最后添加:
dtparam=spi=on dtoverlay=spi1-3cs dtoverlay=mcp251xfd,spi0-0,interrupt=25 dtoverlay=mcp251xfd,spi0-1,interrupt=13 dtoverlay=mcp251xfd,spi1-0,interrupt=24 dtoverlay=mcp251xfd,spi1-1,interrupt=23
添加完成后重启,进入‘配置CAN’章节
兼容模式
- 新版本为了兼容标准SPI调整了一些默认设置,所以想要和老版本兼容需要做一些修改
- 兼容A模式:CE_1" 电阻选择到 D26;INT_1 电阻选择到 D16
- 兼容B模式:CE_1" 可以不修改,没有影响;INT_1 电阻选择到 D16
- 驱动安装参照‘驱动安装(旧版)章节’
驱动安装(旧版)
注意:在2022年4月左右我们推出了‘Rev2.1’版本,该章节仅适用于‘Rev2.1’之前的版本(背面没有版本信息),如果你是用的是新版本请阅读上一章节‘驱动安装(新版)’
请在 /boot/config.txt 中添加:
- 在最后一行加入如下:
dtparam=spi=on dtoverlay=waveshare-can-fd-hat-mode-a
- 重启树莓派以应用所有设置:
sudo reboot
- 待树莓派重启后,查看SPI信息:
dmesg | grep spi
A工作方式:
B工作方式:
注意1:出厂默认A模式,可通过更改电阻来实现B模式,A模式中两路CAN分别使用两组独立的SPI,B模式则是两路CAN共用一组SPI。如下图所示:
注意2:因为采用了兼容的检测方式,所以在初始化时会有额外的信息,不影响正常使用,可忽视
说明:如果根据上述方式安装驱动后,提示内核报错相关,则需要到树莓派官方下载最新版的镜像,或者直接更新下系统内核:
sudo apt update sudo apt upgrade uname -a
配置CAN
设置波特率,工作模式,是否开启FD及配置传输缓冲区大小:
- 波特率设置:
sudo ip link set can0 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on sudo ip link set can1 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on
bitrate xxxxxx (bps):仲裁比特率
dbitrate xxxxxx (bps):数据比特率
相关比特率的设置参考示例,如下
如果接收不到其他设备发送的 CAN FD 帧数据,可以尝试在命令最后追加 sample-point .8 dsample-point .8,注意:采样点设置(.8)需要和发送端相同
- 可配置成以下模式:
[ loopback { on | off } ]
[ listen-only { on | off } ]
[ triple-sampling { on | off } ]
[ one-shot { on | off } ]
[ berr-reporting { on | off } ]
FD是开启指令:
[ fd { on | off } ]
[ fd-non-iso { on | off } ]
更多相关CAN内核指令可以查看:
https://www.kernel.org/doc/Documentation/networking/can.txt
- 配置缓冲区
sudo ifconfig can0 txqueuelen 65536 sudo ifconfig can1 txqueuelen 65536
- 查看ifconfig:
ifconfig
CAN测试
- 开始测试:
若手上只有一个2-CH CAN FD HAT,可以将可通过将模块的CAN0_H与CAN1_H,CAN0_L与CAN1_L相连,如下图所示:
- 安装can-utils:
sudo apt-get install can-utils
- 打开两个终端窗口:
其中一个终端输入接收CAN0数据指令:
candump can0
另外一个终端输入发送CAN1数据指令:
cansend can1 000#11.22.33.44
- 演示效果如下:(左边为接收,右边为发送)
若手上有两个2-CH CAN FD HAT,可以直接将CAN_H,CAN_L两两相连。效果跟上述一样,需注意匹配好通信速率,识别ID,输出接口序号。
固定设备号
如果使用时发现 CAN 接口的系统设备号和板卡接口名称对不上,可以使用以下方法固定设备号:
- 在 /etc/udev/rules.d 目录下个创建一个 rules 文件:
sudo nano /etc/udev/rules.d/80-can.rules
- 将下面的内容添加到文件中:
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi0.0/net/can?", NAME="can0" ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi0.1/net/can?", NAME="can1" ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi1.0/net/can?", NAME="can1"
- 如果是堆叠使用可以根据自己需求添加相应的命令,只需要修改 DEVPATH 和 NAME,例如将 spi1-1 命名为 can3:
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi1.1/net/can?", NAME="can3"
Python例程
- 下载及解压例程和驱动(已下载可以跳过):
cd ~ wget https://www.waveshare.net/w/upload/4/46/2-CH-CAN-FD-HAT-Demo.7z 7z x 2-CH-CAN-FD-HAT-Demo.7z -o./2-CH-CAN-FD-HAT-Demo
- 进入程序目录:
cd 2-CH-CAN-FD-HAT-Demo/Raspberry_Pi/Python/
- 接收端运行receive0.py:
sudo python receive0.py
- 发送端运行send1.py:
sudo python send1.py
需注意的是这里的发送端是使用CAN1发送,接收端则是CAN0,具体修改可以参照下面的代码分析。
代码分析
本例程是基于python平台,确保以及安装了python-can库在发送之前要先创建一个can设备,因为前面只是启用MCP2518FD内核:
os.system('sudo ip link set can0 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on')
上面这条则是通过对CAN0的配置初始化并启用,且指定CAN0作为发送/接收接口。如需改成CAN1,则代码如下:
os.system('sudo ip link set can1 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on')
第一步:连接到CAN总线
can0 = can.interface.Bus(channel = 'can0', bustype = 'socketcan_ctypes')# socketcan_native
can1 = can.interface.Bus(channel = 'can0', bustype = 'socketcan')
- 需改成CAN1,则代码如下:
can1 = can.interface.Bus(channel = 'can1', bustype = 'socketcan')# socketcan_native
第二步:创建信息
msg = can.Message(arbitration_id=0x123, data=[0, 1, 2, 3, 4, 5, 6, 7], extended_id=False)
msg = can.Message(is_extended_id=False, arbitration_id=0x123, data=[0, 1, 2, 3, 4, 5, 6, 7])
第三步:发送信息
can0.send(msg)
- 需改成CAN1,则代码如下:
can1.send(msg)
- 最后同样要关闭can设备
os.system('sudo ifconfig can0 down')
- 需改成CAN1,则代码如下:
os.system('sudo ifconfig can1 down')
- 接收数据:
msg = can0.recv(10.0)
recv()中定义超时接收时间。
更多请参考:https://python-can.readthedocs.io/en/stable/interfaces/socketcan.html
Arduino使用
本例程是基于Pierre Molinaro的MCP2517FD的例程进行改写,以适应2-CH CAN FD HAT,在此对Pierre Molinaro的付出表示感谢。在该例程中需要两个Arduino板子及两个2-CH CAN FD HAT,需注意的是Arduino属于5V逻辑系统,需改变将2-CH CAN FD HAT的逻辑电压引脚跳帽到5V,如下图所示:
- 将2-CH CAN FD HAT与Arduino相连接,具体接线如下表所示:
功能引脚 | 开发板 |
5V | 5V |
GND | GND |
MISO_0 | D12 (MISO) |
MOSI_0 | D11 (MOSI) |
SCK_0 | D13 (SCK) |
CS_0 | D10 |
INT_0 | D2 |
- 将两个2-CH CAN FD HAT 的CAN_0的H、L两两相连,设置波特率为115200,打开两个串口监视器,可看到以下结果(左边为发送次数,右边为接收的数据):
FAQ