这分为4部分:
这里展示的代码是节选的,不是全部。请查看源代码。
步骤: 初始化
选择CLASSIC CAN 或 CAN FD
设置常态MyApp 为 canFD 或canCLASSIC CAN。
将需要作为发送的适配器通道设置为TX_MySelCh 。
将需要作为接收的适配器通道设置为RX_MySelCh 。
几乎所有Kvaser CAN 适配器可同时为发送器和接收器。我们在这个范例里选择以一个为TX,另一个RX ,以使这个范例的代码容易被理解。
首先我们运行3个命令:
canInitializeLibrary()
canGetChannelData()
现在我们知道存在多少个适配器以及它们的名称。我们可以打开其中两个。
canOpenChannel()
CAN CLASSIC
TX_MyHnd := canOpenChannel(TX_MySelCh – 1, canOPEN_ACCEPT_VIRTUAL);
RX_MyHnd := canOpenChannel(RX_MySelCh – 1, canOPEN_ACCEPT_VIRTUAL);
CAN FD
TX_MyHnd := canOpenChannel(TX_MySelCh – 1, canOPEN_ACCEPT_VIRTUAL OR canOPEN_CAN_FD);
RX_MyHnd := canOpenChannel(RX_MySelCh – 1, canOPEN_ACCEPT_VIRTUAL OR canOPEN_CAN_FD);
在打开一个FD通道时,使用旗标(FLAG)是重要的: canOPEN_CAN_FD
我们用联合命令“canOPEN_ACCEPT_VIRTUAL OR canOPEN_CAN_FD” 打开一个虚拟适配器,设置模式为FD。
现在适配器打开了,我们需要设置它们的参数。
canSetBusParams() and canSetBusParamsFD()
- FD需要编辑和附加信息FD!
- 可以用其他值,而不用预设值 (本文不介绍这部分)。
CAN CLASSIC
canSetBusParams()仅能与canBITRATE_xxx一起用.
TX := canSetBusParams(TX_MyHnd, canBITRATE_500K, 0, 0, 0, 0, 0);
RX := canSetBusParams(RX_MyHnd, canBITRATE_500K, 0, 0, 0, 0, 0);
CAN FD
canSetBusParams() and canSetBusParamsFD()能与 canFD_BITRATE_xxx一起用。
TX := canSetBusParams(TX_MyHnd, canFD_BITRATE_500K_80P, 0, 0, 0, 0, 0);
RX := canSetBusParams(RX_MyHnd, canFD_BITRATE_500K_80P, 0, 0, 0, 0, 0);
TX := canSetBusParamsFD(TX_MyHnd, canFD_BITRATE_1M_80P, 0, 0, 0);
RX := canSetBusParamsFD(RX_MyHnd, canFD_BITRATE_1M_80P, 0, 0, 0);
- 请注意, 不要在FD上使用canBITRATE_xxx 值!
现在所有参数都设置好了,我们可以上线了,所以我们要结束初始化过程,打开总线,做一些清理。
canBusOn()
canFlushTransmitQueue()
canFlushReceiveQueue()
步骤: 发送
我们激活了总线,适配器在等我们的下一步操作。我们应从一个选出的适配器发送一个帧。
canWrite()
(我们可以用canWrite() 或 canWriteWait()命令,但在本范例中我们只用canWrite。)
推荐: 参阅THE HELP!
CAN CLASSIC
BUF := ‘Hello!’;
id := 111;
dlc := 8; // For Classic CAN dlc can be at most 8*
Flag := canMSG_STD;
R := canWrite(TX_MyHnd, id, @BUF, dlc, Flag);
CAN FD
BUF := ‘Hello World!’;
id := 222;
dlc := 16; // for CAN FD dlc CAN be one of the following 0-8,12, 16, 20, 24, 32, 48, 64
Flag := canMSG_STD OR canFDMSG_FDF OR canFDMSG_BRS;
R := canWrite(TX_MyHnd, id, @BUF, dlc, Flag);
- 新 缓存容量可达64 bytes
- 加 canFDMSG_FDF 到旗标flag 上(表明此帧是一个FD 帧)
- 加 canFDMSG_BRS 到旗标 flag 上(表明该帧需以比特率调节发送)
请注意canFDMSG_BRS可选可不选。当加了BRS flag, 数据部分是以 FD比特率发送的,而不是以仲裁比特率发送的。
在你激活FD以后仍可以发送classic CAN 帧! 只能用canMSG_STD 或 canMSG_EXT 生成一个classic 帧。
步骤: 接收
canRead()
(可用来接收FD通讯的canRead() (至少)有四个版本的。在此范例中我们仅用canRead(),所以我们建议你阅读‘Help’ 部分!)
R := canRead(RX_MyHnd, id, @BUF, dlc, Flag, myTime);
我们不需要对阅读命令做任何修改,但是 …
- 确认缓存[BUF]的最小容量是64 bytes。即使我们并不想发送长过24 bytes的帧, 别人或许需要。
- 研究被返回的旗标值,它们包含了一些新值。这些是canMSG_xxx, canMSGERR_xxx 和 canFDMSG_xxx 值的综合。
即使只有我们在总线上,而且我们仅发了一帧, 接受到的帧未必是我们想要的。例如,如果旗标里包括了值canMSG_ERROR_FRAME, 那么此帧是一个错误帧,不是我们希望看到的。.
现在我们已经收到了我们的帧。
步骤: 完成
完成步骤不需要编辑。
canBusOff()
canClose()
canUnloadLibrary()