第三章、 可由使用者程式化的 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 Timerz
Contention Slot Timerz
Forwarding Slot Timerz
Sleep Timer2. 從 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 必須大幅修改。