2015/03/31

[nrf51][memo]nRF51 SDKドキュメントのシーケンス

いつも探してしまうので、メモを残す。

nRF51 SDKドキュメントにアプリとSoftDeviceのシーケンス図がある。
場所は「API Reference > S110(BLE peripheral) > xxx > Message Sequence Charts」の中。
たとえば、ここ、とか、ここ、とか。

以前は、ページだけでシーケンス図が載ってない時代もあったんだけど、さっき見た限りでは大丈夫そうだ。


アプリとSoftDeviceの図ではあるのだが、PEERというライフラインが出てきているので、これで無線のシーケンスもある程度は意識できるかもしれん。

まあ、まだまだ普通の勉強をしてからですな。

2015/03/30

[nrf51]SDK v8.0になって、また仕様が変わる

久々にnRF51822を触ろうと思い、まずはSoftDeviceをv8にした。
そしてSDKもv8.0にしたのだが、以前作っていたアプリにmakeが通らない。
まあ、いつものことだ。

今見つけたエラーは、APP_TIMER_INIT()というマクロ。
引数が4つあるんだけど、4番目の仕様が変更になったみたいでね。
以前まではboolで、スケジューラを使うかどうかという選択だったものが、今回からスケジューラのイベントハンドラを指定するようになったのだ。
どうも、スケジューラを使う場合は、includeするのがapp_timer_appsh.hになって、APP_TIMER_APPSH_INIT()というマクロになるっぽい。

ボタンの初期化はAPP_BUTTON_INIT()だったけど、こっちは定義すらない。
app_button_init()のコメントにはマクロを使えって書いてあるのに・・・。
サンプルではbspにあるものを使っていて、見るとapp_button_init()を呼び出していた。

 

うん、なるべく最新を追っていこうと思っていたけど、もう限界だ。
うちのチップではSDKがv6.1.0まで(SoftDeviceはv7.0.0)ってなってることもあるし、今回は見送ろう。
SDKはv7.2.0、SoftDeviceはv7.1.0にしておこう。

最新版を見送るって、なんか勇気がいるのよね。

2015/03/29

[mbed]Publishしてみた

mbedにLCDを挿したとき、ライブラリがあったのでimportし、すぐに使えた。
だから私も、RC-S730のライブラリをimportできるようにしておこうと考えた。

これは「Publish」というメニューからできるようだ。
まだコミットしてなければ、commitを求められる。
次にPublishのダイアログが出てくるので、適当に埋めればおしまい。

http://developer.mbed.org/users/hiro99ma/code/RCS730/

 

Publicも2種類あって、Activityの欄に出てくるPublicと、出てこないPublic(unlist)。
なるべく英語で書いてみたんだけど、まあ、単語が並んでたらわかるだろうレベルでやっている。

 

APIドキュメントが最初出なかったんだけど、Compileボタンをプルダウンすると「Update Docs」というのがあって、それやると出てきた。
出てきたけど、中身が空っぽで・・・。
Doxygen形式にするんだけど、classに対してbriefに相当するものを書かないとまったく出てこないようだ。

こうやって見ると、コールバックが不親切だな。
FeliCa Linkが返すデータ形式を呼び出し側でわかってないとうまくいかないようになっている。
改良の余地はあるけど、ドキュメント見ながらじゃないと使わないだろう、とか思ってしまい、このままになっている。
まあ、いいか。

[mbed]NUCLEO-F411REのデバッグ

FeliCa Linkのライブラリをmbedで作っていたのだけど、ちょっとバグっていた。
はて、mbedのデバッグってどうやるんだろう?

あまり深く考えず、ProgramをKeil形式でエクスポートし、Keil5で開いた。
Keil4形式のプロジェクトだったためか警告が出たが、開ける。
ビルドするとヘッダでエラーが出たが(SPI関係のマクロがないとか)、使ってないのでコメントアウト。
そのままデバッグモードにすると、あっさりデバッグできた。
ブレークポイントにも止まるし、ウォッチもできる。

