В этом примере показано, как использовать каналы CAN FD для передачи и приема сообщений CAN FD. Он использует каналы MathWorks Virtual CAN, подключенные в строении закольцовывания.
Использование canFDChannelList
для просмотра всех доступных каналов устройств, поддерживающих CAN FD.
canFDChannelList
ans = 2x6 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"
Создайте каналы CAN FD для отправки и приема сообщений путем определения деталей устройства.
txCh = canFDChannel('MathWorks', 'Virtual 1', 1) rxCh = canFDChannel('MathWorks', 'Virtual 1', 2);
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: [] DataBusSpeed: [] Other Information Database: [] UserData: []
Каналы CAN FD требуют настройки скорости шины перед переходом в оперативный режим. Сконфигурированы скорость арбитража и фазы данных.
configBusSpeed(txCh, 500000, 1000000); configBusSpeed(rxCh, 500000, 1000000);
Файлы базы данных CAN задают сообщение CAN FD.
db = canDatabase('CANFDExample.dbc')
rxCh.Database = db;
db = Database with properties: Name: 'CANFDExample' Path: '/tmp/BR2021ad_1584584_202060/publish_examples0/tp21235eaf/ex36915890/CANFDExample.dbc' Nodes: {} NodeInfo: [0x0 struct] Messages: {'CANFDMessage'} MessageInfo: [1x1 struct] Attributes: {2x1 cell} AttributeInfo: [2x1 struct] UserData: []
Используйте start
Команда, чтобы установить каналы в оперативном режиме.
start(txCh); start(rxCh);
Сообщения CAN FD создаются также с помощью canFDMessage
.
msg1 = canFDMessage(500, false, 12) msg2 = canFDMessage(1000, false, 24); msg3 = canFDMessage(1500, false, 64); % To engage the bit rate switch capability of CAN FD, set the |BRS| property of the messages. msg1.BRS = true; msg2.BRS = true; msg3.BRS = true; % CAN FD messages can also be created using a database file. The database defines if a message is CAN or CAN FD. BRS status is also taken from the database. msg4 = canFDMessage(db, 'CANFDMessage')
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: [] msg4 = Message with properties: Message Identification ProtocolMode: 'CAN FD' ID: 1 Extended: 0 Name: 'CANFDMessage' Data Details Timestamp: 0 Data: [1x48 uint8] Signals: [] Length: 48 DLC: 14 Protocol Flags BRS: 1 ESI: 0 Error: 0 Other Information Database: [1x1 can.Database] UserData: []
Используйте передающий канал для отправки сообщений.
transmit(txCh, [msg1 msg2 msg3 msg4])
Получайте сообщения от канала. Обратите внимание, что тип возврата для каналов CAN FD является расписанием, содержащим информацию, относящуюся к CAN FD.
rxMsg = receive(rxCh, Inf)
rxMsg = 4x12 timetable Time ID Extended Name ProtocolMode Data Length DLC Signals Error Remote BRS ESI ___________ ____ ________ ________________ ____________ ___________________________________________________ ______ ___ ____________ _____ ______ _____ _____ 0.12818 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.12818 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.12819 sec 1500 false {0x0 char } {'CAN FD'} {1x64 uint8 } 64 15 {0x0 struct} false false true false 0.12819 sec 1 false {'CANFDMessage'} {'CAN FD'} {1x48 uint8 } 48 14 {1x1 struct} false false true false
Используйте stop
команда для перевода каналов в автономный режим.
stop(txCh); stop(rxCh);