CAN 使用 CAN 简介 CAN(Controller Area Network)总线,å³æŽ§åˆ¶å™¨å±€åŸŸç½‘总线,是一ç§æœ‰æ•ˆæ”¯æŒåˆ† 布å¼æŽ§åˆ¶æˆ–实时控制的串行通信网络。CAN总线是一ç§åœ¨æ±½è½¦ä¸Šå¹¿æ³›é‡‡ç”¨çš„总线 å议,被设计作为汽车环境ä¸çš„微控制器通讯。 如果想了解更多的内容å¯ä»¥å‚ 考 CAN应用报告 硬件连接 CAN模å—之间接线:CAN_H接CAN_H,CAN_L接CAN_L。 DTS 节点é…ç½® 公共é…ç½® kernel/arch/arm64/boot/dts/rockchip/rk3576.dtsi can0: can@2ac00000 { compatible = "rockchip,rk3576-canfd"; reg = <0x0 0x2ac00000 0x0 0x1000>; interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru CLK_CAN0>, <&cru HCLK_CAN0>; clock-names = "baudclk", "apb_pclk"; resets = <&cru SRST_CAN0>, <&cru SRST_H_CAN0>; reset-names = "can", "can-apb"; dmas = <&dmac0 20>; dma-names = "rx"; status = "disabled"; }; can1: can@2ac10000 { compatible = "rockchip,rk3576-canfd"; reg = <0x0 0x2ac10000 0x0 0x1000>; interrupts = <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru CLK_CAN1>, <&cru HCLK_CAN1>; clock-names = "baudclk", "apb_pclk"; resets = <&cru SRST_CAN1>, <&cru SRST_H_CAN1>; reset-names = "can", "can-apb"; dmas = <&dmac1 21>; dma-names = "rx"; status = "disabled"; }; æ¿çº§é…ç½® kernel/arch/arm64/boot/dts/rockchip/rk3576-firefly-aio- 3576q.dtsi &can0 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&can0m2_pins>; }; å¦å¤–å¯è®¾ç½®æ—¶é’Ÿé¢‘率 "assigned-clock-rates",如果 CAN 的比特率低于ç‰äºŽ 3M 建议修改 CAN 时钟到 100M,信å·æ›´ç¨³å®šã€‚高于 3M 比特率的,时钟设置 200M å°±å¯ä»¥ã€‚ 通信测试 CAN 通信测试 使用 candump å’Œ cansend 工具进行收å‘报文测试å³å¯ï¼ŒUbuntu 系统å¯ä½¿ç”¨ apt update && apt install can-utils 安装。 Android å¯ä»¥å°†å·¥å…· push 到 /system/bin/ 目录下执行。工具包å«åœ¨ SDK ä¸, 也å¯ä»¥åœ¨ 官方 或者 github 下载。 #在收å‘端关é—can0设备 ip link set can0 down #在收å‘端设置比特率为250Kbps ip link set can0 type can bitrate 250000 #在收å‘端打开can0设备 ip link set can0 up #在接收端执行candump,阻塞ç‰å¾…报文 candump can0 #在å‘é€ç«¯æ‰§è¡Œcansend,å‘é€æŠ¥æ–‡ cansend can0 123#1122334455667788 更多指令 1〠ip link set canX down //å…³é—can设备; 2〠ip link set canX up  //å¼€å¯can设备; 3〠ip -details link show canX //显示can设备详细信æ¯ï¼› 4〠candump canX //接收can总线å‘æ¥æ•°æ®ï¼› 5〠ifconfig canX down //å…³é—can设备,以便é…ç½®; 6〠ip link set canX up type can bitrate 250000 //设置can波特率 7〠conconfig canX bitrate + 波特率; 8〠canconfig canX start //å¯åŠ¨can设备; 9〠canconfig canX ctrlmode loopback on //回环测试; 10ã€canconfig canX restart // é‡å¯can设备; 11ã€canconfig canX stop //åœæ¢can设备; 12ã€canecho canX //查看can设备总线状æ€ï¼› 13ã€cansend canX --identifier=ID+æ•°æ® //å‘é€æ•°æ®ï¼› 14ã€candump canX --filter=ID:mask //使用滤波器接收ID匹é…çš„æ•°æ® FAQS 总结调试过程ä¸é‡åˆ°çš„å‡ ä¸ªé—®é¢˜åŠè§£å†³æ–¹æ³•ï¼š 报文å‘é€åŽå¾ˆä¹…æ‰æŽ¥æ”¶åˆ°ï¼Œæˆ–者接收ä¸åˆ°ã€‚ 检查总线 CAN_H å’Œ CAN_L, æœé‚¦çº¿æ˜¯å¦æ¾åŠ¨æˆ–者接å。 CAN时钟频率é…ç½® 如果CAN的比特率低于ç‰äºŽ3M建议修改CAN时钟到100M,ä¿¡å·æ›´ç¨³å®šã€‚高于3M比特 率的, 时钟设置200Må°±å¯ä»¥ã€‚ CAN时钟频率修改方法å‚考如下: @@ -673,7 +673,7 @@ status = "disabled"; compatible = "rockchip,can-1.0"; assigned-clocks = <&cru CLK_CAN1>; - assigned-clock-rates = <150000000>; + assigned-clock-rates = <100000000>; pinctrl-names = "default"; pinctrl-0 = <&can1m1_pins>; }; @@ -682,7 +682,7 @@ status = "disabled"; compatible = "rockchip,can-1.0"; assigned-clocks = <&cru CLK_CAN2>; - assigned-clock-rates = <150000000>; + assigned-clock-rates = <100000000>; pinctrl-names = "default"; pinctrl-0 = <&can2m0_pins>; }; æ³¨æ„ ï¼š 在æŸäº›æ—¶é’Ÿé¢‘率下,CANçš„bitrateæ— æ³•èŽ·å¾—å‡†ç¡®çš„é€ŸçŽ‡ï¼Œå¤§å®¶å¯ä»¥è‡ªè¡Œè°ƒæ•´ assigned-clock-rates去解决。 查看是å¦å¾—到所需的bitrare: ip -d link show can1