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/Bdoc23a_2213998_1547702/tpb5db6842/vnt-ex36915890/CANFDExample.dbc' UTF8_File: '/tmp/Bdoc23a_2213998_1547702/tpb5db6842/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.16655 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.16655 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.16656 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.16656 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