RX231を使用しています。
UARTを使うにあたり、CTS/RTS機能を使いたく調べたところ、どちらか一方しか選択できないとわかりました。
単純な疑問なのですが、どうして一方しか使えないような仕様になっているのか、理由が知りたいのです。
ハードフロー制御をあまり使ったことがないのですが、どちらか一方で足りるものなのでしょうか。
どうして。。。
こんにちは。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.」
チョコさん、こんにちは。NoMaYです。リプライ有難う御座います。チョコさんが3つ前の投稿で書かれていた8251Aの初期バージョンでのCTSの問題は、8251Aのdatasheetの以下の記載から、~CTS(~はローアクティブの印)が送信回路に入力されていることが分かりますので、論理設計ミスがあったのだろうな、とは推測出来るのです。ですが、8250(といっても8250Aですが)のdatasheetには「~CTS has no effect on the Transmitter.」と書かれていて、~CTSと送信回路は何の関係も無い筈で、それでどうしてそんなバグが発生したのか推測出来ないのです。あと、今しがた気付いたのですが、以下の文面からすると、8251Aでは送信途中に~CTS=Low→Highの変化があると送信中のデータが壊れる(その時点から強制的にTxD=Highになる)と読み取れるのですが、そうなのですか? (もしそうなら、そういうものはフロー制御と呼ぶものでは無いのでは?という気がしています。) ただ、チョコさんの3つ前の投稿には「CTSに対応するRTSはRxRDYを使っていた記憶があります。これでも,最悪で1キャラクタ分は送信されてくる可能性があったので,外部にF/Fを付けて,スタート・ビットでRTSをオフしたこともありました。」とも書かれていて、それと整合性が取れていない(スタートビットの初めの部分でTxDが一瞬だけHigh→Low→Highと変化するのみで、正常なデータが送信されることは無い?)ような気もして、首を傾げているところです。8251Aのdatasheetから抜粋Transmitter BufferThe Transmitter Buffer accepts parallel data from the Data Bus Buffer, converts it to a serial bit stream, inserts the appropriate characters or bits (based on the communication technique) and outputs a composite serial stream of data on the TxD output pin on the falling edge of ~TxC. The transmitter will begin transmission upon being enabled if ~CTS = 0. The TxD line will be held in the marking state immediately upon a master Reset or when Tx Enable or ~CTS is off or the transmitter is empty.
チョコです。 その当時のデバイスは設計変更すると,動いていたものが動かなくなることがよくありました。 CTSについても,Aのつかない8251では正しく動作していました。(オリジナルではチャントできていた 機能が改良版では動かなくなったパターンです。送信中のデータが破壊されるのは経験していませんが, これは単にタイミングの問題でしょう。当時,UARTの受信では,スタートビットの中央辺りでノイズが 載るとUARTが動かなくなってしまうなど結構問題がありましたよ。) また,当時は内部に訳の分からない回路があって,それが後から公開されたり,逆に,公開されていた 機能が削除されたりしていました。 8250でもCTSをサポートしようとして回路を組み込んだが問題があってCTS端子に動作しないように細工 したんじゃないかと想像されます。とにかくお客様のセットは出さないといけないので,その回路を 殺したものを正式な仕様にして,CTSが正常になったものを改版品としてしまったとか。 そんな時代でした。
追伸
スタートビット云々は,8251での話です。8251Aは使いませんでした(使えなかったので,古い8251を
かき集めて対応していました。その後,UPD71051に切り替えたので,8251Aは不採用でした)。