Atmel Studio入門:I2C

Atmel Studioで、I2C Master制御プログラムを開発する方法を説明します。

I2C Masterのサンプル・コード

AVRマイコンには、I2C通信に使用できるTWI(Two Wire Interface)を備えた製品があるので、これを利用します。

以下、サンプル・コードの内容を見ていく事にします。

8行-11行
I2Cのクロック周波数設定を行います。TWSRでクロック設定用パラメータNを指定します。TWBR、N、Fosc(F_CPU)の値でI2Cのクロックが決定します。なお各レジスタの詳細は、ターゲット・マイコンのデータシートで確認します。

17行-35行
TWCRレジスタの、TWINT、TWSTA、TWENビットを”1″にすると、I2Cスタートを実行します。I2Cスタートが実行できたら、引数のdataStartI2cの値を送信します。通常、dataI2cは、7bit Slave Addressに、Write or Readビットを付加したデータになりますので、引数は、

等と指定します。
なお、この例では、TWSRをTW_STATUS_MASKでマスクした値をチェックして、バスが占有されていてI2Cスタートできなかった、あるいはスレーブとのACK(アクリッジ)が上手くいかなかった場合、戻り値が0になる様にしています。

39行-41行
TWCRの、TWINT、TWSTO、TWENビットを”1″にして、ストップビットを発行します。

45行-54行
TWDRにデータを入れて、TWCRのTWINT、TWENビットを”1″にするとTWDRのデータがスレーブに送信されます。この例では、TWSRをTW_STATUS_MASKでマスクした値をチェックして、スレーブとのACKに失敗した場合は、戻り値が0になる様にしています。

56行-60行
TWCRのTWINT、TWEN、TWEAビットを”1″にすると、スレーブからのデータを受信して、ACKを返します。TWCRのTWINTが”1″ならば受信完了で、TWDRに受信データが格納されます。

63行-67行
TWCRのTWINT、TWENビットを”1″にすると、スレーブからのデータを受信して、NACKを返します。TWCRのTWINTが”1″ならば受信完了で、TWDRに受信データが格納されます。

まとめ

実際は、通信相手となるI2Cスレーブ・デバイスの仕様に合わせて、サンプル・コードにある様な関数を組み合せてI2C通信を行います。また、この例では簡単な通信エラー検知を入れていますが、製品設計の場合は、想定以上の時間が過ぎてもACKが帰ってこない場合等は、タイムアウトして再送制御を行ったり、異常を通知して中断する仕組みなども必要に応じて実装します。

→その他のAtmelマイコン関連情報

Sponsored Link