SCIのTENDフラグの注釈

お世話になります。sei10です。

 
RX210のSCIのTENDフラグについて質問させてください。

 
RX210のハードウェアマニュアル内、SCI(シリアルコミュニケーションインターフェース)にて、

TENDフラグ(トランスミットエンドフラグ)
送信が終了したことを表示します。
[“1”になる条件]
•SCR.TEビットが“0”(シリアル送信動作を禁止)のとき
SCR.TEビットを“0”から“1”にするときは、TENDフラグは影響を受けず“1”の状態を保持します。
•送信キャラクタの最後尾ビットの送信時、TDRレジスタが更新されていないとき
[“0”になる条件]
•SCR.TEビットが“1”の状態でTDRレジスタへ送信データを書き込んだとき
TDRレジスタへの送信データの書き込みによりTENDフラグをクリアしたときは、以下の順序でSSRレ
ジスタをダミーリードしてください。
(1)TDRレジスタに送信データを書く
(2)SSRレジスタを汎用レジスタに読み出す
(3)読み出した値を使って何らかの演算を実行する

との記載があります。

[“0”になる条件]で2つ気になることがあります。

①TEビットが1のままでTDRレジスタに間欠的に送信データを書き込んだ際は、
送信完了後にTENDレジスタを使う使わないに関わらず、
SSRレジスタをダミーリードしなければならないということなのでしょうか?

②恥ずかしながらこの一文を見落としていたため、TENDをif文で直に比較しているプログラムがあります。
if( 1 == SCI4.SSR.BIT.TEND )
{
 処理
}
アセンブラで見ると、
  MOV.L #0008A083H, R1 SCI4を汎用レジスタR1に読み出し
  MOVU.B 01H[R1], R1  構造体オフセットを取ってR1に読み出し
  SHLR #02H, R1   汎用レジスタR1を2ビット分論理右シフト
  AND #01H, R1   数値1と汎用レジスタR1の論理積を取りR1へ格納
  CMP #01H, R1   数値1と汎用レジスタR1を比較し、結果をR1へ格納
  BNE L204    異なっている場合はL204へ分岐
のような処理となっていました。
たまたまコンパイラが汎用レジスタにリードしてくれているため動いているという認識で良いでしょうか?
(コンパイラに依存するプログラムになってしまっている?)


