LPC810を使ったUART-I2Cブリッジがやっと出来ました
ゼロからのLPC810の利用だったため、学ぶことが多くちょっと時間がかかりましたが、
とりあえずプログラムは完成です。
まだ未熟ですがソースを置いておきます(2015/04/18 ソースを更新しました)。
開発環境は LPCXpresso v7.6.2+CMSIS_CORE_LPC8xxです。
ダウンロード UART2I2C_050418.zip (226.9K)
コマンドマニュアル(PDF形式) 2016/07/16 追加
ダウンロード UART-I2C_DOCV1L3PDF.zip (279.3K)
以後、下記で修正版等を公開します。
https://github.com/Tamakichi/LPC810-UART-I2C-Bridge
シリアル通信でコマンドを流してI2Cバス接続のデバイスの操作ができるようになりました。
さすがにATtiny13Aよりは処理が早いです。
上の写真の表示をするには、次のようなコマンドをシリアル通信で送り込みます。
@cA000@h01380c
@cA080@sHello!World!
@cA000@hc0
@cA080@sThis is LPC810!
実行すると応答を返します(返さないように指定も可能)。
I2Cモジュールを気軽に調査できます。
シリアルからコマンド送信でユーザーフォント登録をやってみました。
デバイスの機能調査、テストがノープログラミングでできるのは意外と良いです。
IchigoJamにも接続してみました。(2015/04/18 追記)
ちゃんと表示出来ました。
IchigoJamのプログラムと実行はこんな感じです。
単純にプリント命令(?は PRINTの短縮)で出力してシリアル出力をしています。
"wait 10" で10ミリ秒の待ちを入れないと正常に動作しませんでしたが、
まあ、よいでしょう。
コマンドとしては次のようなものが使えます。(2016/07/14 追記)
一括データ送信 @w[I2Cアドレス][送信データ指定部][改行]
一括データ送受信 @r[I2Cアドレス][受信データ長][送信データ指定部][改行]
一括データ受信 @g[I2Cアドレス][受信データ長][改行]
1バイト単位データ送信 @c[I2Cアドレス][制御データ][送信データ指定部][改行]
送信データ指定部のデータを1バイトづづ制御データを付加
して個別のトランザクションにて送信します。下記と等価です。
@w[I2Cアドレス][制御データ][送信データ指定部1バイト目] [改行]
@w[I2Cアドレス][制御データ][送信データ指定部2バイト目] [改行]
@w[I2Cアドレス][制御データ][送信データ指定部3バイト目] [改行]
・・・・
また、送信データは次のような感じで指定します。
16進数可変データ @h[2桁16進文字列][2桁16進文字列][2桁16進文字列] …
可変文字列データ @s[文字列]
16進数可変データと可変文字列データは連結して利用することも出来ます。
@h0102ABabffCCcc@sHello!World@h1234
さらに、デバッグ用、受信データの形式指定、ウェイト時間指定、エラー情報指定を
行うコマンドがあります。
詳細については、別途記載する予定です。
さて、LPC810を使った感想ですが、
組み込み用 32ビットマイコンは意外と使いやすいですね。
もう、同じ8ピンのATtiny13Aを使う気にはなれません。
SRAMが1kバイトあるとデータ処理が楽できます。
ATtiny13Aの64バイトSRAMからすると1kバイトは広大な空間です。
ただし、ライブラリやドキュメントをもう少しなんとかしてほしいです。
LPCXpressoのlpc800_driver_libがダメすぎで、結局データシートを見て
UART、I2C回りの処理はほぼ自作になってしまいました(その分勉強になりましたが)。
UART、I2Cは割り込みを使わないで実装しました。
「ARM® Cortex™マイクロコントローラ ソフトウェア インタフェース規格(CMSIS)」
って何だったんでしょうかね。期待しすぎました。
結構ソースを書いた割にはプログラムサイズは3kバイト弱程度のサイズでした。
AVRよりも効率が良い感じです。
今後はLPC810を積極的に使っていきたいと思います。
回路図はこんな感じで、単純なものです。プログラムの作成に時間がかかりました。
スイッチマトリックスの3番ピン、4番ピンにI2CのSCL、SDAを割り当てています。
UART用に2番ピン、8番ピンにTXD、RXDを割り当てています。
手持ちのEEPROMへのデータの読み書き、リアルタイムクロックの設定、参照も
問題なく出来ました。
次の目標として基板実装して、石鹸(Nexx WT3020F)につなげてみたいと思います。
2015/04/19 追記
基板実装しました(不足気味、ブレッドボード2枚回収)。
裏は、段ボールをねじ止め
一応、今回は実装前に配線図をEXCELで作成しました。
IchigoJamに接続
問題なく動作しました。
2015/05/17 追記
エラーコードと補助コマンドについて追記します。
エラーコード
00 正常終了
01 タイムアウト
02 スレーブからNACKを受信
03 I2Cアドレス送信エラー(NACK)
04 スレーブにデータ送信でNACKを受信
05 データ受信失敗
0A コマンドエラー
0B 16進数文字異常
0C パラメタエラー
0D 未定義コマンド
0E 補助コマンドのみ指定
0F コマンドのデータがない
補助コマンド
補助コマンドについて
送受信コマンドに付加して利用します。
@iN :IchigoJamモード N:1 有効、0:無効 エラー通知等を REM(')文付きで帰す
@eN :エラー通知設定 N:0or1 0:通知なし(デフォルト) 1:通知あり
@oN :受信データ出力モード設定 N: 0:HEX(デフォルト) 1:バイナリ 2:16進ダンプ表示
@DN :デバッグ情報表示 N: 0:OFF 1:ON
@tCC :データ送信(1バイトづつ)のウエイト時間(msec)指定 CC: 00 ~FF
@TCC :即時ウェイト実行 時間(msec)指定 CC: 00 ~FF
@v :バージョン表示
2016/07/16 追記 コマンドマニュアル(PDF)より抜粋
関連記事
LPC810を使ったUART-I2Cブリッジの改良版が出来ました (16/07/21)
LPC810を使ったUART-I2Cブリッジの機能拡張の検討中 (16/07/13)
UART-I2Cブリッジの使い方 - リアルタイムクロックの調査 (15/05/17)
Wiiヌンチャクの動作確認しました (15/05/17)
LPC810を使ったUART-I2Cブリッジがやっと出来ました (15/04/15) [この記事です]
ATtiny13AでUART-I2Cブリッジを試作したが微妙 (15/03/29)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備3 (15/03/26)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備2 (15/03/25)
ATtiny13AでUART-I2Cブリッジの製作 - まずその準備 (15/03/24)
公開・ダウンロードサイト
GitHub - LPC810 UART-I2Cブリッジモジュール
« IchigoJamにプログラムをアップロード/ダウンロードするGUIツールを作成しました | トップページ | Aliexpressで注文した商品が40日経っても出荷されない »
「IchigoJam」カテゴリの記事
- Ichigojam Rが届きました(2021.02.05)
- β版 IchigoJam Rを予約注文しました(2021.01.23)
- IchigoJamのファームウェア 1.4.1が正式に公開されました(2019.12.10)
- 「ichigoツール」をGithubにて公開しました(2019.11.09)
- ichigojamのファームウェアを1.4b13にアップデートしました(2019.11.06)
「LPC810」カテゴリの記事
- MCUXpresso IDEのインストール(2019.02.12)
- LPC810を使ってIchigoJamで赤外線リモコン受信を行う(4)(2016.08.17)
- LPC810を使ってIchigoJamで赤外線リモコン受信を行う(3)(2016.08.15)
- LPC810を使ったUART-I2Cブリッジの改良版が出来ました(2016.07.21)
- LPC810を使ったUART-I2Cブリッジの機能拡張の検討中(2016.07.13)
コメント
« IchigoJamにプログラムをアップロード/ダウンロードするGUIツールを作成しました | トップページ | Aliexpressで注文した商品が40日経っても出荷されない »
いつもこちらを拝見させていただいております
自分の無い知識で1週間ほど悩みましたが、全く判らずご相談させてください。
秋月さんよりLPC810を購入しました
FlashMagicにてIchigoJamと同様にISPモードにしてソースファイルの中の”UART212C.hex”を書き込みました。
回路図を参考に2列20ピンのソケットが手元にありましたのでそちらで基盤を作成しました
記載のようにFlashMagicのターミナルにて”@cA000@01380c”などのコマンドを送信するのですが”00”の応答が帰ってきません
I2CのLCDは、中華1602LCDです
I2CにするためにアダプタSIENSMARTのLCD2004を付けています。
I2Cのアドレスは”0x27”です。
当方が何か見当違いのことをしていると思います。
どのあたりを見れば良いかご指摘いただけました幸いです
投稿: 後田 | 2015年4月29日 (水) 21時33分
後田さん
こちらこそ、いつもありがとうございます。
記事の内容、説明不足でご迷惑おかけします。
I2Cのアドレスは、R/Wを含めた8ビットを使用しています。
0x4Eを指定して下さい。
エラーコードについて
下記のものがあります。0x4Eを指定しても00が帰らない場合の
参考にして下さい。
00 正常終了
01 タイムアウト
02 スレーブからNACKを受信
03 I2Cアドレス送信エラー(NACK)
04 スレーブにデータ送信でNACKを受信
05 データ受信失敗
0A コマンドエラー
0B 16進数文字異常
0C パラメタエラー
0D 未定義コマンド
0E 補助コマンドのみ指定
0F コマンドのデータがない
補助コマンドについて
送受信コマンドに付加して利用します。
@iN :IchigoJamモード N:1 有効、0:無効 エラー通知等を REM(')文付きで帰す
@eN :エラー通知設定 N:0or1 0:通知なし(デフォルト) 1:通知あり
@oN :受信データ出力モード設定 N: 0:HEX(デフォルト) 1:バイナリ 2:16進ダンプ表示
@DN :デバッグ情報表示 N: 0:OFF 1:ON
@tCC :データ送信(1バイトづつ)のウエイト時間(msec)指定 CC: 00 ~FF
@TCC :即時ウェイト実行 時間(msec)指定 CC: 00 ~FF
@v :バージョン表示
投稿: たま吉さん(管理人) | 2015年4月29日 (水) 23時17分
早速のお返事ありがとうございます
帰宅後試してみたいと思います
取り急ぎ、御礼申し上げます
投稿: 後田 | 2015年4月30日 (木) 12時46分
後田さん
"アダプタSIENSMARTのLCD2004"を使ったLCDの制御はちょっと面倒そうです。
このアダプタはI2Cバスを8ビットのパラレルバスに拡張するICが使われているのですが、
その8本のバスのうち4本をLCDデータバス用、他をLCDのRS(Data/コマンド切り替え)、R/W(Read/Write)、
バックライト(ON/PFF)、E(Enable signal)に等に割り当てています。
LCDを4ビットバスモードで使うので、コマンド、データとも2回に分けて送信する必要があります。
文字コードは上位、下位の2バイトに分け、RS、R/W、バックライト、Eの設定を付加して送信する必要があります(たぶん)。
投稿: たま吉さん(管理人) | 2015年5月 4日 (月) 09時18分
お返事ありがとうございます
恥ずかしながら、まだ上手くいっておりません
確かにArduinoでも、他のI2CのLCDライブラリと違いました
その後、秋月の”ACM1602N1-FLW-FBW”(3.3v可動)を購入しました。写真だけ見ると同じものかな?と思い購入した次第です。
これだとアドレスを8bitに変換するとA0となり
@cA000@h01380c
デバグモード@D1で見てみると
[ text=@cA000@h01380c len=6 cmd=c A0 00 01 38 0c ]
03 が表示されます I2Cアドレス送信エラー(NACK)
後半の 01 38 0c がLCDの初期化のコマンドだと思うのですがそれがどうしても通りません
本日、LPC810を焼き直しましたが同じ症状のままです
うーん、何が違うんでしょうか?
また、何か思い当たればご教示願います
投稿: 後田 | 2015年5月 5日 (火) 22時01分
後田さん
>お返事ありがとうございます
>恥ずかしながら、まだ上手くいっておりません
こちらこそ、情報提示が不十分で申し訳ないです。
"ACM1602N1-FLW-FBW"は、私が利用しているものと同じです。
アドレス、コマンドの内容は正しいです。エラーコード03が返されるとなると
考えられるのはSCL、SDAの接続が正しくない可能性があります。
まずはArduinoで動作確認してから、SCL・SDAをLPC810に接続してみてはどうでしょうか?
サンプルが下記のサイトにあります。
ArduinoでI2C制御LCD ACM1602を使う(1)
http://www.eleki-jack.com/mycom2/2012/05/arduinoi2clcd_acm16021.html
これでLPC810のみダメなら、私のプログラムに問題があるかもしれません。
投稿: たま吉さん(管理人) | 2015年5月 6日 (水) 00時15分
お返事ありがとうございます
Arduinoで試しましたがサンプルコードで表示できませんでした
当方の機器に問題が有るようです
LCD,ジャンパケーブルなどすべての部品を入れ替えして試してみたいと思います
度々、ご迷惑をお掛け致しましたことお詫び申し上げます
投稿: 後田 | 2015年5月 6日 (水) 07時29分
ありがとうございます
先ほど接続に成功しました
原因は、ブレッドボードと自作基板に有ったようです
ハンダ付けのときに、ブレッドボードにピン足を刺して使用した場所が接触が悪かったようです
自作基板も背面のハンダ付けが悪かったようです
別のブレッドボードで再度組み直したところあっさりできました
何度もご質問させていただきご迷惑をお掛け致しました
投稿: 後田 | 2015年5月 6日 (水) 20時42分
後田さん
ご報告ありがとうございます。
ブレッドボード、ジャンパワイヤーの接触不良は
私もハマったことがあります。
原因が分かって何よりです。
投稿: たま吉さん(管理人) | 2015年5月 6日 (水) 22時23分
質問宜しくお願いします。 I2Cアドレスですが 0x50の場合は0xA0になるとすれば液晶のアドレス
+0x50すればよいのでしょうか?
投稿: abe | 2016年7月10日 (日) 09時33分
abeさん
このUART-I2Cでは8ビットで指定しています。
[A6][A5][A4][A3][A2][A1][A0][RW]
A6-A0: I2Cデバイスの7ビットアドレス
RW: 0を設定
I2Cデバイスの7ビットアドレス(A6-A0)が0x50とすると、
1ビット左にシフトした値(=2倍にした値)となります。
計算式は
指定I2Cアドレス = I2C7ビットアドレス<<1 または
指定I2Cアドレス = I2C7ビットアドレス x 2
です。
I2C7ビットアドレスが0x50とすると
指定I2Cアドレス = 0x50 << 1 = 0xA0 または
指定I2Cアドレス = 0x50 x 2 = 0xA0
となります。
ARM系のソースでは8ビット指定がデフォルトのようなので8ビット指定にしたのですが、
7ビットアドレスをそのまま指定する方が良かったですね。
投稿: たま吉さん(管理者) | 2016年7月10日 (日) 12時10分
おかげ様で 秋月 ACM1602の表示ができました
ありがとうございます 同時購入のOLED SO1602AWWBで
コマンドを送ってもエラー 03 0Aで困っていました アドレスは0X3Cなので 0x78で
送っています 初期化コマンド 0x01、0x02、0x0f、0x01がうまく通らないようでした
尚 Arduinoでは表示できました
お手数をおかけしますが 宜しくお願いいたします
投稿: abe | 2016年7月10日 (日) 15時51分
abeさん
SO1602AWWBを持っていないので、原因特定は難しいですが、
エラーが03と0AだとI2Cアドレスが正しくないか、SO1602AWWBが動作していない
2つのパターンが考えられます。
アドレス指定は正しいと思いますので、SO1602AWWBを疑うと
特に下記のピン接続が疑わしいですが、
No 4ピン SA0 (Slave address)
No 3ピン /CS (Chip Select Signal)
No 8,9ピン SDA_in、SDA_out
arduinoで動くとなるとこのあたりも正しく接続&処理していると思われます。
「UART-I2Cブリッジ」に問題がある可能性があります。
現状はこれ以上アドバイス出来ませんが、
SO1602AWWBはちょうど私も目を付けていた製品です。
機会があれば、私も入手して動作確認したいと思います。
現在、実験でI2Cスレーブがフリーズした場合に”I2Cバスリセットコマンド”が無いのは
ちょっと不便と考えており、これを機会に改造&修正を考えています。
投稿: たま吉さん(管理者) | 2016年7月10日 (日) 20時15分
こんばんは
特に緑色の表示器はとても目立ってきれいに表示します
細かいものが見にくくなって来た、私にとってはとてもありがたい表示器です
ぜひお願いいたします
投稿: abe | 2016年7月10日 (日) 21時36分
大変失礼しました
御推察のとおり OLEDの9番端子をつないでいませんでした
00が戻るようになり
@c7800@h01
@c7840@sar
@c7840@sig
@c7840@sato
で画面にarigatoが出ますが 文字が出たりでなかったり?の時があります
写真を送りたいのですがどうすればよいでしょうか?
投稿: abe | 2016年7月10日 (日) 22時33分
abeさん
>>写真を送りたいのですがどうすればよいでしょうか?
公開して問題の無い内容でしたら、下記の画像アップローダにアップしてそのリンクアドレスを教えて下さい。
http://s1.gazo.cc/
投稿: たま吉さん(管理者) | 2016年7月10日 (日) 23時53分
OLED白の表示です
http://s1.gazo.cc/up/199335.jpg
投稿: abe | 2016年7月11日 (月) 22時20分
abeさん
写真ありがとうございます。OLED白、発色いいですね。
欲しくなり、秋月電子(通販)で注文しました。
>>文字が出たりでなかったり?の時があります
製品が届いたら試してみます。
投稿: たま吉さん(管理者) | 2016年7月11日 (月) 23時49分
abeさん
OLED到着しました。
私自身、UART-I2Cブリッジのコマンド仕様をすっかり忘れていました。
現在コマンドリファレンスを作成しており、近々公開いたします。
SO1602AWWBでの初期化及び"Thank you!"の表示は初期化、とメッセージ表示を分けると
次のような感じになります(カーソル消去しています)。
@c7800@h01020c0180 (2016/07/16 訂正)
@c7840@sThank you!
@cと@wのコマンドの違いの説明記載が不十分でした。
@cはデータ部のデータを制御コードを付けて1バイトずつ別トランザクションとして送信します。
@c7800@h01020c01 は次のコマンド4回送信と等価です。
@w78@h00@01 : クリアディスプレイ
@w78@h00@02 : リターンホーム
@w78@h00@0c : 表示ON(カーソル無し)
@w78@h00@01 : クリアディスプレイ
@wはデータ部をそのまま送信(1回のトランザクション)します。
@w78@h40@sThank you! は40で表示位置を指定し、連続データとして表示文字を指定しています。
投稿: たま吉さん(管理者) | 2016年7月13日 (水) 21時55分