STM32F103 S/W IIC (2)

投稿者: | 2019/11/01

複数のデバイスを接続して使いやすように、C++でプログラムする事にします。
SW_I2C Classを定義します。

コンストラクタ SW_I2C()には、スレーブデバイスアドレス、SDA,SCLポートを指定します。

I2Cスレーブデバイスのアドレスが0x27の場合、1bitシフトしたものをスレーブアドレスとして指定します。各メンバー関数は、引数としてスレーブアドレスを設定することができます。コンストラクタで設定したスレーブアドレスを使う場合は、getSlaveAddress()を呼んでください。
SDA, SCLはCubeMXで設定したポートを指定します。ポートは、Open Drain(OD), No Pull-up, Pull-Down, 初期値 Hに設定します。STM32F103には5Vトレラントのポートがありますが、5Vで使用する場合は内蔵のPull-upは使用できませんので、No Pull-upに設定してください。また、I2Cは通信していないときはラインをHにしなければなりませんので、初期値としてHを設定します。

STM32F103用のプログラムですが、

この部分を修正すれば、他のマイコンにも移植できると思います。
(ESP32でも一部修正して使っています)

SW_I2Cのメンバー関数です。関数名、変数名を見れば大体何をやっているかの想像はつくと思います。

クロックSCLのスピードが早い場合は、shortWait( )を調整してください。
実機で確認したところ、クロック周波数72MHzのSTM32F103C8T6では、SCLクロック周波数は 250kHz程度ありましたので、もう少しwaitを増やしてスピードを落とす方が良いと思います。
Open Drainは立ち上がりがプルアップ抵抗とラインの容量で鈍りますので、通信速度は遅い方が安全です。

エラー処理はackの確認のみ実装しています。checkStatus()でnackだった場合はIIC_STATUS_NACKを返します。ただし、バスリセットなどの処理は実装してません。
実際の使用例は次回以降に紹介したいと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください