ヘルパークラス版はより抽象度が高い実装です。読み書きを行うオブジェクト transceiver
を生成することが、バスの利用開始となり、オブジェクトを破棄するとバス利用の終了手続きを行います。
if文の判定式内でオブジェクトの生成を行うことで、オブジェクトの有効期間はif節内のスコープに限定され、if節を抜けた時点でオブジェクトは破棄され、その時点でバスの利用終了の手続きを行います。
また、読み書きオブジェクトは、mwx::stream
インタフェースを実装しているため<<
演算子などを利用することができます。
バスの利用開始と終了をオブジェクトの有効期間と一致させることで、ソースコードの見通しを良くし、また終了手続きの記述漏れなどを防ぎます
mwx::stream
インタフェースによる読み書き手続きを統一します
読み込み処理とその終了手続きをスコープ内 if() { ... }
で行うためのヘルパークラスを用いた読み込み方法。
上記では get_rwer()
メソッドにより生成された x
オブジェクトを用いて1バイトずつ読み書きを行っています。
if(...)
内で x
オブジェクトを生成します。同時にSPIバスのセレクトピンをセットします。(型は、型推論によるユニバーサル参照 auto&&
で解決しています。)
生成した x
オブジェクトには operator bool ()
が定義されており、判定式の評価として利用される。SPIバスの場合は常に true
となる。
x
オブジェクトには uint8_t transfer(uint8_t)
メソッドが定義されていて、これを呼び出すことでSPIに対して8bitの読み書き転送を行。
if() { ... }
スコープの末尾で x
のデストラクタが呼び出され、SPIバスのセレクトピンを解除します。
SPIバスの読み書きに用いるワーカーオブジェクトを取得します。
それぞれ8bit,16bit,32bitの転送を行い、読み取り結果を書き込んだデータ幅と同じデータ幅で返す。
int
型,uint8_t
型は8bitの転送を行います。
uint16_t
型、uint32_t
型は、それぞれ16bitの転送、32bitの転送を行います。
転送結果は最大16バイトの内部FIFOキューに格納され >>
演算子により読み出します。バッファが大きくないので、転送都度読み出すことを想定します。
直前の転送と同じデータ幅の変数を指定します。
読み出した結果が不要の場合はnull_stream()オブジェクトを使用します。iで指定したデータバイト分だけ読み飛ばします。
begin()
メソッドによりハードウェアの初期化を行った後、beginTransaction()
によりバスの読み書きができるようになります。beginTransaction()
を実行するとSPIのセレクトピンが選択されます。読み書きはtransfer()
関数を用います。SPIは読み出しと書き込みを同時に実行します。
バスの利用開始を行います。SPIのセレクトピンをセットします。
settings
パラメータを与えて呼び出した場合は、バスの設定を行います。
バスの利用を終了します。SPIのセレクトピンを解除します。
バスの読み書きを行います。trasnfer()
は8bit、transfer16()
は16bit、transfer32()
は32bitの転送を行います。
beginTransaction(), endTransaction(), transfer(), transfer16(), transfer32()
transceiver
パラメータ | 解説 |
| 使用するSPIスレーブのセレクトピンを指定する。
|
| SPIのバス設定を指定します。
|
定数 | 意味 |
| MSB を先頭ビットにする |
| LSB を先頭ビットにする |
| SPI MODE 0 に設定する |
| SPI MODE 1 に設定する |
| SPI MODE 2 に設定する |
| SPI MODE 3 に設定する |