RX231を使用しています。
UARTを使うにあたり、CTS/RTS機能を使いたく調べたところ、どちらか一方しか選択できないとわかりました。
単純な疑問なのですが、どうして一方しか使えないような仕様になっているのか、理由が知りたいのです。
ハードフロー制御をあまり使ったことがないのですが、どちらか一方で足りるものなのでしょうか。
どうして。。。
わわいです CTSさえ自動でやってくれるなら、RTSはふつーの出力ポートの操作でいけます。 まともにシリアル通信を実装しようとすると、受信周りは、当然ながら割り込み駆動で、リングバッファ(キューバッファ)を使っての実装となります。 この時、RTSはバッファの残り容量によりON/OFFする必要があるため、これを自動でやられると困ることになります
almondさん、こんにちは。NoMaYです。(ひと月ぶりでしょうか。)片方しかない理由を考えていて、ちょっと思い浮かんだことがあります。送受信をDMAで行う場合とそうでない場合とに分けて考えてみると、片方あればシビアな状況に対応出来るような気がしました。DMAを使う場合・ 受信でDMAを使えば凄い勢いでドンドン送られてくるデータにも対応出来る・ 送信でDMAを使う場合はCTSでハード的に待てるようでないと相手が受信しきれないケースも有り得るDMAを使わない場合・ 送信ではポートでCTSを読んで待ってあげれば充分である・ 受信では受信割り込みが間に合わないことが想定される事情がもしあるならハード的にRTSで相手を待たせるようにする必要があるというのはどうでしょうか?[追記] 03/28 07:09 この後のチョコさんの投稿を読んだ後で追記しました>・ 受信では受信割り込みが間に合わないことが想定される事情がもしあるならハード的にRTSで相手を待たせるようにする必要があるこの場合、相手側の作りとして、RTS=Highでは1バイトも送らないようになっている必要がありますね。(もっとも、こちら側の受信はダブルバッファになっているので1バイトのマージンはありそうですが。)また、RTSの出力がHighに変化するのは以下のようにスタートビットを検出したタイミングのようです。RX230,231のハードウェアマニュアルの画面コピー
almondさん、こんにちは。NoMaYです。調べてみました。CTS・RTS機能は、RX62N,621のSCIaには無く、RX63N,631のSCIc,SCIdには有りました。そして、クロック同期式シリアルの説明箇所に以下の説明がありました。・ CTS機能は、内部クロック時にCTSn#端子入力を使用して送受信開始制御を行う機能・ RTS機能は、外部同期クロック時にRTSn#端子出力を使用して送受信開始要求を行う機能クロック同期式シリアルの場合、片方しか使えないのは自然なことのように思えます。そして、これを調歩同期式シリアルで使える様にアレンジしただけ、という可能性もありそうな気がして来ました、、、RX63N,631のハードウェアマニュアルの画面コピー[追記] 03/28 07:09私の前の投稿に追記しました。
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のハードウェアマニュアルの画面コピー
こんにちは。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_modelsen.wikipedia.org/wiki/8250_UARTen.wikipedia.org/wiki/16550_UARTen.wikipedia.org/wiki/Intel_8251en.wikipedia.org/wiki/Zilog_SCCwww.datasheetcatalog.com/datasheets_pdf/I/N/S/8/INS8250.shtmlwww.datasheetcatalog.com/datasheets_pdf/P/C/1/6/PC16550D.shtmlwww.datasheetcatalog.com/datasheets_pdf/8/2/5/1/8251A.shtmlwww.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.」