Main Content

MATLAB CAN FD 通信快速入门

以下示例说明如何使用 CAN FD 通道传输和接收 CAN FD 报文。它使用以环回配置形式连接的 MathWorks® 虚拟 CAN FD 通道。

查看可用的 CAN FD 通道

使用 canFDChannelList 查看支持 CAN FD 的所有可用设备通道。

canFDChannelList
ans=2×6 table
      Vendor         Device       Channel    DeviceModel    ProtocolMode     SerialNumber
    ___________    ___________    _______    ___________    _____________    ____________

    "MathWorks"    "Virtual 1"       1        "Virtual"     "CAN, CAN FD"        "0"     
    "MathWorks"    "Virtual 1"       2        "Virtual"     "CAN, CAN FD"        "0"     

创建传输和接收通道

使用指定了设备详细信息的 canFDChannel 来创建用于传输和接收报文的 CAN FD 通道。

txCh = canFDChannel("MathWorks","Virtual 1",1)
txCh = 
  Channel with properties:

   Device Information
            DeviceVendor: 'MathWorks'
                  Device: 'Virtual 1'
      DeviceChannelIndex: 1
      DeviceSerialNumber: 0
            ProtocolMode: 'CAN FD'

   Status Information
                 Running: 0
       MessagesAvailable: 0
        MessagesReceived: 0
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: [0x0 datetime]
           FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'

   Bit Timing Information
               BusStatus: 'N/A'
              SilentMode: 0
         TransceiverName: 'N/A'
        TransceiverState: 'N/A'
       ReceiveErrorCount: 0
      TransmitErrorCount: 0
     ArbitrationBusSpeed: 500000
            DataBusSpeed: 2000000

   Other Information
                Database: []
                UserData: []

rxCh = canFDChannel("MathWorks","Virtual 1", 2);

配置总线速度

CAN FD 通道需要在上线前设置总线速度。仲裁相位速度和数据相位速度都需要使用 configBusSpeed 进行配置。

configBusSpeed(txCh, 500000, 1000000);
configBusSpeed(rxCh, 500000, 1000000);

打开 DBC 文件

使用 canDatabase 打开包含 CAN FD 报文和信号定义的数据库文件。

db = canDatabase("CANFDExample.dbc")
db = 
  Database with properties:

             Name: 'CANFDExample'
             Path: '/tmp/Bdoc24a_2511836_3090053/tpeb21c448/vnt-ex36915890/CANFDExample.dbc'
        UTF8_File: '/tmp/Bdoc24a_2511836_3090053/tpeb21c448/vnt-ex36915890/CANFDExample.dbc'
            Nodes: {}
         NodeInfo: [0x0 struct]
         Messages: {'CANFDMessage'}
      MessageInfo: [1x1 struct]
       Attributes: {2x1 cell}
    AttributeInfo: [2x1 struct]
         UserData: []

将数据库直接连接到接收通道。DBC 文件中的定义会自动应用于解码传入的报文和信号。

rxCh.Database = db;

启动通道

使用 start 命令将通道设置为在线状态。

start(txCh);
start(rxCh);

创建 CAN FD 报文

使用 canFDMessage 函数创建 CAN FD 报文。

msg1 = canFDMessage(500, false, 12)
msg1 = 
  Message with properties:

   Message Identification
    ProtocolMode: 'CAN FD'
              ID: 500
        Extended: 0
            Name: ''

   Data Details
       Timestamp: 0
            Data: [0 0 0 0 0 0 0 0 0 0 0 0]
         Signals: []
          Length: 12
             DLC: 9

   Protocol Flags
             BRS: 0
             ESI: 0
           Error: 0

   Other Information
        Database: []
        UserData: []

msg2 = canFDMessage(1000, false, 24);
msg3 = canFDMessage(1500, false, 64);

要启用 CAN FD 的比特率开关功能,请设置报文的 BRS 属性。

msg1.BRS = true;
msg2.BRS = true;
msg3.BRS = true;

也可以使用数据库创建 CAN FD 报文。数据库定义报文是 CAN 还是 CAN FD 以及 BRS 状态。

msg4 = canFDMessage(db,"CANFDMessage")
msg4 = 
  Message with properties:

   Message Identification
    ProtocolMode: 'CAN FD'
              ID: 1
        Extended: 0
            Name: 'CANFDMessage'

   Data Details
       Timestamp: 0
            Data: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
         Signals: []
          Length: 48
             DLC: 14

   Protocol Flags
             BRS: 1
             ESI: 0
           Error: 0

   Other Information
        Database: [1x1 can.Database]
        UserData: []

传输报文

使用 transmit 从传输通道发送创建的报文。

transmit(txCh, [msg1 msg2 msg3 msg4])

接收报文

使用 receive 函数从接收通道接收报文。CAN FD 通道的默认返回类型是一个时间表,其中包含特定于接收到的 CAN FD 报文的信息。

rxMsg = receive(rxCh, Inf)
rxMsg=4×12 timetable
       Time         ID     Extended          Name          ProtocolMode                                                                   Data                                                                    Length    DLC      Signals       Error    Remote     BRS      ESI 
    ___________    ____    ________    ________________    ____________    ___________________________________________________________________________________________________________________________________    ______    ___    ____________    _____    ______    _____    _____

    0.39076 sec     500     false      {0x0 char      }     {'CAN FD'}     {[                                                                                                        0 0 0 0 0 0 0 0 0 0 0 0]}      12       9     {0x0 struct}    false    false     true     false
    0.39079 sec    1000     false      {0x0 char      }     {'CAN FD'}     {[                                                                                0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]}      24      12     {0x0 struct}    false    false     true     false
    0.39079 sec    1500     false      {0x0 char      }     {'CAN FD'}     {[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]}      64      15     {0x0 struct}    false    false     true     false
    0.39079 sec       1     false      {'CANFDMessage'}     {'CAN FD'}     {[                                0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]}      48      14     {1x1 struct}    false    false     true     false

停止通道

使用 stop 命令将通道设置为离线状态。

stop(txCh);
stop(rxCh);

关闭 DBC 文件

通过从工作区中清除 DBC 文件的变量,关闭对该 DBC 文件的访问。

clear db