python-can对Vector CAN FD(no-iso)的支持

CAN-FD首先由博世提出,早期的CAN-FD称之为“no-iso”;后来can-fd标准化(11898-2:2015),一个3位填充位计数器和一个额外的奇偶校验位被引入,CRC的计算值也改变了,导致两者不兼容。早期的CAN-FD控制器是“no-iso”的,而目前大部分CAN设备默认都是ISO的,在使用的时候需要选配。
PCAN的硬件可以自动转换ISO和非ISO,但是Vector的必须要选,在没有CANoe等设备的时候,需要编程实现。Vector提供的最新驱动(≥10.x.x)可以做到这一点,以前的只能分别使用不同的驱动。
python-can是python的一个can驱动库,支持大部分的CAN设备。但是目前(《=3.3.3)仍没有ISO和非ISO的接口
python-can对Vector CAN FD(no-iso)的支持_第1张图片
首先需要安装Vector的XL驱动(最新版本),其中结构体,XLcanFdConf说明了配置的参数,其中options代表是否是ISO,options=0 为iso options=8为非iso(为什么是这样,看xl给的demo的宏定义)

python-can对Vector CAN FD(no-iso)的支持_第2张图片
找到安装的python-can包,找到vector文件夹,修改vxlapi.py 140行

# CAN FD configuration structure 
class XLcanFdConf(ctypes.Structure):
    _fields_ = [('arbitrationBitRate', ctypes.c_uint), ('sjwAbr', ctypes.c_uint),
                ('tseg1Abr', ctypes.c_uint), ('tseg2Abr', ctypes.c_uint),
                ('dataBitRate', ctypes.c_uint), ('sjwDbr', ctypes.c_uint),
                ('tseg1Dbr', ctypes.c_uint), ('tseg2Dbr', ctypes.c_uint),
                ('options', ctypes.c_uint),
                ('reserved', ctypes.c_uint * 2)]

修改canlib.py,增加一个option参数

class VectorBus(BusABC):
    """The CAN Bus implemented for the Vector interface."""

    def __init__(self, channel, can_filters=None, poll_interval=0.01,
                 receive_own_messages=False,
                 bitrate=None, rx_queue_size=2**14, app_name="CANalyzer",
                 serial=None, fd=False, data_bitrate=None, sjwAbr=2, tseg1Abr=6,
                 tseg2Abr=3, sjwDbr=2, tseg1Dbr=6, tseg2Dbr=3,option=0, **kwargs):
                

在164行,添加

         if fd:
             self.canFdConf = vxlapi.XLcanFdConf()
             self.canFdConf.options = ctypes.c_uint(option)

经过修改这两个文件,就可以使用option参数控制CANFD的类型了。
参考:
https://can-newsletter.org/engineering/standardization/141209_iso-can-fd-or-non-iso-can-fd/

你可能感兴趣的:(杂项)