2019年6月11日火曜日

STM32のSPI+DMAで詰まった話(HAL使用・STM32F413)


 最近いろいろあってマウスお預け状態の中の人です。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 件のコメント:

コメントを投稿