ROMのmhirotaです。
"Henry Sugimoto of O.B." wrote:
> 1msec の タイマー 割り込みで 、多重割り込み許可した上で、2
> msec間 通せんぼ(1msec タイマー値更新をループで待つ)したら、
> SCI1 の、送信で 再送信直後の 1文字が 抜け、化けを おこして
> いました。 原因は SSR をバイトで 読んでいなかった点でした。
> if(1==SSI1.SSR.BIT.TDRE); 等のみでは、動作が おかしくなって
> います。 フェイクで、RE,RI,TI,TEI 割り込みの最初に
> int i;
> i=SCI1.SSR;
>
> を 行うと、動作が 正常になりました。 割り込み動作で、クリティカ
> ルなタイミングが ない場合、ビット操作のみで正常動作していました。
> 各フラグ ビットの 確認ではなく、SSR そのものを読むことで、改善
> された様に 感じます。 関連の、経験をされた方、ご意見をお聞か
> せ下さい。
i=SCI1.SSR;
だけでは 根本的な解決にはなっていないと思います。各チャネルのSSRのフラグは
「書き込み」に行かないと消えません。SSRレジスタは「READ RESET REGISTER」
ではありません。
ですから、TDREビットが立っているとき「送信器が空になったな」と思って
データを書きますね。これだけではTDREが立ったままなので、次の送信データ
を書くためにTDRE=1の条件を待つループを作るとすぐにTDRE=1の条件一致
となるため、前にTDRに書かれてまだTSRに転送されていないデータの上に上書き
されてしまうおそれがあります。
ですから、
1:TDRE=1の条件成立を待つ。
2:条件が成立したら、送信データをTDRに書く。
3:TDRE=0とする処理を行う。
:
:
という一連の処理が無いと正常に動作しません。
また、杉本さんは「送信終了時割り込み=TEI」を使った送信処理をやっているよう
ですがこのときも送信割り込み発生要因フラグ(TEI)の解除には上記のTDREの
「リードモデファイライト動作」が必ず必要です。これをちゃんとやっていますか?
同様に、SSR内のRDRF,ORER,RER,PERフラグもリセットにはリードモデファイライト
が必要です。
--
/******************************************************************************
Name: "Masataka Hirota"
E-mail address: mhirota@xxxxxxxxxxxxx
GCD03040@xxxxxxxxxxx
******************************************************************************/