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