最近いろいろあってマウスお預け状態の中の人です。MPU6500+AS5047をSPI一系統で読もうとするとSPIのモードやらクロック周波数やらを変える必要がありますが、最も問題になるのが送受信のデータフォーマットです(MPU6500は8bit、AS5047は16bit)。今回はその違いにより結構影響を受けた話&その解決策です。
1. DMA転送を使ってSPI通信をする
STM32ではDMA転送を使ってSPI通信をすることができます。で、こいつを使う際にはSPIの設定のほかにDMAの設定を行わなくてはなりません。...といってもDMAの設定はNormal/Circularの設定と、転送データ幅のみです。今回はSPIの要求をいちいち出す方式にしたので、Normalにしました。 問題となったのは転送データ幅の部分です。
2. 転送データ幅とSPIのデータサイズ
今回使用したAS5047とMPU6500ではSPIのモードや一度にやり取りするデータサイズが異なっていました。AS5047 DataWidth:16bit CPOL:0 CHPA:0 -> Mode:1
MPU6500 DataWidth:8bit CPOL:0 CHPA:1 -> Mode:0
マイコンのピン数の問題で、SPIは1系統に絞ったので通信するたびにモードを変更する必要があります。こちらはHAL_SPI_Initでどうにかなったのですが、問題はDMA転送をどうするかです。
で、以下の二つを試しました。
1): DMAのデータ幅を16bitに設定して、AS5047と通信する
2): DMAのデータ幅を8bitに設定して、AS5047と通信するときは2Byte分送りつける
3. 試した結果
1) データ幅16bitこんな感じで設定して...
こんな結果が出てきました。上側のエンコーダの値はあっていそうですが、当然ジャイロからは値がかえって来ません(HAL_DMA_Initか何かで設定をかえれば読み取れるとは思いますが)。
2) データ幅8bit
こちらもこんな感じで設定して...
結果はこんな感じ。設定を変えずとも送るデータ数を倍にすれば読み取れそうです。ジャイロも読み取れています。
4. で、どうするよ
設定を変えるのが面倒だったので、今回はデータ幅8bitでやっていこうと思います。
©2019 shts All Right Reserved.
0 件のコメント:
コメントを投稿