(2017.8.16 作成)
I2C類似プロトコルをもつデバイス(TM1637など)の操作やハードウェアI2Cの数が不足しているときのためにSoftware I2Cを作成しました。こちらからダウンロードできるBaseクラス内に実装されています。
GPIOとWaitの各ベースクラスを用いて作成していますので、このサイトで使用しているマイコン(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を指定する |
|
備考 |
記事執筆時点では動作未検証です |