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 函式庫。


函式庫參考主頁面

The text of the 86Duino reference is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.