chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

STEVAL-DRONE01の制御ボードに搭載されたセンサーを読む(読みたい)

STEVAL-DRONE01に制御ボードSTEVAL-FCU001V1が搭載されていて、そのボードには、角速度センサ(LIS2MDL)や加速度センサ(LSM6DSL)が搭載されている。STM32F401CCとセンサーはSPIで接続されている。が、、回路図をよく読むと接続が、SPIの3線(CS/CLK/MOSI)なのであった。普通はMISOも含めた4線なのだが。これはSPIの3-wire Bidirectionalモードと呼ばれるらしい。MOSIで送受信の両方やってしまうというもの。だから、マスターとスレーブはMOSI(スレーブ側はMISO)に対して入力/出力モードを切り替えながら動作することになる。さすがにMicroPythonではSPI 3-wireモードは実装されておらず、掲示板等では、俺作ってみるぜとか書き込まれたりする。STM32ではハードウエアレベルでBidirectionalModeをサポートしていて、レジスタの該当のビットを操作することで、SPI通信時の入出力の方向を変えられるようだ。

問題はMicroPythonのSPIドライバでどうやって3-wireモードを実現するか。。今回はあくまでもレジスタの値取得が目的でありアクセス性能は求めないので、Pinをソフトウエアで上げ下げしながらSPI風の信号を作り出す、ビットバンギングで組んでみようと思う。Pinをソフトウエアですべて制御したら、どのタイミングで入出力の方向を切り替えるとか管理できるのでデバッグもしやすい。クロックの精度とか無視するならソフトでSPIバスを作り出すのはそれほど難しくない。