UARTのCTS・RTSについて

RX231を使用しています。

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

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

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

どうして。。。

  • チョコです。
    8250は使ったことはありませんが,何となく,これは8251Aの初期バージョンのCTSの問題と同じトラブルのようですね。
    以前のNSのイメージは,"とにかくバグが多い"でした。

    >8251とZ8440は、調歩同期式シリアルとクロック同期式シリアル
    8251の同期式シリアルはSPIのようなクロック同期シリアルとは違います。あくまで,回線経由で通信する
    ことを意識した通信で,データを通信していないときには,同期キャラクタをやり取りすることで,同期
    状態を保持するものです(マイコン関係ではあまり使いませんでしたが)。
  •  チョコさん、こんにちは。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 Buffer

    The 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は不採用でした)。

  • 色々とバグの話が出てきますね。
     こんなのも有ります。

     ハイパーターミナルでボーレイトを上げても速くなりませんでした。
     調べてみるとデータを間欠的に送信していました。
     例えば1/100秒の割り込みで処理していれば、100バイト/秒 の速度しか出ない訳です。
     WINDOWS のあるバージョンのハイパーターミナルがそのようになっていました。

     uPC8251AFのマニュアルを調べましたが、CTSがOFFになっても送信中のデータは最後まで送られます。

     Z80のSCIは2チャンネルです。両方に交互に同じデータを書いてプログラムしようとすると出来ないトラブルが有りました。トラ技に書いてありました。自分でも検証してみたが、その通りでした。
     方チャネルずつプログラムしないと、正常にプログラム出来ないのです。
  • こんにちは。NoMaYです。

    昔のシリアルインターフェースLSIについては夜にまた投稿しようと思いますが、今では単体のシリアルインターフェースLSIは使わないでマイコン内蔵のシリアルインターフェースを使うことになります。いつものことながら、しつこい&くどい、なぁとは思いつつ、各ベンダのマイコンを調べてみました。といっても、滅茶苦茶な数のマイコンがありますので、以下でGoogle検索してみて最初にdatasheetのPDFが見付かったものを調べることにしました。(なお、調べている最中にGoogle検索の結果が変動することもありました。また、見付かったPDFが簡易版だったために、完全版のリファレンスマニュアルを参照したものもあります。)

    Google検索:
    www.google.co.jp/search?q=<ベンダ名>+<ファミリ名>+datasheet

    結果は以下の通りです。片方しか使えないものはありませんでした。(両方使えないものはありました。) あと、びっくりしたこととして、STM32で日本語のリファレンスマニュアルがあったことです。ただ、文章に違和感もありますので、機械翻訳(というか今はAIと表記するのでしょうね)を使用して自動翻訳したもの(それをベースに人が最小限の修正したもの?)なのかも知れません。

    www.google.co.jp/search?q=Microchip+SAM+datasheet
    (例) SAM G54G / SAM G54N
    The Atmel® | SMART SAM G54 is a series of Flash microcontrollers based on the high-performance 32-bit ARM® Cortex®-M4 RISC processor. They operate at a maximum speed of 96 MHz and feature up to 512 Kbytes of Flash and 96 Kbytes of SRAM.

    CTS・RTS ⇒ 有り(UARTには無いがUSARTには有る)
    両方とも使える
    内蔵ハードウェアによる自動的なハードウェアハンドシェイクが可能

    www.google.co.jp/search?q=Microchip+PIC32+datasheet
    (例) PIC32MX5XX/6XX/7XX
    32-bit Microcontrollers (up to 512 KB Flash and 128 KB SRAM) with Graphics Interface, USB, CAN, and Ethernet
    Core: 80 MHz/105 DMIPS MIPS32® M4K®
    • MIPS16e® mode for up to 40% smaller code size
    • Code-efficient (C and Assembly) architecture
    • Single-cycle (MAC) 32x16 and two-cycle 32x32 multiply

    CTS・RTS ⇒ 有り
    両方とも使える
    内蔵ハードウェアによる自動的なハードウェアハンドシェイクが可能

    www.google.co.jp/search?q=Microchip+AT32+datasheet
    (例) AT32UC3C
    High Performance, Low Power 32-bit AVR® Microcontroller
    – Compact Single-cycle RISC Instruction Set Including DSP Instruction Set
    – Built-in Floating-Point Processing Unit (FPU)
    – Read-Modify-Write Instructions and Atomic Bit Manipulation
    – Performing 1.49 DMIPS / MHz
     • Up to 91 DMIPS Running at 66 MHz from Flash (1 Wait-State)
     • Up to 49 DMIPS Running at 33 MHz from Flash (0 Wait-State)
    – Memory Protection Unit
    Multi-hierarchy Bus System
    – High-Performance Data Transfers on Separate Buses for Increased Performance
    – 16 Peripheral DMA Channels Improves Speed for Peripheral Communication
    Internal High-Speed Flash
    – 512 Kbytes, 256 Kbytes, 128 Kbytes, 64 Kbytes Versions
    – Single Cycle Access up to 33 MHz
    – FlashVault™ Technology Allows Pre-programmed Secure Library Support for End User Applications
    – Prefetch Buffer Optimizing Instruction Execution at Maximum Speed
    – 100,000 Write Cycles, 15-year Data Retention Capability
    – Flash Security Locks and User Defined Configuration Area
    Internal High-Speed SRAM, Single-Cycle Access at Full Speed
    – 64 Kbytes (512 KB and 256 KB Flash), 32 Kbytes (128 KB Flash), 16 Kbytes (64 KB Flash)
    – 4 Kbytes on the Multi-Layer Bus System (HSB RAM)

    CTS・RTS ⇒ 有り
    両方とも使える
    内蔵ハードウェアによる自動的なハードウェアハンドシェイクが可能

    www.google.co.jp/search?q=TI+TM4C+datasheet
    (例) TM4C123GH6PM
    Texas Instrument's Tiva™ C Series microcontrollers provide designers a high-performance ARM® Cortex™-M-based architecture with a broad set of integration capabilities and a strong ecosystem of software and development tools. Targeting performance and flexibility, the Tiva™ C Series architecture offers a 80 MHz Cortex-M with FPU, a variety of integrated memories and multiple programmable GPIO.

    CTS・RTS ⇒ 有り(ただし8つあるUARTのうちの1つのみ)
    両方とも使える
    内蔵ハードウェアによる自動的なハードウェアハンドシェイクが可能

    www.google.co.jp/search?q=TI+C2000+datasheet
    (例) TMS320F28004x Piccolo™
    TMS320C28x 32-Bit CPU
    – 100 MHz
    – IEEE 754 Single-Precision Floating-Point Unit (FPU)
    – Trigonometric Math Unit (TMU)
    – 3×-Cycle to 4×-Cycle Improvement for Common Trigonometric Functions Versus Software Libraries
    – 13-Cycle Park Transform
    – Viterbi/Complex Math Unit (VCU-I)
    – Ten Hardware Breakpoints
    Programmable Control Law Accelerator (CLA)
    – 100 MHz
    – IEEE 754 Single-Precision Floating-Point Instructions
    – Executes Code Independently of Main CPU
    On-Chip Memory
    – 256KB (128KW) of Flash (ECC-Protected) Across Two Independent Banks
    – 100KB (50KW) of RAM (ECC-Protected or Parity-Protected)
    – Dual-Zone Security Supporting Third-Party Development
    – Unique Identification Number

    CTS・RTS ⇒ 無し

    www.google.co.jp/search?q=NXP+LPC+datasheet
    (例) LPC1769/68/67/66/65/64/63
    32-bit ARM Cortex-M3 microcontroller; up to 512 kB flash and 64 kB SRAM with Ethernet, USB 2.0 Host/Device/OTG, CAN
    The LPC1768/67/66/65/64/63 operate at CPU frequencies of up to 100 MHz. The LPC1769 operates at CPU frequencies of up to 120 MHz. The ARM Cortex-M3 CPU incorporates a 3-stage pipeline and uses a Harvard architecture with separate local instruction and data buses as well as a third bus for peripherals. The ARM Cortex-M3 CPU also includes an internal prefetch unit that supports speculative branching.

    CTS・RTS ⇒ 有り(ただし4つあるUARTのうちの1つのみ)
    両方とも使える
    内蔵ハードウェアによる自動的なハードウェアハンドシェイクが可能

    www.google.co.jp/search?q=NXP+Kinetis+datasheet
    (例) K10 Sub-Family
    Performance
    – Up to 100 MHz ARM Cortex-M4 core with DSP instructions delivering 1.25 Dhrystone MIPS per MHz
    Memories and memory interfaces
    – Up to 512 KB program flash memory on non-FlexMemory devices
    – Up to 128 KB RAM
    – Serial programming interface (EzPort)
    – FlexBus external bus interface

    CTS・RTS ⇒ 有り
    両方とも使える
    内蔵ハードウェアによる自動的なハードウェアハンドシェイクが可能

    www.google.co.jp/search?q=STMicro+STM32+datasheet
    (例) STM32F103x8 STM32F103xB
    ARM® 32-bit Cortex®-M3 CPU Core
    – 72 MHz maximum frequency, 1.25 DMIPS/MHz (Dhrystone 2.1) performance at 0 wait state memory access
    – Single-cycle multiplication and hardware division
    Memories
    – 64 or 128 Kbytes of Flash memory
    – 20 Kbytes of SRAM
    おお!日本語リファレンスマニュアルがある!

    CTS・RTS ⇒ 有り
    両方とも使える
    内蔵ハードウェアによる自動的なハードウェアハンドシェイクが可能

    [余談]

    ちなみに、今回気付いたSTM32の日本語リファレンスマニュアルですが、以下の通りの記載がありました。

    この資料は、STMicroelectronics NV 並びにその子会社( 以下ST) が英文で記述した資料(以下、「正規英語版資料」)を、皆様のご理解の一助として頂くためにST マイクロエレクトロニクス㈱が英文から和文へ翻訳して作成したものです。この資料は現行の正規英語版資料の近時の更新に対応していない場合があります。この資料は、あくまでも正規英語版資料をご理解頂くための補助的参考資料のみにご利用下さい。この資料で説明される製品のご検討及びご採用にあたりましては、必ず最新の正規英語版資料を事前にご確認下さい。ST 及びST マイクロエレクトロニクス㈱は、現行の正規英語版資料の更新により製品に関する最新の情報を提供しているにも関わらず、当該英語版資料に対応した更新がなされていないこの資料の情報に基づいて発生した問題や障害などにつきましては如何なる責任も負いません。

  • チョコです。
    >両方に交互に同じデータを書いてプログラムしようとすると出来ないトラブルが有りました。
    Z80の周辺ICは使ったことはありませんが,回路をできるだけ簡単にするためだと思われます。ここらは,16ビットのレジスタを8ビットで2回書き込むような場合に,内部に上位/下位を示すフラグが1つだけあって,全ての16ビットレジスタで共通にそのフラグでレジスタの上位に書くか下位に書くかを制御している場合に発生します。
    兎に角,16ビットのレジスタは必ず連続してアクセスしないといけませんでした。
  • チョコさん

    >16ビットのレジスタを8ビットで2回書き込むような場合に,内部に上位/下位を示すフラグが1つだけあって,全ての16ビットレジスタで共通にそのフラグでレジスタの上位に書くか下位に書くかを制御している場合に発生します。

     「そうか!だけど16ビットのレジスタは有ったかな?」と思い家のマニュアルを調べたのですが、Z80-SIOが無い。
     マニュアルにはPIO(パラレルI/F)とCTC(タイマー)が載っているが、SIO(シリアルI/F)が無い。
     このマニュアルに書かれていると思ったのに、過去の自分はどの資料を見たのかと、自分に対して不思議な気持ちです。
     インターネットで調べたら、同期キャラクタが2バイトでした。これに引っ掛かったのかも知れない。
     しかし、同期通信はやったことが無い。使わないレジスタにも書いたためにトラブルが起きたのかな。
     まだ疑問は残ります。
  • こんにちは。NoMaYです。(すみません。昨夜は眠さに負けてしまいました。)

    リカルドさん、uPD8251AF(uP‘C’8251AFは打ち間違いですね)のマニュアル調査結果、有難う御座いました。
    チョコさん、スタートビット(と外部に付けたF/F)の件はA無し8251だったとの返信、有難う御座いました。

    Intel 8251Aのデータシートと互換品/上位?互換品の、東芝 TMP8251A、NEC μPD8251A/AF、NEC μPD71051、のデータシートを見比べてみました。(TMP8251AはデータシートのPDFの19ページ以降です。) 私の感想は、これは現物を動かさないと分からないな、というものですが、昨日の他マイコン調査で、片方しか使えないという仕様が少なくとも今はルネサスRXマイコン特有のものであることを理解したので、昔を気にするのはもうやめることにします。それよりも、RXマイコンと他社マイコンを繋ぐと何か問題が発生するか、とか、発生するなら回避策があるか、とか、そちらの方が気になり始めました。

    以下、比較結果です。

    Intel 8251A
    www.datasheetcatalog.com/datasheets_pdf/8/2/5/1/8251A.shtml
    ・オリジナル
    ・文章だけでは送信途中に~CTS=Low→Highの変化があると送信中のデータが壊れるような印象あり
    ・その一方で波形データの図を見ると最後まできちんと送信されていて矛盾している

    東芝 TMP8251A
    www.datasheetcatalog.com/datasheets_pdf/T/M/P/8/TMP82C51A.shtml
    ・Intel 8251Aのデータシートをテクニカルライターが全体構成や文章細部や図を手直したような印象
    ・原本からのスキャンが綺麗であり波形データが見易い
    ・「Figure 6.10 Transmitter Control and Flag Timing (SYNC Mode)」の SYNC Mode は ASYNC Mode の間違いと思われる
    ・文章細部の手直しにより文章からはデータが壊れるような印象がオリジナルよりも強くなっている
    ・その一方で波形データの図を見ると最後まできちんと送信されていて矛盾している

    NEC μPD8251A/AF
    www.datasheetcatalog.com/datasheets_pdf/U/P/D/8/UPD8251AF.shtml
    ・Intel 8251Aのデータシートとは文章が結構変更されている(LSIの動作が違うのかと思う程の違いもある)
    ・こちらの文章では送信途中に~CTS=Low→Highの変化があると送信中のデータが壊れるような印象は全く無い
    ・従って波形データの図で最後まできちんと送信されていることと矛盾しない

    NEC μPD71051
    www.datasheetcatalog.com/datasheets_pdf/U/P/D/7/UPD71051.shtml
    ・型番が変わっている程なのでデータシートもリニューアルされて詳しくなっている
    ・反面、波形データは貧弱になってしまっていて、~CTS=Low→Highの変化でTxDがどうなるか追うことが出来ない
    ・送信途中に~CTS=Low→Highの変化があった場合の動作は文章として以下のように明文化されていた

    If ~CTS is set equal to 1 during transmission, the sending operation stops after sending all currently witten data and the TxDATA pin goes high.

    ・でもstops after sending all currently witten dataでは思っていた動作より1文字多く出力される場合がある
    ・それを踏まえて8251Aの波形データの図を見ると確かに思っていた動作より1文字多く出力されている

    以下、datasheetの波形データの図です。(東芝 TMP8251Aを最初に持って来たのは図が綺麗だったからです。)

    東芝 TMP8251A


    Intel 8251A


    NEC μPD8251A/AF


  • チョコです。
    それでは,最後に(?)ダメ押しで...
    まず,CTSをHighにしたときの送信データですが,3番目のデータは既に8251Aに書き込まれていたためです。
    つまり,ダブル・バッファ構成になっているために,送信中のデータ(これは,シフトレジスタにある)以外に,バッファに3番目のデータが格納されていて,ここまでが送信されてしまいます(CTSがHighになった後のデータは送信されていません)。内部的には送信中という状態をTxEmptyと言う信号で確認して,送信中のデータが送信完了したと判断しているからでしょう(最初はもっと早く止めようとしたけど,それだと,送信中のデータまで止まってしまったのでしょう)。
    とにかく,仕様としては,CTS信号が立ち上がったら,送信中のデータの送信が終わったら,新しいデータは送信しないです。参照されている文中にもstops after sending all currently witten dataとなっている通りです。最初,細かなタイミング設計のミスでその機能に問題が発生して使えなくなったが,機能としては重要な機能なので,タイミングを安全な方にずらして修正した結果がこのタイミング・チャートでしょう。(設計そのものを見たわけではないので,あくまで想像です。)
    このタイミング・チャートからも分かるように,CTS信号は,Highになってから何キャラクタ送信されるかは規定されていません。8251AにはFIFOはないので,最悪送信中のデータとバッファ分の2キャラクタですが,FIFOがあればどれだけになるか分かりません。
    つまり,システムとして,使う方がどこまでマージンを持たせるかの問題です。
    そもそも,CTSはMODEMでは,「パケット」の送信許可信号のはずで,最悪,パケットが完了するまで送信されるものと考えるものなんだと思います。それを,マイコン関係で曲解して使っただけでしょう。
    ということで,個々のケースで何キャラクタ送信されるは異なるので,後は使う方がマージンをもたせろということでしょう。
  • チョコさん、こんにちは。NoMaYです。

    リプライ有難う御座います。相手側のソフトウェアが、何が繋がるか分からない、最悪パケットが完了するまで送られてしまうこともある、ということを想定して作られていれば大丈夫なのだと思いますが、今時の32bitマイコンで内蔵ハードウェアでRTS/CTSのフロー制御をやれないものがあるとは想定していなかった、そんなマイコンの為にソフトウェアを複雑化させるのは勘弁して欲しい、という感覚/発想で相手側が開発されていた場合どうなるのかなぁ、という点が気になった、と私が気になったことを再定義させて下さい。

    そういう場合でも、RXマイコン側のソフトウェアを頑張れば(出来れば余り頑張らずとも)対処可能なのか、ギブアップして他社32bitマイコンを検討するのが得策なのか、そういうところが気になりました。そして今思うのは、もともとのalmondさんの懸念も突き詰めると根っ子としてはそういうことではないのかなぁ、という気がして来ました。

    そして、そうなると案件の詳細に依存してしまうので概略的なことは何も言えない、となってしまうのか、わわいさんがやリカルドさんが書かれたような、(私の勝手な解釈とも言えますが)CTS制御がハードウェアで出来れば後はソフトウェアで何とかなる、(ポイントさえ分かればソフトウェアを書くのは難しくない筈、) ぐらいは言えそうなのか、そういうのが回答出来たら良いのかなぁ、と今は思うのです、、、