LPC810でI2C slave動作に成功

LPC810のデータシートを読み、妄想中の回路(UVEPROMライタとかロボットの関節とか)と照らし合わせ、いけるんじゃないかという感触をもった。本気で取り組むと決めたときの恒例で、部品を真俯瞰から撮影。とはいえ、この先の工程を味噌汁の歴史にたとえると現在は麦の粒が蒸せば食えるものだとわかった段階。まだ味噌も出来上がっていない。次の小さな目標はGPIOやタイマやコンパレータを動かしてみることにあり、これらが動いたかどうか知る手段として、ここ数日、I2Cに取り組んできた。

LPC810M021FN8

実験中の回路を下に示す。マスターは何でもいいのだけれどマスターのプログラムにバグがあると面倒なことになるのでI2Cの取り扱いが比較的簡単なArduino、というか3.3V動作に組み立てたUncompatino。スケッチは1秒に1回、LPC810から1バイトを読み出してシリアルモニタに表示するというもの。LPC810はスレーブになり、マスターからいつ通信の要求があるかわからないので、割り込みで対応する。プログラムはROM APIを使う。そうでないとフラッシュメモリがすぐ満杯になってしまう。

LPC810_i2c_proto

I2Cは特別な機能ではなく、このくらいのことはすぐできると思ったが、予想に反して難航。最大の誤算は、うまくいかなかったとき参考になる事例がまったく見当たらないこと。LPC810をI2Cのスレーブにして、割り込みで対応し、ROM APIを使う、というのは、ごく自然な形だと思うが、少なくともインターネットを検索する限り誰もやっていない。もしかしたらやってみたけれど失敗したのかもしれない。

さんざん苦労したあげく、まがりなりにもLPC810のメモリに書き込んだ値を読み出すことができた。成功する直前にやったことはアドレスの見直し。arm系のライブラリはアドレスを8ビットで指定する傾向があるのに対し、Arduinoは7ビット。たとえばarm系で0x48と定義したものはArduinoだと(0x48 >> 1)になる。これで成功。このソースを公開すれば世界で最初の成功例となるかもしれないが、アドレスの違いに気付く前にいろいろやりすぎてどの時点で成功していたのかがよくわからない。だから、とりあえずこの間にやったことをまとめておく。

1.開発環境はLPCXpresso、ほかの環境(たとえばmbedオンラインコンパイラ)は失敗。
2.ライブラリはlpcopen_2_01_lpcxpresso_lpc812max.zip。ほかのライブラリは失敗。
3.プログラムはlpc812max_periph_i2c_rom_slaveを修正して利用。
4.開発環境でマイコンをLPC810、シンボルUSE_ROM_APIを定義、CRPを解除。
5.lpc812max_board_libのLEDのピンなどを変更。
6.ソースにスイッチマトリクスの処理を追加。
7.バグらしきものをあちこち修正したがどこを修正したのか確認中。

これで味噌を作る樽が出来上がった感じ。

広告
カテゴリー: LPC810 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中