ビットリバーサル
stm32f4にて
UASRTでクロック同期通信の設定をして、
SPI風に使う設定を試す。
SPIと言えないのは、いろいろ制約が
多いからかな。
マスタでしか動かない。
8bit単位でしか使えないとか。
もう一つ(後述)
設定はそんなに難しくない。
普通にUASRTの初期設定のうち、
クロックピンを有効にする
(CR2のビット11、CLKENビットを1にする)
最終データビットのクロックを出力する
(CR2のビット8、LBCKビットを1にする)
これをやらないとSPI的には、
クロックパルスが一つ少なくなるように見える
なんだけど、問題が一つ
普通のSPIはMSBファーストなんだけど
(最上位ビットから送信される)
UASRTなので、LSBファーストで送信
になっていて、これを変更する方法はない。
仕方ないので、送信したいビット列を
ビット単位で反転させるのだけど、
まともにコードで書こうとすると
結構計算コストが大きい。
ルックアップテーブルで変換、
なんてのが最適解の一つとなってるくらいだ。
そんなの8bitならともかく、
長ビットでやってられるか、と
いうことで、armにある
ビット反転(32ビット)命令、
RBITを使う。
インラインアセンブラで直接記述
して動作ok。
core_cmInstr.hにもRBITの
マクロの記述があるから、
__RBIT() でも同じ結果になる。
これで使い道の少ない
USARTポートも、
有効利用できるようになった。
使いどころは色々ありそうだ。
| 固定リンク | 0
« 思うに | トップページ | 基本的人権.... »
コメント