お世話になります。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へ分岐のような処理となっていました。たまたまコンパイラが汎用レジスタにリードしてくれているため動いているという認識で良いでしょうか?(コンパイラに依存するプログラムになってしまっている?)
よろしくお願いします。
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 が読み出されたら送信終了
Higetaka様 回答ありがとうございます。さほど神経質にならなくてもよいもののようですね。 Renesasに正式問合せしてみようかと思います。 NoMaY 様 お久しぶりです。毎度お世話になってます。ここの回答者は分かり易く教えて下さるので助かります。 >>これは推測なのですが、ひょっとして、CPU動作クロック的に考えた時、 >>以下の赤文字の期間は TENDフラグ=1 が読めてしまう、ということではないでしょうか? 他のCPUまで調べてくださり感謝いたします。TDRをセットしたタイミングと、TENDのクリアのタイミングは完璧に同じというわけではない・・・というのは納得が出来ます。 わわい様 回答ありがとうございます。一旦読み出し動作を挟むのが確実な方法なのですが、 現実ソフトはそうなっておらず・・・ということなので気になってました。 IKUZO 様 仰る通りです。ただ今回プログラムが、TEND=1を見ることでTDRが空であることを判断し、次のTDRをセットするつくりになっています。 ノータイムでTDRセット→TENDチェックとなったとき、TENDが1のままであれば次のTDRをセットしにいってしまうのでは?と考え質問させて頂きました。情報が後出しになって申し訳ないです。 色々と教えて頂きありがとうございました。 一旦ソフト自体は動いているので、現状を仕様書に記載しつつ、ルネサスに問い合わせてみようと思います。