ソフトウェア処理の限界に挑む。AVR用高速SPIライブラリを作ってみた。

マックスシリーズ?第2弾はSPIライブラリだ。HWとは比べ物にならないがSW実装としては最速だと思う。
ライト&リード動作の場合はビット当たり6サイクルかかるので16MHzクロックなら最大2.67Mbpsとなるがライトとリードを分離した実装であればビット当たり4サイクルまで高速化できるので16MHzクロックなら最大4Mbpsとなる。なお、F_CPU/6(16MHzなら2.67Mbps)を超える速度を指定した場合、write()/read()は実速度とは合わなくなることに注意してほしい。例えば、16MHzクロックで8Mbpsを指定した場合の実速度は4Mbpsであるが幅の狭いほうのパルスだけ見れば8MbpsであるのでSPIスレーブ側は8Mbps以上の転送速度に対応している必要があるということになる。F_CPU/2を指定したときに最大速度となる。

【仕様】
・速度 16MHz 10.4Kbps – 4Mbps(write/read), 2.67Mbps(transfer)
・マスターモード
・mode-0/1/2/3
・8-bit
・MSB-FIRST

【1Mbpsの波形】

【約4Mbpsの波形(16.5MHzクロックでの最大速度)】

【概要】

ライブラリを初期化する。

ライブラリを終了する。

1バイトを送受信する。(6サイクル)

複数バイトを送受信する。

1バイトを送信する。(4サイクル)

複数バイトを送信する。

1バイトを受信する。(4サイクル)

複数バイトを受信する。

【サンプル・スケッチ】

【修正履歴】
2020-07-31
かなりバグってたっぽいので修正ついでにテンプレート・パラメタにSPIモードを追加し全MODE対応してみた。

2020-07-15
同じコードが生成されるので問題ないがMISO入力に対して正しくないポートマクロ名を指定していたので修正。

2020-07-10
インラインアセンブラの入出力パラメタの使い方が正しくなかったので修正。

【ライブラリ】

【参照ライブラリ】
AVR用高速GPIOライブラリ