MSP430は、組み込みプロジェクト向けにTexas Instrumentsが提供する強力なプラットフォームであり、その汎用性により、多くのアプリケーションへの道を見つけることができ、フェーズはまだ進行中です。MSP430チュートリアルをフォローしている場合は、非常に基本的なものから始めて、このマイクロコントローラーに関する幅広いチュートリアルをすでにカバーしていることに気付くでしょう。これまで、コミュニケーションポータルのようなもっと興味深いものに入ることができる基本をカバーしてきました。
組み込みアプリケーションの広大なシステムでは、マイクロコントローラーだけですべてのアクティビティを実行することはできません。情報を共有するために他のデバイスと通信する必要があるある段階で、 これらの情報を共有するためのさまざまなタイプの通信プロトコルがありますが、最も使用されるものは USART、IIC、SPI、およびCANです。各通信プロトコルには、独自の長所と短所があります。 このチュートリアルで学習するのはI2Cの部分なので、ここではI2Cの部分に焦点を当てましょう 。
I2C通信プロトコルとは何ですか?
用語IICは「の略インター集積回路」。通常、I2CまたはI squared Cとして、あるいは2線式インターフェースプロトコル(TWI)として示される場所もありますが、すべて同じ意味です。I2Cは同期通信プロトコルです。つまり、情報を共有する両方のデバイスが共通のクロック信号を共有する必要があります。情報を共有するためのワイヤーは2本だけで、そのうちの1つはコック信号に使用され、もう1つはデータの送受信に使用されます。
I2C通信はどのように機能しますか?
I2C通信は、フィリップスによって最初に導入されました。前に述べたように、2本のワイヤーがあり、これらの2本のワイヤーは2つのデバイス間で接続されます。ここでは 、一方のデバイスをマスター と呼び、もう一方のデバイスをスレーブと呼び ます。通信は、2つのマスターとスレーブの間で常に発生する必要があります 。I2C通信の利点は、複数のスレーブをマスターに接続できることです。
完全な通信は、これら2つのワイヤ、つまりシリアルクロック(SCL)とシリアルデータ(SDA)を介して行われます。
シリアルクロック(SCL): マスターによって生成されたクロック信号をスレーブと共有します
シリアルデータ(SDA): マスターとスレーブ間でデータを送受信します。
いつでもマスターだけが通信を開始できます。バスには複数のスレーブがあるため、マスターは異なるアドレスを使用して各スレーブを参照する必要があります。アドレス指定されると、その特定のアドレスを持つスレーブのみが情報を返信し、他のスレーブは終了し続けます。このようにして、同じバスを使用して複数のデバイスと通信できます。
I2Cの電圧レベルは事前定義されていません。I2C通信は柔軟です。つまり、5vボルトで給電されるデバイスは、I2Cに5vを使用でき、3.3vデバイスはI2C通信に3vを使用できます。しかし、異なる電圧で動作している2つのデバイスが、I2Cを使用して通信する必要がある場合はどうなるでしょうか。5V I2Cバスは、3.3Vのデバイスに接続することはできません。この場合、電圧シフターを使用して、2つのI2Cバス間の電圧レベルを一致させます。
トランザクションを構成する条件のセットがいくつかあります。送信の初期化は、SDAの立ち下がりエッジで始まります。これは、下の図で「START」条件として定義され、マスターがSDAをローに設定しながらSCLをハイのままにします。
下の上の図に示すように、
SDAの立ち下がりエッジは、START条件のハードウェアトリガーです。この後、同じバス上のすべてのデバイスがリスニングモードになります。
同様に、SDAの立ち上がりエッジは、上の図で「STOP」状態として示されている送信を停止します。この場合、マスターはSCLをHighのままにし、SDAを解放してHIGHにします。したがって、SDAの立ち上がりエッジで送信が停止します。
R / Wビットは次のバイトの送信方向を示します。HIGHの場合はスレーブが送信し、Lowの場合はマスターが送信します。
各ビットは各クロックサイクルで送信されるため、バイトの送信には8クロックサイクルかかります。各バイトが送信または受信された後、ACK / NACK(確認済み/未確認)に対して9番目のクロックサイクルが保持されます。このACKビットは、状況に応じてスレーブまたはマスターのいずれかによって生成されます。ACKビットの場合、SDAは9番目のクロックサイクルでマスターまたはスレーブによってローに設定されます。したがって、それはACKと見なされ、それ以外の場合はNACKと見なされます。
I2C通信はどこで使用しますか?
I2C通信は、短距離通信にのみ使用され ます。それはそれをスマートにするために同期されたクロックパルスを持っているので、それは確かにある程度信頼できます。このプロトコルは主に、マスターに情報を送信する必要があるセンサーまたはその他のデバイスと通信するために使用されます。マイクロコントローラが最小限のワイヤのみを使用して他の多くのスレーブモジュールと通信する必要がある場合に非常に便利です。長距離通信をお探しの場合はRS232をお試しください。より信頼性の高い通信をお探しの場合は、SPIプロトコルをお試しください。
MSP430のI2C:AD5171デジタルポテンショメータの制御
Energia IDEは、MSP430をプログラムするのに最も簡単なソフトウェアの1つです。ArduinoIDEと同じです。Energia IDEを使用したMSP430の使用開始について詳しくは、こちらをご覧ください。
したがって、Energia IDEでI2Cを使用するには、 wire.h ヘッダーファイルをインクルードするだけです。ピン宣言(SDAおよびSCL)はワイヤーライブラリ内にあるため、 セットアップ 関数で宣言する必要はありません。
サンプルの例は、IDEの[サンプル]メニューにあります。例の1つを以下に説明します。
この例は、I2C同期シリアルプロトコルを介して通信するアナログデバイセズAD5171デジタルポテンショメータを制御する方法を示しています。MSPのI2Cワイヤーライブラリを使用して、デジタルポットは64レベルの抵抗をステップスルーし、LEDをフェードさせます。
まず、i2c通信を担当するライブラリ、つまりワイヤライブラリを含めます。
#include
では 、セットアップ 機能、我々はによってワイヤライブラリを開始します ().begin 機能。
void setup(){ Wire.begin(); }
次に、変数 val を初期化して、ポテンショメータの値を保存します
バイト値= 0;
内 ループ 機能、我々はだろうI2Cスレーブ装置への送信開始ICのデータシートに記載されているデバイスのアドレスを指定することにより(この場合、デジタルポテンショメータICで)を。
void loop(){ Wire.beginTransmission(44); //デバイス#44(0x2c)に送信します
続いて、バイト、つまり write() 関数で送信するためにICに送信するデータをキューに入れます 。
Wire.write(byte(0x00)); //命令バイトを送信しますWire.write(val); //ポテンショメータ値バイトを送信します
次に、 endTransmission()を 呼び出してそれらを送信します。
Wire.endTransmission(); // val ++の送信を停止します; //値をインクリメントif(val == 64) {// 64番目の位置(最大)に達した場合val = 0; //最小値からやり直します} delay(500); }