Software I2C

(2017.8.16 作成)

 I2C類似プロトコルをもつデバイス(TM1637など)の操作やハードウェアI2Cの数が不足しているときのためにSoftware I2Cを作成しました。こちらからダウンロードできるBaseクラス内に実装されています。

 GPIOWaitの各ベースクラスを用いて作成していますので、このサイトで使用しているマイコン(STM32, Arduino UNO)では動くと思います。

 ただこのクラスはTM1637操作用に作成したもののため記事執筆時点(17年8月)では未実装の機能がありますし、またreadの動作確認は行っておりません。

 内部的にはソフトでGPIOの単に上げ下げを行っているだけなので、とても遅い(STM32で100kHz以下)ですが、逆にすべての状態を任意に操作できるためハードウェアI2Cが対応できない非標準I2Cプロトコルに対応できるところがメリットになります。

 またベースクラスを継承していますので、同様の機能を使用することができます(一部非実装)。

 プログラムの内部的な話ですが、I2CなのでSCL, SDAはオープンドレイン接続を前提としています。STM32の場合はOpendrain - Outputモードがあるためそのまま読んでも問題ないのですが、Arduinoの場合はそのようなモードがありませんので読む際は一度Inputモードに変更するしてピンの状態を読む必要があります。

関数リファレンス

コンストラクタ

プロトタイプ

SoftwareI2C(

               DKS::IDigitalOut *SCL,

               DKS::IDigitalOut *SDA,

               DKS::IWait *Wait);

戻り値

なし

引数

SCL, SDA

Digital Outクラスへのポインタを渡してください

Wait

Waitクラスへのポインタを渡してください

備考

 

Startコンディションの発行

プロトタイプ

DKS::DKS_RESULT start() const;

戻り値 SDAラインがGNDになればOK
引数

なし

備考

SCLをHighに保ったまま SDAをGNDに接続します 

Stopコンディションの発行

プロトタイプ

void stop() const;

戻り値 なし
引数

なし

備考

SCLをHighに保ったまま SDAをGNDからHighにします 

1バイト書き込み

プロトタイプ

Response write(const uint8_t &data) const;

戻り値

デバイスからの応答(ACK or NACK)

引数

data

データ (1バイト)

 

備考

 

1バイト読み込み

プロトタイプ

Response read(

      uint8_t &data,

      const Response &Res) const;

戻り値

デバイスからの応答(ACK or NACK)

引数

data

読んだデータが格納されます (1バイト) 

Res

リード終了後にデバイス側に戻す値

まだ続いてデータを読む場合ACK, 読み込み終了時はNACKを指定する

備考

記事執筆時点では動作未検証です