CAN总线调试时,根据数据的重要性,接收端可以专注于接收重要消息,提高效率。CAN报文帧是用一个标识符或一系列标识符来过滤的。可以使用CAN总线软件和芯片硬件过滤规则实现过滤功能。
软件过滤
struct can_filter filter[1];/* 规则:可以接收ID为0x200数据帧和错误帧 */
filter[0].can_mask = CAN_SFF_MASK;filter[0].can_id = 0x200 & CAN_SFF_MASK;filter[0].can_mask |= CAN_EFF_FLAG;
if (setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &filter, sizeof(filter))){perror("setsockopt failed");exit(EXIT_FAILURE);}
软件的配置可以在系统中检查:
root@host:/root# ls /proc/net/can/rcvlist_all rcvlist_err rcvlist_inv reset_statsrcvlist_eff rcvlist_fil rcvlist_sff stats
root@host:/root# cat /proc/net/can/rcvlist_filreceive list 'rx_fil': (any: no entry) (can0: no entry) device can_id can_mask function userdata matches ident can1 200 800007ff 0000000095327ce0 00000000674196b1 0 raw (can2: no entry)
此处rcvlist_*为CAN协议中的接收器:struct receiver,包含软件的过滤规则。
硬件过滤芯片手册:
硬件过滤方式在驱动:drivers/net/can/rockchip/rockchip_canfd.c 中实现,具体代码:
static int rockchip_canfd_start(struct net_device *ndev){ ...... rockchip_canfd_write(rcan, CAN_INT_MASK, 0);
/* RECEIVING FILTER, accept all */ rockchip_canfd_write(rcan, CAN_IDCODE, 0); rockchip_canfd_write(rcan, CAN_IDMASK, CAN_RX_FILTER_MASK); rockchip_canfd_write(rcan, CAN_IDCODE0, 0); rockchip_canfd_write(rcan, CAN_IDMASK0, CAN_RX_FILTER_MASK); rockchip_canfd_write(rcan, CAN_IDCODE1, 0); rockchip_canfd_write(rcan, CAN_IDMASK1, CAN_RX_FILTER_MASK); rockchip_canfd_write(rcan, CAN_IDCODE2, 0); rockchip_canfd_write(rcan, CAN_IDMASK2, CAN_RX_FILTER_MASK); rockchip_canfd_write(rcan, CAN_IDCODE3, 0); rockchip_canfd_write(rcan, CAN_IDMASK3, CAN_RX_FILTER_MASK); rockchip_canfd_write(rcan, CAN_IDCODE4, 0); rockchip_canfd_write(rcan, CAN_IDMASK4, CAN_RX_FILTER_MASK); ......}
从以上代码可以看出,每次执行CAN软件都会重新配置CAN控制器寄存器不过滤任何数据。通过2个寄存器来实现硬件过滤:CAN_IDCODEn、CAN_RX_FILTER_MASK
RK3568 CAN控制器有6个过滤器,其中第一个过滤器默认使能,不受开关控制,其余过滤器需要使能对应的过滤器。可以在can软件运行时,再去配置硬件过滤方式,如:
root@host:/root# ip link set can1 type can bitrate 1000000root@host:/root# ip link set can1 uproot@host:/root# candump can1 只接收0x123 id的帧,不受开关控制root@host:/root# io -4 0xfe58003c 0x123root@host:/root# io -4 0xfe580040 0x0# 只接收0x124 id的帧,需开关控制root@host:/root# io -4 0xfe580120 0x124root@host:/root# io -4 0xfe580124 0x0root@host:/root# io -4 0xfe58011c 0x1
系统优化1. 发送异常返回
系统CAN默认发送队列:txqueuelen:10,有线网口该数值为1000。更小的数值,实时性更强。
在大量数据发送时,write函数经常异常返回,大部分原因是由于系统发送队列内存不足,可以使用以下指令增大发送队列:
root@host:/root# ip link set txqueuelen 500 dev can1
2. 接收数据丢失
接收队列不足表现在read得到的数据不全,大部分情况为数据skb已经提供到receiver 队列中,但是应用来不及取出,导致最终占满所有可支配的内存大小,数据更新到了队列中错误的位置。
可使用以下指令调整接收队列大小:
root@host:/root# echo 1000000 > /proc/sys/net/core/rmem_maxroot@host:/root# echo 1000000 > /proc/sys/net/core/rmem_default
Coral-EVa为致远电子推出的Coral3568配套评估底板,同样功能强大,接口丰富。Coral-EVa评估底板采用适配器供电,更方便实验室和研发办公室使用,HDMI、DP、USB、CAN、RS485、RS232、TTL UART、3.5mm四线耳麦接口、Micro SD卡槽、SATA、M.2、LVDS LCD、MIPI_DSI、MIPI-CSI、RTC时钟、蜂鸣器等功能一应俱全。
-
CAN
+关注
关注
57文章
2714浏览量
463328 -
硬件
+关注
关注
11文章
3247浏览量
66099 -
软件
+关注
关注
69文章
4762浏览量
87144
发布评论请先 登录
相关推荐
评论