SSI(同期シリアルインターフェース)

EnDat

EnDatはHEIDENHAINが開発した双方向インターフェース.
いくつかバージョンがあるが,最新のものはEnDat 2.2
物理層にはSSIのように差動伝送を採用.SSIと異なる点として,EnDat2.2は双方向で信号をやり取りする.このため,EnDat 2.2のデータ線はRS485の半二重方式を用いて構成する必要がある.(EndatのPDFから結線図とパケットの遷移図貼りたい)

stm32での実装

(未検証だけどこうすればできそう)
EnDat2.2は双方向通信を行うため,まずマスタからクロックに同期して所定のデータ(コマンド)を送信する.
その後,マスタが継続して出力するクロックに同期して,スレーブデータをマスタへ送信する.
このとき,送られるデータの方向がマスタ→スレーブからスレーブ→マスタへと変わるため,マスタはコマンドを送信し終わったらRS485の半二重トランシーバを制御し,受信モードに切り替える必要がある.

stm32をSPIのマスタとし,最初にデータの送信を行った後にデータを受信すればスレーブからデータ取得が見込める.
加えて,RS485の半二重トランシーバを受信モードに切り替える必要がある. SPIの送信完了割り込みを用いることで,送信完了後直ちにGPIOを制御(/RE,DEの電位を切り替える)して半二重トランシーバを受信モードに変更すれば良さそう.
スレーブからデータを受信し終わったら,再び送信モードに変更してコマンドを送信する.

ハイデンハインエンコーダのインターフェース
EnDat 2.2 – Bidirectional Interface for Position Encoders
モーター制御用エンコーダに向けて、性能と信頼性を強化した通信用ソリューション
Using the ADM3065E 50 Mbps RS-485 Transceiver in EnDat Motor Control Encoder Applications