はじめに

こんにちは、どふぃです。

制作実習が終わり、いよいよ本格的な OJT が始まりました。
慣れないながらもお客様とのやり取りを積み重ね、日々成長させて頂いているなと実感しております。

前回は、I2C 通信で「 アクノリッジ 」が返ってこないというトラブルが発生した所で終了しました。

今回はこのトラブルをどのように解決したかをご紹介します。

工程 1 ~ゴールの再確認~

まず私は、一度冷静になり、実現しようとしていること(ゴール)は何なのかを確認しました。

<今回のゴール>
マイコンと D/A コンバーターの I2C 通信をおこない、マイコンから D/A コンバーターへデータを送信。
 そのデータを D/A 変換して最終的にはアナログ電圧として出力すること。


これが最終的なゴールであり、今躓いているのは一番初めのマイコンと D/A コンバーターの I2C 通信の部分です。

■冷静に状況を分析すること

これも制作実習で学んだ大切なことです。
うまくいかず、焦って周りが見えていない時ほど、一度冷静になることが重要です。

工程 2 ~プログラムの確認~

まずは、書き込んだプログラムの見直しをおこないました。
(今回の制作実習では Genuino101 というマイコンボードを使用) 。

図 1 に実際に書き込んだプログラムを示します。

図 1 Genuino に書き込んだプログラム ( 解決前 )

Genuino101 でのプログラミングは C++ がベースですが、 Genuino101 専用の言語もいくつかありますので、下記で一部ご紹介致します。

・void setup ():電源起動時とリセット時のみ処理する関数。
・void loop ():繰り返し実行されるメインの処理関数。
・Wire.begin ( address ): Wire ライブラリーを初期化。 I2C バスにマスターかスレーブとして接続。
・Wire.beginTransmission ( address ):指定したアドレスの I2C スレーブに対して送信処理開始。
・Wire.write ( value ):スレーブがマスターからのリクエストに応じてデータ送信する時に用いる。
・Wire.endTransmission ():スレーブデバイスに対する送信を完了する。

※備考
Wire.write の()内のデータは、 D/A コンバーターが 1 Vを出力するように設定。
( LTC2631A-12 のデータシートに記載されている計算式を使用 )

図 1 のプログラムを見直し、原因となる部分の特定をおこないました。


まずは、Wire.beginTransmission ( adress ) で指定したアドレス ( 0x20 ) が、
スレーブアドレス ( LTC2631A-12 ) に対応していないのではないか?と考えました (図 1 の赤枠で囲った部分) 。

とはいっても、何もわからないのでとにかくデータシートを何回も読み直し、 I2C 通信の原理の再確認をおこないました。

工程 3 ~データシートの読み直しと原理の理解~

データシートを何度も読み直し、私は思いました。
「やっぱり間違ってないんじゃないかな・・・・・」と。

図 2 に LTC2631 の標準的な書き込みトランザクションを示します。

図 2 LTC2631 の標準的な書き込みトランザクション (引用元:LTC2631 データシート)

図 2 の SDA を見ると、A6 ~ A0 ( 7bit ) の「 0010000 」に対し、スレーブアドレスは 8bit 目に送信 ( Write ) 指定ビットである "0" を代入した「 00100000 ( 16 進数:0x20 ) 」で間違いありません。

では、何故アクノリッジが返ってこないのでしょうか・・・

「 そういえば! 」
異変がもう 1 つありました。
(「 00100000 」のデータを送信したはずが、波形を見ると「 01000000 」になっていること:前回記事図 4 参照)

「これだ!」と思い、再度データシートを読み返しました。そこで気になる図を見つけました ( 図 3 )

図 3 コマンドとデータ入力のフォーマット (引用元:LTC2631 データシート)

SLAVE ADRESSの 前に注目して下さい。

当時の私の率直な感想です。
「 S ってなんだよ!!! 」

その後調べていくと、この S はスタートビットであることがわかりました。
I2C 通信がスタートするタイミングは、 SCL が High で SDA が Low の時です ( 図 2 参照 ) 。
通信が行われていない時は SCL , SDA は共にプルアップ抵抗を介して High に吊り上げられています。

通信を開始したい時は、S ( スタートビット: Low )を送ることで、SCL : High , SDA : Low の状態を作り出していたのです。

原因となっていたのは、 I2C 通信の基本中の基本である、通信開始の原理でした。
ものすごく遠回りをしましたが、原因がわかりました。

また、ここで学んだのは、下記の 2 点です。

■データシートには何かしらの手がかりや答えが潜んでいる
■基本原理の理解が何よりも重要

工程 4 ~アクノリッジ返送完了!!~

原因が分かったので、あとは解決するだけです。

つまり 1bit 目にスタートビットを入れるため、「 00100000 ( 0x20 ) 」を右に 1bit ずらします。
すると、「 00010000 ( 0x10 ) 」が正しいアドレス指定になります。

図 1 のプログラムで Wire.beginTransmission() の中身を( 0x20 → 0x10 )と変換し、 Genuino101 に書き込みます。
観測した波形を図 4 に示します。

図 4 SCLとSDA(通信成功後)

図 4 を見ると、図 2 に示すように SLAVE ADRESS , 1st DATA , 2nd DATA , 3rd DATA の順に SDA が出力され、それぞれの間にはアクノリッジが返送されていることがわかります。

振り返ってみれば、今回の問題はプログラム中の 1 文字を変えるだけで解決しましたが、費やした時間は膨大でした。
しかし、たくさんの壁にぶち当たることで成長を実感できた出来事だったと思っています。

終わりに

以前、メジャーリーガーのイチロー選手が TV でこう言っていました。

「失敗をしないで、全くミスなくそこにたどり着いたとしても深みは出ない。
 後から思うと無駄だったということはすごく大事なこと。
 遠回りすることが一番の近道です。」

まさにこの言葉を体現できたのが今回の制作実習であり、そのうちの 1 つが本記事の経験でした。
いつか私もこのような名言を生み出したいものですね。

こうして無事に I2C 通信を成功させ、マイコンでの D/A コンバーターの制御が実現できました。

導線で回路図通りに配線を行う = 通信ができる

と思っていた頃の私が懐かしい・・・

次回記事もよろしくお願い致します。最後に弊社で取り扱っているアナログ IC メーカーの紹介をさせて頂きます。

Analog Devices ~アナログ・デバイセズ~

高性能標準アナログ IC のリーディングメーカー。
アンプ、バッテリーマネージメント、データコンバーター、高周波、インターフェース、電圧レギュレーター、電圧リファレンスなどお客様の最終製品の性能、品質を定め、安定供給を実現。
基本的に製品の製造中止はおこなわず、産業機器など長期利用のお客様にも安心してお使いいただけます。

<アナログ・デバイセズ 詳細ページ>