nRF51のブロック図を見ると、SPIやらI2C互換やらのシリアル通信ブロックがあるのだけど、ピンアサインを見てもGPIOくらいしか出てない。
どうなっとるんじゃ?
nRF51のリファレンスマニュアル「9. Peripheral interface」を見ると、APBとAHBをtask/event/interruptレジスタで触ることができるって書いてある。
機能ごとに0x1000の固定ブロック=1024レジスタが割り当てられていて、それを使ってAPBにアクセスするようだ。
このブロックがID0~31ある。これをPeripheral IDと呼んでいる。
メモリマップではAPB peripheralsって書いてあるところだな。
Table 3にPeripheral instantiationという表があり、IDと機能の対応が見て取れる。
Tasksは、機能に働きかけるトリガ。「開始せよ」みたいな。
Eventsは、機能の変化通知。「状態が変わった」みたいな。
Shortcutsは、taskとeventの接続。接続・・・? eventが発生するとtaskが自動的にたたかれるらしい。
Interruptsは、CPU例外処理の、いわゆる割込。
え、これで説明終わり?
どうやってGPIOの割り当てを変更したりするの?
しょうがない、SPIの説明を読んでみるか。
ふむふむ、PSELSCK / PSELMOSI / PSELMISOのレジスタがあり、それにピン番号を書き込むようだ。
動的に変更できるってことですか。。。まさにGeneral Purpose。
しかし、ソフト的に変更できるっていうことは、多少の遅延が発生するのかな?
まあ私が作るようなソフトだったら影響はないだろうけど。
サンプルソースも見てみた。
SDKにレジスタを初期化するソースまで入っているので、全部書かなくてもよいみたいだ。
まあ、自分で書いた方がサイズは小さくなるかもしれんがね。
ちょっと嫌なのは、引数で初期値を渡すのではなく、"spi_master_config.h"というファイルに決められたマクロでピン番号などを書いておかないといかんところか。
まあ、メモリも少ないことだし、引数渡しなんかするよりは直接埋め込んだ方がよいってことなのかな。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。