XM板卡沒有像RM板卡有自動化的XTAG,所以需要自己告 訴板卡要過濾哪些包。
XTrailer是類似XTAG,在封包裡頭加特定標記, 但這標記是用來取裡頭Timestamp欄位用的,不是要達到的功能。在XM板卡上,有一個作法可以達到--「Trig ger」。就是觸發的意思, 告訴Rx端哪類型的封包, 需要被觸發。說明如下:
設定Tx端:
|
DA(6)
|
SA(6)
|
Type(2)
|
IPHeader(20)
|
Payload
|
CRC(4)
|
假設自定義的欄位裡頭,自行插入4byte標記,以插入「Xtr a」這四個字為例,16進制值為「0x58 0x74 0x72 0x61」, Tx端封包變成類似如此:
|
DA(6)
|
SA(6)
|
Type(2)
|
IPHeader(20)
|
58
|
74
|
72
|
61
|
00
|
……
|
CRC(4)
|
這四個byte是給Rx端觸發的,所以等 等Rx端也要設定此條件,才搭配的起來。
設定Rx端:
Rx端必須設定這個function - Nu_XM23L4_StartTriggerCounter( chassis, board, port, triggerSetting)
使用到「XM23L4_STARTTGRCTR_T」 這個結構體,裡頭結構很簡單,一組三個欄位,
告訴XM-23L4要觸發的「位置,值,和長度」,可以設定6組 (API寫8組,實際只用到6組)。
告訴XM-23L4要觸發的「位置,值,和長度」,可以設定6組
以上面例子來說,我要觸發從第35個byte(DA+SA+ Type+Header用掉34個bytes)開始,長度為4b ytes,
值為0x58, 0x74, 0x72, 0x61。那我就這樣設定:
值為0x58, 0x74, 0x72, 0x61。那我就這樣設定:
XM23L4_STARTTGRCTR_T trigger;
memset(&trigger, 0, sizeof(XM23L4_STARTTGRCTR_T));
trigger.trigger1_offset = 35;
trigger.trigger1[0] = 0x58;
trigger.trigger1[1] = 0x74;
trigger.trigger1[2] = 0x72;
trigger.trigger1[3] = 0x61;
trigger.trigger1_len = 4;
trigger.trigger_ctrl = 0x1;// 0b11111111, 從右到左分別是trigger1, 2, ..., 8。 設定trigger1, 就設0x1
Nu_XM23L4_StartTriggerCounter(
|
Rx端在Tx端打包之前,經過 以上設定,那我在counter裡頭就可以看到「RxTrigg erN」這些欄位,會有值出現了。
沒有留言:
張貼留言