UARTのCTS・RTSについて

RX231を使用しています。

UARTを使うにあたり、CTS/RTS機能を使いたく調べたところ、どちらか一方しか選択できないとわかりました。

単純な疑問なのですが、どうして一方しか使えないような仕様になっているのか、理由が知りたいのです。

ハードフロー制御をあまり使ったことがないのですが、どちらか一方で足りるものなのでしょうか。

どうして。。。

  • わわいです
    CTSさえ自動でやってくれるなら、RTSはふつーの出力ポートの操作でいけます。
    まともにシリアル通信を実装しようとすると、受信周りは、当然ながら割り込み駆動で、リングバッファ(キューバッファ)を使っての実装となります。
    この時、RTSはバッファの残り容量によりON/OFFする必要があるため、これを自動でやられると困ることになります

  • マニュアルを見てみました。

    >どうして一方しか使えないような仕様になっているのか、理由が知りたいのです。

    ポートが兼用になってますね。ピン数が足りないからでしょう。

    >ハードフロー制御をあまり使ったことがないのですが、どちらか一方で足りるものなのでしょうか。

    わわいさんの回答の通りです。CTSはハード的に送信を止めます。ですから汎用ポートで代用は出来ません。
    中にはCTSが単なる入力ポートで、ポートを読んでユーザプログラムで止めると言うCPUも有るかも知れませんが。

     8251と言うLSIが有ったけど、RTSは単なるポートとして通信とは関係の無い用途にも使えました。
     逆にRTSと言う端子が無くても、汎用ポートをRTSとして使う事も出来ます。

     CTSを使う時は注意して下さい。CTSがOFFで送信出来ないのに、それに気付かずデバッグ時間を潰さないように。
  • almondさん、こんにちは。NoMaYです。(ひと月ぶりでしょうか。)

    片方しかない理由を考えていて、ちょっと思い浮かんだことがあります。送受信をDMAで行う場合とそうでない場合とに分けて考えてみると、片方あればシビアな状況に対応出来るような気がしました。

    DMAを使う場合

    ・ 受信でDMAを使えば凄い勢いでドンドン送られてくるデータにも対応出来る
    ・ 送信でDMAを使う場合はCTSでハード的に待てるようでないと相手が受信しきれないケースも有り得る

    DMAを使わない場合

    ・ 送信ではポートでCTSを読んで待ってあげれば充分である
    ・ 受信では受信割り込みが間に合わないことが想定される事情がもしあるならハード的にRTSで相手を待たせるようにする必要がある

    というのはどうでしょうか?

    [追記] 03/28 07:09 この後のチョコさんの投稿を読んだ後で追記しました

    >・ 受信では受信割り込みが間に合わないことが想定される事情がもしあるならハード的にRTSで相手を待たせるようにする必要がある
    この場合、相手側の作りとして、RTS=Highでは1バイトも送らないようになっている必要がありますね。
    (もっとも、こちら側の受信はダブルバッファになっているので1バイトのマージンはありそうですが。)
    また、RTSの出力がHighに変化するのは以下のようにスタートビットを検出したタイミングのようです。

    RX230,231のハードウェアマニュアルの画面コピー


  • チョコです。
    >8251と言うLSIが有ったけど、
    懐かしい名前ですね。CTS以外の3本の制御信号は汎用のポートとして使っていました。CTSに対応する
    RTSはRxRDYを使っていた記憶があります。これでも,最悪で1キャラクタ分は送信されてくる可能性が
    あったので,外部にF/Fを付けて,スタート・ビットでRTSをオフしたこともありました。

    また,CTSで送信を禁止してから実際に送信しなくなるまでにどれだけのキャラクタが送信されるかは,
    個々のセットで異なります。
    (8251の改良版の8251Aの初期のバージョンではCTSが変化すると,同じデータが2回送信されるバグが
    あり,使い物になりませんでした。最終的には問題は解消されたようですが,CMOSのUPD71051に変更
    したので,結果は確認していません。)

    どちらで使うにしても,送信禁止信号の出力タイミングとCTSを検知してから停止するまで何キャラクタ
    掛かるかの合計のタイミングを検討する必要があるので,ある程度のバッファを準備する必要があります。
    そのうちに,RL78でハードウェア・ハンドシェイクの例をアップする予定です(RL78/G10でアセンブラ
    でのプログラムは何年か前に作ったことがあるので,それをCに移植するだけですが)。
  • almondさん、こんにちは。NoMaYです。

    調べてみました。CTS・RTS機能は、RX62N,621のSCIaには無く、RX63N,631のSCIc,SCIdには有りました。そして、クロック同期式シリアルの説明箇所に以下の説明がありました。

    ・ CTS機能は、内部クロック時にCTSn#端子入力を使用して送受信開始制御を行う機能
    ・ RTS機能は、外部同期クロック時にRTSn#端子出力を使用して送受信開始要求を行う機能

    クロック同期式シリアルの場合、片方しか使えないのは自然なことのように思えます。そして、これを調歩同期式シリアルで使える様にアレンジしただけ、という可能性もありそうな気がして来ました、、、

    RX63N,631のハードウェアマニュアルの画面コピー


    [追記] 03/28 07:09

    私の前の投稿に追記しました。

  • チョコです。
    >そして、これを調歩同期式シリアルで使える様にアレンジしただけ、という可能性もありそうな気がして来ました
    そもそも,RTSやCTSはMODEMの信号として使われていました。それをマイコンの初期に調歩同期通信で,今のような使い方にしたのが,現在まで続いています。
    40年ほど前に,伝送関係の人と話をしたときに,マイコン関係での使い方(キャラクタ単位程度で制御)はおかしいといわれた記憶があります。
    その後も,(伝送関係者いわく)本来の使い方と異なる使い方が定着してしまっています。

    3線式クロック同期通信では,RL78/G10の「RL78/G10 シリアル・アレイ・ユニット(CSI スレーブ通信) 」のサンプルコードでSPIのSSとBUSY信号を使ったハンドシェイクをおこなっています。この考え方の方がSPIには合っているいるように思われます。
  • こんにちはNAKAです。
    NAKAは単純なので、CTS(相手からのRTS)は相手の都合、RTS(相手へのCTS)は自分都合で、自分の都合はどうにでもなるけど、相手の都合は合わせないと通信できないからだと思います。
  • almondさん、こんにちは。NoMaYです。

    RX65N,651のSCIg,SCIi,SCIhになるとRTS機能の方にFIFOモードが追加されていました。この点に関しては、2つ前の私の投稿に書いた、DMAを使わない場合の受信におけるRTSの用途に向いていそうな気がします。なお、RX62N,621のSCIaにCTS・RTS機能はありませんが、その場合、皆さんはポート+ソフトウェアのみでCTS・RTS機能を実現されていると思います。((XON/XOFFによるフロー制御では無くて)CTS信号/RTS信号によるフロー制御(1バイト単位で細かく制御するのは二の次で構わない)が必要になった場合には、ですが。)

    RX65N,651のハードウェアマニュアルの画面コピー


  • 昔のシリアル・インターフェースLSIはCTS以外のRTS、DTR、DSRは汎用ポートと同じだったけど、RX231ではRTSが汎用ポートとは違う意味を持っているようですね。
     この制御信号の4本は皆が勝手な解釈で使っているから、どれが正しい使い方なのか分からない。
     RX231のRTSの使い方も、正しいのかどうか分かりません。LSI回路を作った人が間違った解釈でRTSと言う名前を付けたかも知れません。
     皆が勝手な解釈で作るから、ストレート・ケーブルやクロス・ケーブルが混在して困る。
     ケーブルの基本は両端がオスとメス。これはテーブルタップを考えれば分かります。
     モデムのコネクタはメス、パソコンのRS232Cのコネクタはオス。
     TXDは電話回線に出力する信号なので、モデム側では入力になる。
     だから、TXD同士を繋ぎます。同じ信号名同士を繋ぎます。ケーブルはストレートになります。

     パソコン同士を繋ぐと、ケーブルの両端はメスになります。するとクロス・ケーブルになります。
     この規則を守らずに、オスメスのコネクタを勝手に使うからおかしな事になる。

     RS232Cでボーレイトがやたら高いのが有ります。しかし立ち上がり立下り時間は、30V/μS以下と言う規定が有ります。
     それから計算すると、ボーレイトの上限が決まります。RS232CのインターフェースICの中には、立ち上がり立下り時間を制限するためにコンデンサを付けるものも有った。
     RS232CのインターフェースICで高速ならば良い性能と思えますが、RS232C規格では無い事になります。
  • こんにちは。NoMaYです。

    昔のシリアルインターフェースLSIについて、Wikipediaとdatasheetを調べてみました(調べ始めました。) 今の理解は以下の通りです。

    ・ ポピュラーなものとして、8250、16450/16550、8251、Z8440、などがある
    ・ 8250と16450/16550は、IBM PCおよびIBM PC互換機の世界でポピュラーである
    ・ 8251は、8080/8086のコンパニオンチップとしてポピュラーらしい
    ・ Z8440は、Z80のコンパニオンチップとしてポピュラーらしい

    ・ 8250と16450/16550は、調歩同期式シリアルのみをサポートする
    ・ 8251とZ8440は、調歩同期式シリアルの他にクロック同期式シリアルもサポートする

    ・ 8250と16450/16550では、RTSとCTSは単なるポートである
    ・ 8251では、RTSは単なるポートであるが、CTSにCTS入力=Highの時にハード的に送信を禁止する機能が存在する
    ・ Z8440では、CTSを単なるポートとするか、CTS入力=Highの時にハード的に送信を禁止するか、選択が出来る
    ・ Z8440では、DCDを単なるポートとするか、DCD入力=Highの時にハード的に受信を禁止するか、選択が出来る
    ・ Z8440では、調歩同期式シリアルに、送信バッファが空になるまでRTS出力=Low→Highの変化を遅らせるモードがある

    [リンク]

    en.wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter#UART_models
    en.wikipedia.org/wiki/8250_UART
    en.wikipedia.org/wiki/16550_UART
    en.wikipedia.org/wiki/Intel_8251
    en.wikipedia.org/wiki/Zilog_SCC
    www.datasheetcatalog.com/datasheets_pdf/I/N/S/8/INS8250.shtml
    www.datasheetcatalog.com/datasheets_pdf/P/C/1/6/PC16550D.shtml
    www.datasheetcatalog.com/datasheets_pdf/8/2/5/1/8251A.shtml
    www.datasheetcatalog.com/datasheets_pdf/Z/8/4/4/Z8440.shtml

    [疑問]

    ・ Wikipediaの8250の項目に以下のバグが書かれているが、datasheetではCTSは単なるポートの筈なので、バグが発生した理由が分からない。8250と8250A/8250Bで仕様が変更されたのだろうか?

    In particular, the original 8250 could repeat transmission of a character if the CTS line was asserted asynchronously during the first transmission attempt.