よろしくお願いします。

  • TENDはSCI内のバッファにたまっていたデータがすべて送出された事を示すフラグです。
    別に、使用しないのであれば読み出さなくても良いはずです。
    簡単な送出動作であれば、今まであまり気にした事はありません。
    SCI設定を受信と送信で切り替えるような場合は、完全に送出してから切り替える必要があるため、
    TENDを活用する事になると思います。
    どうしても気になる場合は、Renesasの正式問合せルートで確証を得て下さい。
  • sei10さん、こんにちは。NoMaYです。お久しぶりです。

    きちんとした回答はルネサス社に確認する必要がありますが、RX210のSCI0~SCI11と同型のSCIcを搭載しているRX63NのUMを見たところ、以下のように記載されていました。

    TEND フラグ(トランスミットエンドフラグ)
    送信が終了したことを表示します。
    [“1” になる条件]
    ・ SCR.TE ビットが“0”(シリアル送信動作を禁止)のとき
    SCR.TE ビットを“0” から“1” にするときは、TEND フラグは影響を受けず“1” の状態を保持します。
    ・ 送信キャラクタの最後尾ビットの送信時、TDR レジスタが更新されていないとき
    [“0” になる条件]
    ・ SCR.TE ビットが“1” の状態でTDR レジスタへ送信データを書き込んだとき
    TDR レジスタへの送信データの書き込みによりTEND フラグをクリアしたときは、TEND フラグをリードして“0” であることを確認してください。

    これは推測なのですが、ひょっとして、CPU動作クロック的に考えた時、以下の赤文字の期間は TENDフラグ=1 が読めてしまう、ということではないでしょうか?

    SCR.TEビットが“1”の状態でTDRレジスタへ送信データを書き込んだ

    (A) その直後にSSRレジスタを汎用レジスタに読み出す
    (B) 読み出した値を使って何らかの演算を実行する
    (C) このタイミングになって初めて TENDフラグ=0 が読み出されるようになる
    (D) 以後、しばらくは TENDフラグ=0 が読み出される

    送信終了

    (E)  このタイミングで再び TENDフラグ=1 が読み出されるようになる

    そして、RX63NのUMで指示されていることは、以下のようにせよ、とういことのような気がします。

    (a) 割り込みを禁止する(私の勘ではUMは割り込みを使っていない前提で書かれたのでは?と思います)

    SCR.TEビットが“1”の状態でTDRレジスタへ送信データを書き込んだ

    (b) TENDフラグ=0 が読み出されるまでループせよ(TENDフラグ=1 が読めている間はループせよ)
    (c) 割り込み許可

    以後、しばらくは TENDフラグ=0 が読み出される

    (d) TENDフラグ=1 が読み出されたら送信終了

     

  • わわいです
    内蔵周辺デバイス全般に言えることですが、周辺IOクロックをベースとした同期回路になっています
    クロックごとを区切りとして各種処理が動いていく、というイメージですか。

    細かくいえば、
    ・TDRにデータを書きこむ動作を行う
    ・次のIOクロックが来ると、
    ・TDRにデータが書き込まれ、TENDを0とする
    という動作となります

    これがIOクロックとCPUクロックが同じであれば、書き込んで読むあいだに数クロック経過するため特別の配慮はいらないですが、最近のCPUではCPUクロックとIOクロックは別になっていて、CPUと周辺デバイスは同時に動かなくなってます。

    ということで、CPUはTDRにデータを書き込んだんだけど、IOクロックは来なくて次の処理に入ってないうちにTENDを読まれると、まだ1だった、ということがありえてしまいます
    ということで、一旦読み出し動作を挟んで、確実に内部処理を進めておく必要がある、ということだと思ってます

    #って、ホンマのところはルネサスの中の人に聞かないとねー
  • sei10さん
    「SCIのTENDフラグの注釈」ということなんですが、
    そんなに微妙なことを知る必要がありますか?
    TENDフラグですからTX(送信)がEND(完了した)フラグとでも解釈すれば良いように思いますが?
    送信していないのに1になっていたということはあり得ないと思います、
    それを割り込みで判定しても、if文で判定してもかまわないと思います、
    送信レジスタに書き込む場合は書き込み可能なのか確認するでしょうから。
  • Higetaka様
    回答ありがとうございます。さほど神経質にならなくてもよいもののようですね。
    Renesasに正式問合せしてみようかと思います。

    NoMaY 様
    お久しぶりです。毎度お世話になってます。ここの回答者は分かり易く教えて下さるので助かります。
    >>これは推測なのですが、ひょっとして、CPU動作クロック的に考えた時、
    >>以下の赤文字の期間は TENDフラグ=1 が読めてしまう、ということではないでしょうか?
    他のCPUまで調べてくださり感謝いたします。TDRをセットしたタイミングと、TENDのクリアのタイミングは完璧に同じというわけではない・・・というのは納得が出来ます。

    わわい様
    回答ありがとうございます。一旦読み出し動作を挟むのが確実な方法なのですが、
    現実ソフトはそうなっておらず・・・ということなので気になってました。

    IKUZO 様
    仰る通りです。ただ今回プログラムが、TEND=1を見ることでTDRが空であることを判断し、次のTDRをセットするつくりになっています。
    ノータイムでTDRセット→TENDチェックとなったとき、TENDが1のままであれば次のTDRをセットしにいってしまうのでは?と考え質問させて頂きました。情報が後出しになって申し訳ないです。


    色々と教えて頂きありがとうございました。
    一旦ソフト自体は動いているので、現状を仕様書に記載しつつ、ルネサスに問い合わせてみようと思います。

  • >ただ今回プログラムが、TEND=1を見ることでTDRが空であることを判断し、次のTDRをセットするつくりになっています。

     フラグの使い方を間違えています。RX621と同じSCIと言う仮定で回答します。
     TDRE が1のときに送信データを書き込めます。データを絶え間なく連続送信するには、TDRE で制御します。
     TEND は送信データが全部送出されたときに1になります。RS422などの送信ICを制御して、出力を開放状態にするのに使います。

     SCIはメーカにより個性が有ります。個性を予想して使わないと動かない。
     送信だったら送信データを書き込めば送信されるのも有るし、その後フラグ操作が必要なのも有ったりします。
     送信データを書き込んだ直後に「データ書き込んでいいよ。」と言うフラグがリセットされるのか、数クロック時間経ってからリセットされるのか、など色々と問題が有ります。

     「データ書き込んでいいよ。」と言うフラグを見て書き込み、すぐにそのフラグを見ると未だリセットされて無く、
    まだ書き込んでは行けないのに次のデータを書き込むとか。
  • わわいです

    あくまで、TDRにデータを書き込んだ直後にTENDを読んだら1の場合がありうる、ということなので、書き込んでから相当時間(RXならおそらく数命令程度)経過していれば、そのような事態にはならないのでしょう。
    問題なのは、TDRを書き込んでから、TEND(のレジスタ)を読むまでいくつの命令を経過しているか、ですね
    そこらへんを含めてコードを見直してみてください