CanFestival86 函式庫

CanFestival86 是 CanFestival 的 x86 porting 版本,可运行于自带 CAN Port 的 86Duino One 板子。

CanFestival 是開源的 CANopen Stack,包办了 CANopen CiA DS-301 标准的核心通讯系统,还包含了 CiA DS-302 Configuration Manager 以及 CiA DS-305 LSS 等重要实作。
其支援相当多的平台,可以运行在 PC 环境或是常见的 Embedded System,现在透过 CanFestival86 Library 就可以运行在 DMP x86/Dos 平台下。

原始码

CanFestival86 原始码可以在 Github 页面 下载。

Examples

内建的 master_node 与 slave_node 范例程式码,展示了 CanFestival 核心的运作过程。
详细的 CanFesitval Library 安装、线路连接、master_node 与 slave_node 范例的运行及测试,请参考 Running the CanFestival86 Example

CanFestival86 类别

CanFestival86 类别对 CanFestival 几个重要的函式包装,方便使用者使用,所以只需几行程式码就能运行 CanFestival Master 或 Slave 节点。

– bool begin(CO_Data *node_data, unsigned long baudrate);
启动 CAN Bus 以及 Timer,并且与 CanFestival 节点资料结构绑定。

– bool set86NodeId(UNS8 nodeid);
设定节点 CANopen Node-ID。

– bool set86State(e_nodeState state);
设定节点 CANopen NMT State Machine。

– void setVerbose(bool is_verbose);
设定是否于 Serial Monitor 输出 CanFestival 核心讯息。
若要输出讯息则设定 is_verbose 为 true,反之为 false。

– void dumpRuntimeInfo();
若设透过 setVerbose() 函式设定 is_verbose 为 true,就可以在 loop() 里面呼叫 dumpRuntimeInfo() 印出核心讯息。

– sdoWrite(UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS32 size, void *data, UNS32 timeout_ms = 1000);
这是阻塞式的 SDO Download 功能,SDO Client 请求将资料写入 SDO Server 的 OD。阻塞式的 sdoWrite 发出 SDO 请求后会 blocking 等待直到 server 回应或 timeout。
注意,请勿将此函式放置于 callback 函式内使用,否则无法读到回传的 SDO 结果(这是由于许多 callback 函式是于中断中被呼叫,此时屏蔽了其他中断讯号)。

– bool sdoWriteAsync(UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS32 size, void *data, SDOCallback_t Callback = &sdoWriteDefaultCallback);
这是异步式的 SDO Download 功能,SDO Client 请求将资料写入 SDO Server 的 OD。异步的 sdoWriteAsync 函式可以在任意处使用,但需要实作 1 个 Callback 函式,提供 SDO 通讯完成时呼叫,并且在内部实作 SDO 通讯结果的判断及处理。
CanFestival86 Lib 提供了预设的 Callback 函式 sdoWriteDefaultCallback(),该处里函式判断通讯结果并释放占用的 transfer line。使用者可以使用预设的或者自行实作自定义功能的 Callback。

– bool sdoRead(UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS32 *size, void *data, UNS32 timeout_ms = 1000);
这是阻塞式的 SDO Upload 功能,SDO Client 请求向 SDO Server 读取 OD 的资料。阻塞式的 sdoRead 发出 SDO 请求后会 blocking 等待直到 server 回应或 timeout。
请于 size 参数预先提供 data buffer 的空间大小,函式呼叫完返回的 size 大小则是真实资料的大小。
注意,请勿将此函式放置于 callback 函式内使用,否则无法读到回传的 SDO 结果(这是由于许多 callback 函式是于中断中被呼叫,此时屏蔽了其他中断讯号)。

– bool sdoReadAsync(UNS8 nodeId, UNS16 index, UNS8 subIndex, SDOCallback_t Callback);
这是异步式的 SDO Upload 功能,SDO Client 请求向 SDO Server 读取 OD 的资料。异步的 sdoReadAsync 函式可以在任意处使用,但需要实作 1 个 Callback 函式,提供 SDO 通讯完成时呼叫,并且在内部实作 SDO 通讯结果的判断及处理。
CanFestival86 Lib 没有为 sdoReadAsync 提供预设的 Callback 函式,因为使用者必须自行撰写 Callback 以实作特定资料的存放与读取。
sdoReadAsync() 也没有设计参数来传递储存资料的地址资讯,因为 CanFestival 目前内部提供的函式实作以及资料结构没有设计这项功能。请使用者自行于 Callback 内指定储存位置,或者改用阻塞式的 sdoRead() 函式。

使用限制

CanFestival86 函式库在运作时使用到了 86Duino 内部 MCM Timer,故无法与其他也使用同一个 MCM Timer 的函式库同时运作,如 TimerOne 函式库。


函式庫參考主頁面

86Duino参考的文本已在Creative Commons Attribution-ShareAlike 3.0 License下许可。引用中的代码样本已发布到公共领域。