• 沒有找到結果。

使用 Simple Flooding Protocol 的 WINS 設計

在文檔中 中 華 大 學 (頁 43-47)

第三章、 可由使用者程式化的 WINS

3.6 使用 Simple Flooding Protocol 的 WINS 設計

每個循環中,不管是傳送自身的資料,或是轉交(forward)其它 node 送出之資料,node 只會做一次資料傳輸,然後進入睡眠。在低資料率的傳送需求時,這是一個節省能源的 好方法。引用[13]中的狀態圖如圖 17 所示:

圖 17:SFP 的狀態圖(從[

13

]中節取出)

3.6.2 實現 Simple Flooding Protocol 的研究

從 SFP 的論文[13]所繪出的流程圖(圖 18)之中,可列出欲以 script command 實現 SFP 所需的要件,並加上數字標記 1 至 17,以加速程式寫作:

1. 從 2、6、13、14 中,知道必須有四個計時器以製成:

z

Round Timer

z

Contention Slot Timer

z

Forwarding Slot Timer

z

Sleep Timer

2. 從 1、3 中,知道必須有開關無線模組的指令設計:

3. 從 10、11、15、16 中了解必須有解傳輸封包的能力:

仔細檢查 script 所提供的功能之後,發現目前所提供的 3 個使用者 timer 不足,故多設 計了 3 個 timer,使用者 timer 數量增加成了 6 個,如此便可達成需求。

圖 18:SFP 的程式流程圖

3.6.3 以 script 實現 Simple Flooding Protocol

不同於前兩個實作的設計流程,因為已有了詳細的流程圖,可直接進行表格式程序寫作:

表格 8:SFP 之程式設計命令表

Line # Function Block Instruction

Byte1 HEX

Byte2 HEX

Remark / 說明

0 #12H -> Reg0 48 12 立即值放入 R0 中

1 #12H -> Reg1 49 12 立即值放入 R1 中

2 #12H -> Reg2 4A 12 立即值放入 R2 中

3

Set RF Address 1212121212H

#12H -> Reg3 4B 12 立即值放入 R3 中

Line # Function Block Instruction

Byte1 HEX

Byte2 HEX

Remark / 說明

4 #12H -> Reg4 4C 12 立即值放入 R4 中

5 Set RF Address 3A 00 設定 RF Address 為從 R0 開始的 5 個位置內容

6 Set RF Channel 06H Set RF Channel 38 06 設定 RF channel 為 06

7

WINS_ID (R16) is from P2

Read P2 -> R16 19 14 Reg16 中置放此一 node 之 Addr.

8 Turn on Timer 2 42 41 啟動 timer2 (contention slot timer) 9 Turn on Timer 3 42 61 啟動 timer3 (round timer) 10 Turn on Timer 4 42 81 啟動 timer4 (sleep timer)

11 Set RF=Rx 39 01 設定 RF 為接收模式

12 Disable RF 3E 00 Disable RF

13 #00H -> Reg0 48 00 清除 forward slot 為 0 14 #00H -> Reg1 49 00 清除 forward slot 為 0 15

Sleep state:

1

Set Timer 1 42 20 清除 forward slot timer

16 2 JNTimer 3, 0 37 60 到了 next round 了嗎?, 否則跳至自己

17 # -> Reg0 48 D0 設 Rount Timer=0.5sec

18 # -> Reg1 49 07 設 Rount Timer=0.5sec

19 Set Timer 3 42 60 設 Rount Timer

20 3

Enable RF 3E 01 醒來, Enable RF 接收 21 Reg 19 -> Acc 23 13 Reg 19 -> Acc 22

4

JNB.7, +2 35 02 Reg19 資料 bit7 為 0 表自身無資料 pending

23 跳至5 JMP 40 30 28 跳至 Contention state

24 Forwarding state: # -> Reg0 48 20 設 Sleep Timer=0.2sec

25 # -> Reg1 49 03 設 Sleep Timer=0.2sec

26 Set Timer 4 42 80 設 Sleep Timer

27 Get RF status 3B 1E 讀 RF Status -> Reg30 (Acc) 28

10, 11, 12

JB.0, +2 34 02 若有資料收進來則跳

29 JMP 38 30 26 沒資料, 等看是否該 sleep 了

30 Get RF data 3D 14 Get RF data -> Reg20~Reg26 31 #00H -> Reg0 48 00 設定 forwarding slot ?? 與 ID 有關 32 #01H -> Reg1 49 00 設定 forwarding slot ?? 與 ID 有關 33

14

Set Timer 1 42 20 設定 forwarding slot ?? 與 ID 有關

34 15 JNTimer 1, +4 37 14 forwarding slot 未結束便檢查是否要 sleep 了

35 Set RF = TX 39 00 Set RF=TX

36 17

Send RF data 3C 14 送出 Reg20~Reg26 資料(forward)

37 跳回1 JMP 11 30 0B 跳至 Sleep state

38 JTimer 4,-1 36 5F 若 Sleep 已到, 則跳至等待下個 round

39 跳至10 JMP 27 30 1B 跳回等待資料

Line # Function Block Instruction

Byte1 HEX

Byte2 HEX

Remark / 說明

40 Contention state: Turn on timer 2 42 41 Turn on contention timer

41 5 JNTimer 2,+4 37 44 若 contention timer 未到, 表仍有 slot 42 #00H -> Reg0 48 00 設定 contention slot ?? 與 ID 有關 43 #01H -> Reg1 49 00 設定 contention slot ?? 與 ID 有關 44

6

Set Timer 2 42 40 設定 contention slot ?? 與 ID 有關, start timer 45 Get RF status 3B 1E 讀 RF Status -> Reg30 (Acc)

46 7

JNB.0, +3 35 03 若無資料收進來則跳

47

有資料進來, 保留 contention slot

Turn off timer 2 42 40 Turn off contention timer

48 跳至10 JMP 24 30 18 跳至 Forwarding state

49 8 JNTimer 2,-4 37 5C 若 contention timer 未完,則繼續監視接收

50 Set RF = TX 39 00 Set RF=TX

51

9送出自身資料

Send RF data 3C 10 送出 Reg16~Reg22 資料

52 跳回1 JMP 11 30 0B 跳至 Sleep state

在實作此通訊協定時我們發現到,如果使用 ShockBurst Mode 來進行監聽以達成 Carrier Sense 時會有遺漏的情形發生,在空中交通有碰撞發生時 nRF2401 不會回報,使 得 MCU 以為當時空中無資料傳輸行為,若此時 MCU 也將資料發出,也將會造成碰撞。解 決此問題的方法有兩個:

1. 使用另一個 nRF2401:設定在 Direct mode,讓它去監聽空中的通訊,即使是有碰 撞情形發生,MCU 亦可以在這第二個 nRF2401 的 DATA 腳了解狀況;而原來的 第一個 nRF2401 仍是在 ShockBurst Mode,在資料完整接收時會告知 MCU,這 樣可以減低 MCU 的工作負擔。

2. 將 nRF2401 設定在 Direct mode 下工作:不使用 ShockBurst Mode,MCU 自行 處理所有時序及發送、接收動作;只是這樣一來,MCU 的工作量便會激增,而且 原有之 firmware 必須大幅修改。

在文檔中 中 華 大 學 (頁 43-47)

相關文件