RS485トランシーバのDEピン操作について

他メーカのマイコンではRS485トランシーバDEピン制御用のピンがあったりします(具体的には旧AtemelのATSAMシリーズのSERCOM)。実は以前SCIを使ってRS485接続のアブソエンコーダを使った時にDEピンを操作するための時間が最後の送信データから0.5usecと短いものでした。その時は送信データをそのまま受信するように回路を構成していたのでDTCを使って受信割り込み回数が送信データ数と同じになるのでそれを使って送信データ(送信したものを受信したデータ数)をDTCでカウントして完了でGPIOレジスタをDTCで書き換えることで難を逃れることができました。ただ、これ以外に正しい対処法があるのか?というのが質問の趣旨です。

0.5usecくらいの短い時間ですと割り込みハンドラでは追い付きません。割り込みハンドラで処理できるのは一桁遅い場合かと。かといって最後の送信データのTXE状態をポールするようなCPU時間を消費する方法ではモータ制御なので向いていません。こんな方法があるよと言うのがあれば教えてください。おそらくSCIの仕様はRXに限らずRAも同じだと思いますのでRAマイコンユーザの方もぜひお知恵をお貸しください。

  • わわいです。

    そういうイレギュラーな用途であれば、それ用の回路(DTCでカウントして完了でGPIOレジスタをDTCで書き換えること)を組み対応するもんでしょうね。

    一般的な通信ポートであるRS485トランシーバでの正しい対処法ってわけではありません

  • RA6T2マイコンも仕事で使うのでFSPのピン設定をしていたところDE出力ピンと言うのものがあり調べたところSCIに機能拡張したRSCIというペリフェラルが一部のRXやRAで使えるようになっているようです。このドキュメントの日付だと最近リリースのものから利用できるようになりそうですね。

    https://www.renesas.com/jp/ja/document/apn/comparison-differences-between-rsci-module-and-sci-module-rev100

    RA6T2のマニュアルにも説明がありました。ただし、RXではRSCIと呼んでいますがRAはSCI_Bと呼ぶようです。もうちょっと統一してほしい。

    RSCIやSCI_Bが出てきたことから何かしら工夫するのが必須なのかなと思いました。

  • いうほどイレギュラーでしょうか?半二重通信のトランシーバなら必須ですよ。

  • わわいです

    まあ、あなたは必須と考えるんでしょうが、私はそうは考えません。そんだけのはなしですね。

  • 最近のRAでは、DE端子のネゲート時間をレジスタで設定できる様な事が書いてあります。

    (基本クロック時間掛けるレジスタ値なので、遅いビットレートの場合は0.5usには設定出来ないと思いますが。)

    SCI_Bは、モジュール初期化後の実際に送信可能になるまでの待ち時間が短い(従来のSCIはTEビットを1にしてからデータが送信開始まで1フレーム分の内部待機期間がある…H8時代からそんな感じだった様な。それに対して、SCI_Bは直ぐにデータが送出される)という記憶があります。

  • RS485についてはRSPIやSCI_Bが使えないマイコンの場合でのDEピンの操作方法のアプリケーションノートを出してくれると良いのですが。モータ制御向けでRS485通信タイプのエンコーダは結構あるし、PLCとの通信にもよく採用されるので。個人的にはBiSS-CやSSIあたりも簡単に繋げられるようにアプケーションノートを出して欲しい。

  • データを送出した後に割り込みを掛けられます。割り込みの最初で DE を処理しても間に合いませんか?

    その割り込みに関するビットが TEIE です。

  • 間に合わないからのDTC転送です。割り込みハンドラでDE操作してた時はモータ制御が動く前では毎分1回くらいが、モータ制御が走り出した後は数秒で1回くらい通信エラーになりました。センサ側の応答メッセージがDEを下げる前に始まり、信号の衝突が起こっていました。エンコーダは多摩川のSI35シリーズです。

  • SCIのデータ「送信」を割り込みで処理しているのか、DTCで処理しているのか判りませんが、

    割り込みで処理している場合は、「送信エンプティ」割り込みで

    DTCで処理している場合は、データ転送の度に割り込みを掛けると

    大体データが出始めるタイミングで割り込みが掛かると思います。その割り込みで、GPT等タイマを起動。タイマのコンペアマッチ値は、10bit時間(8N1の場合)+0.5usに設定する。(コンペアマッチでタイマ出力端子をネゲート(端子を変化させるのはGPIOの操作では無い)、タイマ周期終わりの割り込みでタイマストップ(タイマ停止は優先度の低い割り込みでヒマな時に)。)データが連続して送信されている間は、タイマがリセットされ、次に送るデータが無い場合、最終データの送出終わり+0.5usでDE端子がネゲートされる。

    (1バイト送る毎にタイマを再起動orカウンタ値リセットするリソースは消費する。ある程度リソースに余裕があるマイコンの場合だったら可能?タイマのカウント値をチューニングすれば、ある程度正確な時間でDEを操作できるのではないかと、思いました。実際に試してはいないので、実現性は?ですが。)

    (0.5usってハードの世界ではめちゃくちゃ長い時間ですが、ソフトで処理する場合はそれ程余裕がない微妙な時間ですよね。)

  • DEピンをGPTIOxAとかに割り当てるとできそうですね。なるほど。エンコーダは多摩川精機のASICですもん。向こうにとってはもっと短くてもいいと考えてそう。試したいけど、GPIOとBCLKしか出ていない端子に割り当ててしまった。最初の設計時にDEたち下げる規定値を見ていなかった。