Q: CAN FD通信ができない

A:

CAN FD通信の概要については、「CAN2.0B通信とCAN FD通信の違い」を参照ください。

①CAN FD通信は、アービトレーション領域に対するビットレート設定と、データ領域に対するビットレート設定には異なる値を指定できます。
 その際、CanTransmit関数のMessageType引数で、CAN FDメッセージ(CCAN_MSG_TYPE_CAN_FD)とともに、ビットレートスイッチ(CCAN_MSG_TYPE_BITRATE_SWITCH)が必要になります。

②同じCAN経路上のアービトレーション領域及び、データ領域に対する各ビットレート設定とサンプリングポイントは、送信デバイスと受信デバイスで同等の設定を行ってください。
 設定には、CanSetCanFdTiming関数を使用します。

 また、設定値を確認する場合は、CanGetCanFdTiming関数を使用します。
 詳細は、各関数の関数リファレンスを参照ください。

 

アービトレーション領域と、データ領域のビットレート値が異なる場合のCAN送信例:

CANデバイスのChannelNo = 1から、CAN FD送信。
MessageNum =1、CAN ID = 0x11c、DataLength = 1 、Data = 0xff

C

long Ret;

unsinged long MessageType[1];

unsinged long CanId[1];

unsinged short DataLength[1];

unsinged char Data[1][64];

 

MessageType[0] = CCAN_MSG_TYPE_CAN_FD | CCAN_MSG_TYPE_BITRATE_SWITCH;

CanId[0] = 0x11c;

DataLength = 1;

Data[0][0] = 0xff;


Ret = CanTransmit ( Id , 1 , &DataLength[0] , &MessageType[0] , &CanId[0] , &Data[0][0] );
 

Python

Ret = ctypes.c_long()

MessageTypeType = ctypes.c_uint() * 1

MessageType = MessageTypeType()

CanIdType = ctypes.c_uint() * 1

CanId = CanIdType()

DataLengthType = ctypes.c_ushort() *1

DataLength = DataLengthType()

SingleDataType = ctypes.c_ubyte() * 64

DataType = ctypes.SingleDataType * 1

Data = DataType()

 

MessageType[0] = CCAN_MSG_TYPE_CAN_FD | CCAN_MSG_TYPE_BITRATE_SWITCH

CanId[0] = 0x11c

DataLength[0] = 1

Data[0][0] = 0xff

 

Ret.value = ccan.CanTransmit ( Id , 1 , DataLength , MessageType , CanId , Data )