NXP JN516X (TWELITE) をプログラミングする(WPAN)

無線機能も思いっきりハマッてしまった。これだけでどれくらい時間を使ったのかも分からないくらいだ。(-_-;)

IEEE802.15.4のAssociateシーケンスのindicateまでは正常に動作するがその後のdata-requestがタイムアウトになってしまう...

data-requestが送信されていないのか受信できていないのかはわからないがアプリ側でdata-requestを送信してみても通常のデータ送信と認識されてしまう。とにかく何をしても解決できないしIEEE802.15.4のプロトコルは起動時のネットワークスキャンに時間がかかるため省電力型のモデルには適さないということもわかった。

なのでTWELITEのように独自プロトコルにすべきという判断に落ち着いてしまった。先駆者であるモノワイヤレス社の判断が正しかったということが自分でやってみてようやくわかった気がする。

こういう通信デバイスでは重複パケットを除去するのもアプリ側の仕事だったりする。NXP社が公開しているサンプルプログラム(AN-1174)のように送信毎にインクリメントするカウンターをペイロードに含ませて受信側で重複パケットを除去するのも注意が必要だ、

例えば8bitのインクリメントカウンター値を送信するとして256個の通信相手に順番に送信するとカウンターが一回りしてしまうため二回目以降の通信が全て重複パケットと見なされ通信できなくなってしまう事態が発生してしまう。また順不同で送信した場合にたまたまカウンター値が重なってしまうことも起こりえるだろう。滅多に起きないエラーは本当に苦労するので確率が低いからといっても妥協するべきではない。そういうことが起こらないようにするには通信相手毎にカウンターを管理すればいいだけだ。

デバイスにゼロから(WPAN_MAX_DEVICES-1)までのアドレスを割り振るだけで同じPanIDとChannelをもつデバイス同士で通信可能となる。親とか子とかの概念もないのでいつでも自由に通信可能だ。

送信時にu8Handle引数にゼロ以外を指定するとACK要求モードとなり規定回数のリトライが行われ送信処理には4-20ms以上かかる。u8Handle引数にゼロ指定するとACKは確認せず2ms以上で処理が完了する。

受信するとWPanReceiveCallbackが呼び出され、送信完了時にWPanTransmitCallbackが呼び出され送信結果が確認できる。

ちなみにWPan::handle()はバックグラウンド処理(yield)から呼び出されることに注意しよう。

【エコーバックのサンプル】

【修正履歴】
2022-11-07
下記関数を追加。
void setPanId(uint16 u16PanId);
uint16 getPanId(void);
bool setShortAddress(uint16 u16Addr);
uint16 getShortAddress(void);
void getMacAddress(MAC_ExtAddr_s &addr);

2022-06-02
AESライブラリを作ったのでWPanクラスのセキュリティ対応を行った。規定で有効になっているのでwpan_security.hの設定を事前に変更しておく必要がある。特にWPAN_SECURITY_KEY_DATAの設定は重要なので漏洩がないよう注意して管理してほしい。

2022-05-17
OTA対応により無線でファームウェア更新が可能に。OTA更新処理中にリセットがかかるがその直前でWPanOTAStartCallbackが定義されていれば呼び出される。アプリは新設したreTransmit()を利用するだけで再送処理が行えるようになった。

2022-05-04
divu64u64()がまだバグッてたので再修正。

2022-05-03
TickTimerクラスとdivu64u64()の致命的なバグ修正。その他いろいろ修正したり改良してみた。

2022-04-27
インクルードの循環参照による不具合を避けるためコードを.cppに移動。プロジェクト・プロパティの設定ミスの修正。muldivとtaskライブラリの追加。バックグランド処理のマルチタスク対応など大幅改修。
それとJN5164では_stack,endシンボルが未定義というリンクエラーが出ることがある。JN5164用のSDKのリンカーファイルに不備があるためで開発用プロジェクトに含まれているAppBuildEnd_JN5164.ldを使用することで解決できる。readm.txtを見てSDKのファイルを更新してほしい。

2022-04-21
数字だけだとなんだかよくわからないので通信周波数のチャネル定義を追加。日本は11-26の範囲でのみ利用可能。

【BeyondStudioプロジェクト(ソース一式)】
JN5164-SW4165-bstudio.zip

ちなみにSDK(JN-SW-4165)はJN5169(TWELITE-RED)に対応していないようだ...JN5169な人はMONOSTAGEを利用すること。

NXP JN516X (TWELITE) をプログラミングする(Eclipse-CDT+MWSTAGE)

IEEE802.15.4の世界を自由に楽しもう!!

【ライブラリ】

【関連投稿】
NXP JN516X (TWELITE) をプログラミングする(開発環境の構築)
NXP JN516X (TWELITE) をプログラミングする(メイン・ルーチン)
NXP JN516X (TWELITE) をプログラミングする(TICKTIMER)
NXP JN516X (TWELITE) をプログラミングする(UART)
NXP JN516X (TWELITE) をプログラミングする(SYSTEM)
NXP JN516X (TWELITE) をプログラミングする(GPIO)
NXP JN516X (TWELITE) をプログラミングする(TIMER)
NXP JN516X (TWELITE) をプログラミングする(ALARM)
NXP JN516X (TWELITE) をプログラミングする(WAKETIMER)
NXP JN516X (TWELITE) をプログラミングする(WATCHDOG)
NXP JN516X (TWELITE) をプログラミングする(I2C)
NXP JN516X (TWELITE) をプログラミングする(SPI)
NXP JN516X (TWELITE) をプログラミングする(ADC)
NXP JN516X (TWELITE) をプログラミングする(COMPARATOR)
NXP JN516X (TWELITE) をプログラミングする(CLOCK)
NXP JN516X (TWELITE) をプログラミングする(BROWNOUT)
NXP JN516X (TWELITE) をプログラミングする(PULSCOUNTER)
NXP JN516X (TWELITE) をプログラミングする(INFRARED)
NXP JN516X (TWELITE) をプログラミングする(RANDOM-GENERATOR)
NXP JN516X (TWELITE) をプログラミングする(FLASH)
NXP JN516X (TWELITE) をプログラミングする(EEPROM)
NXP JN516X (TWELITE) をプログラミングする(WPAN)
NXP JN516X (TWELITE) をプログラミングする(Eclipse-CDT+MWSTAGE)
NXP JN516X (TWELITE) をプログラミングする(乗算と除算)
NXP JN516X (TWELITE) をプログラミングする(マルチタスク)
NXP JN516X (TWELITE) をプログラミングする(フラッシュ・プログラマー)
NXP JN516X (TWELITE) をプログラミングする(OTA UPDATE)
NXP JN516X (TWELITE) をプログラミングする(TWELITE CUE/MC3630)
NXP JN516X (TWELITE) をプログラミングする(LED)
NXP JN516X (TWELITE) をプログラミングする(AES)
NXP JN516X (TWELITE) をプログラミングする(Downloads)