MA700GQ-PのSPI通信

お久しぶりです。 内定という重罪を犯したために懲役40年の実刑判決を受け服役中のFNDです。 ごはんおいしいです。

 

入所前にバイト先で「MA700のspiが何故か上手くいかないから教えてほしい」と言われたので通信方法を書き記しておこうかなと思います。



MA700をspiで使う場合、帰ってくるデータは回転軸のアブソリュートな角度となっています。spiを使わず インクリメンタルエンコーダーとして使うことも可能ですが,アブソリュートの方が精度がいいためspiから読み取っている人が多いと思います。

MA700のspiはやや特殊な方式となっており、最初の8bitのデータが送られた場合,その値に関わらずアブソリュート角の上8bitを返す仕様となっています。(データシートpp.9参照)つまり、普通に値を読むだけなら0を送るだけです。そのため内部のレジスタを弄らない場合はMOSIを繋がなくても動作します。

 

STMでCubeMXからspiを設定する場合は以下のようになります。

f:id:b4rrAcud4:20190403194305p:plain
2019/07/22追記
MA700の場合、CPOL=Highでないと通信できません。
ジャイロとSPI線を共通化する場合、CPHAやCPOLの設定が異なる場合がありますので、通信デバイスを切り替える際に毎回設定しなおしてください。

hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; //CPOL = High

MA700のSCLKの最大周波数は25MHz(エッジの間隔が40ns)なので、それを超えないように設定します。またデータの更新周期が最高558kHzなので、それよりも十分早い速度の方がいいと思います。(この記事書いてる途中で気付いたので自信なし)

私の場合は,MA700を載せているVermilion BisのマイコンがSTM32F722RE(最大216MHz)で,128分周で843.75kHzに設定しています。これはMA700とジャイロ(ICM-20649)とでspiの線を共有しているため、ジャイロ側の最大周波数1MHzを超えないようにするためこの周波数となっています。

 

読み方は特に難しくなくHALのapiから使うだけです。

uint8_t Data_Input[] = { 0x00, 0x00 };
uint8_t Data_Output[2];

HAL_GPIO_WritePin(CS_ENC_R_GPIO_Port, CS_ENC_R_Pin, 0);
HAL_SPI_TransmitReceive(&hspi1, (uint8_t*) Data_Input,(uint8_t*) Data_Output, 2, 10);
HAL_GPIO_WritePin(CS_ENC_R_GPIO_Port, CS_ENC_R_Pin, 1);