そんなわけで、特にデバッグについて注意するようなことはなかった。
便利なもんだねぇ。

[felica]FeliCa Linkの読み書き時I2Cパケット

前回「動いた」と記事にはしたのだが、それだけだと味気がないので波形を取った。
が、それを全部載せるとわかりにくくなるので、ロジアナにパケットだけを抜き出してくれる機能があったから、それを使ってみた。
なお、うちのロジアナはZeroPlusのLAP-Cだ。

今回は、Plugモードで動かし、R/WからはPage0へRead without Encryptionを行っている。

image

image

以下で、簡単に説明をしていく。
ユーザマニュアルの「7.2.2 FT転送設定」を参照しながら読んでいただくとよろしいか。

IRQの立ち下がりをトリガにしてキャプチャしている。
なお、FeliCa Linkのデフォルト状態ではIRQ割込設定(割込マスクレジスタ)は全部マスクしてあるので、どこかで許可させる必要がある。
マスク設定はNon-Volatileで保持されるので、一度変更しておけばよい。
外すマスクは、ユーザマニュアルの推奨に合わせてint_tag_rw_rx_done2にした。

作ったソフトでは、mbedの起動時にPlugモードへの変更(動作モード設定レジスタ)とマスクの設定を行い、IRQ待ちにしている。
そして、R/WのPaSoRiからRead without Encryptionを行っている。
Androidとかで試すと準備がいらなくてよいのだが、どういうアクセスの仕方をされるかわからないので、Windowsで作ったアプリを使ってアクセスさせた。

 

IRQ割込が来たときには、既にメモリの0x0C00から読み込んだデータが入っているので、それを読込む。
のだが、まずは割込み要因を調べるため、割込ステータスレジスタ(0x0B28)を4byte読込んでいる。
なおレジスタアクセスは、アドレスはビッグエンディアンで書込み、レジスタ値はリトルエンディアン(4byte)になっている。
よってここでは、0x00000008が読み込めたことになる。

int_tag_rw_rx_done2での割込だったことがわかるので、ようやく0x0C00のデータを読みにいく。
ここでは、まず12byte読込み、まだ読込む必要があれば再度読込みにいっている。
が・・・なんだこの12byteって・・・。
返信するときのデータ長が最短でも12byteになるから、それと間違えているな。
R/Wから来るデータの最短は16byteになるので、あとで修正しておこう。
mbedの汎用I2C APIを使っているからこういう書き方にしたが、自分でI2C含めて書くのだったら、最初の1byteでLENを取って、あとはLEN-1回回すような作りにするだろうな。

image

ブロックリストは、本来2byteタイプと3byteタイプがあるのだが、R/W側のアプリは2byteタイプでしかアクセスしに来ないので、割り切って作っている。

 

レスポンスデータも、同じく0x0C00に書込むことになっている。
ただ、いくつかのデータについてはFeliCa Linkが自動で作成することになっているので、ここでは変更が必要なところしか書き換えていない。
上の図でいえば、白い部分(ST1, ST2, ブロックデータ)が必要な箇所になる。
レスポンスデータの書き込みが終わったら、FeliCa Linkにそのことを通知(タグモード送信制御レジスタ)のtag_rf_send_enableに1を立てて書込む。
そうすることで、FeliCa LinkはR/Wにレスポンスを返してくれる。

最後に、割込クリアレジスタに書込んで、割り込み要因を消している。
この動作が必要かどうかは調べてないのだが、わざわざ用意しているくらいだからやるんだろう。
IRQ端子の説明としても、マスクされていない割込が1つ以上発生している場合、となっている。
このレジスタに書込んでから25usecくらい後にIRQ=Hになっているから、やるのかな。

 

Write without Encryptionの場合は、こんな感じ。
スレーブアドレス0x3Eはデバッグで使っているLCDなので、気にしないでおくれ。

image


なお、ここには出てこないが、RFDETは特に使っていない。
割込はさせてるけど、それでLEDを点灯させている程度だ。