SPI (ヘルパークラス版)
ヘルパークラス版はより抽象度が高い実装です。読み書きを行うオブジェクト 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で指定したデータバイト分だけ読み飛ばします。
SPI (メンバ関数版)
begin()
メソッドによりハードウェアの初期化を行った後、beginTransaction()
によりバスの読み書きができるようになります。beginTransaction()
を実行するとSPIのセレクトピンが選択されます。読み書きはtransfer()
関数を用います。SPIは読み出しと書き込みを同時に実行します。
バスの利用開始を行います。SPIのセレクトピンをセットします。
settings
パラメータを与えて呼び出した場合は、バスの設定を行います。
バスの利用を終了します。SPIのセレクトピンを解除します。
バスの読み書きを行います。trasnfer()
は8bit、transfer16()
は16bit、transfer32()
は32bitの転送を行います。
SPIバス (Controller) の読み書き
SPIバス (Controller) の読み書きを行います。
SPIバスの利用手続きはbegin()
メソッドによります。
ハードウェアの初期化を行います。
スリープ復帰後にも本処理が必須です。
SPIのハードウェアの利用を終了します。
読み書きの手続きは、以下の2種類あります。いずれかを選択して利用します。
メンバ関数版 (以下のメンバ関数を用いた入出力)
beginTransaction(), endTransaction(), transfer(), transfer16(), transfer32()
ヘルパークラス版(stream機能が使用可能)
transceiver
定数 | 意味 |
---|---|
パラメータ | 解説 |
---|---|
const uint8_t
SPI_CONF::MSBFIRST
MSB を先頭ビットにする
const uint8_t
SPI_CONF::LSBFIRST
LSB を先頭ビットにする
const uint8_t
SPI_CONF::SPI_MODE0
SPI MODE 0 に設定する
const uint8_t
SPI_CONF::SPI_MODE1
SPI MODE 1 に設定する
const uint8_t
SPI_CONF::SPI_MODE2
SPI MODE 2 に設定する
const uint8_t
SPI_CONF::SPI_MODE3
SPI MODE 3 に設定する
slave_select
使用するSPIスレーブのセレクトピンを指定する。0 : DIO19``1 : DIO0 (DIO 19 は予約されます)``2 : DIO1 (DIO 0,19 は予約されます)
settings
SPIのバス設定を指定します。
clock
[hz]でSPIバスの周波数を指定します。指定した周波数に近いディバイザが選択されます。16Mhzまたは16Mhzを偶数で割った値になります。
bitOrder
はSPI_CONF::MSBFIRST
かSPI_CONF::LSBFIRST
を指定します。
dataMode
はSPI_CONF::SPIMODE0..3
を指定します。