RX621マイコンでのSCI通信について

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

以前、シリアル通信についての質問をさせて頂きました。
SCIポートの作成もして、SCI通信をしようとしているのですが、思うように動作しません。

環境
・windows7
・RX621マイコン
・開発環境 HEW
・シリアル通信 テラターム
・通信 PC⇒RS232C⇒マイコンのSCIポート

動作
PCで数値を入力する
  ↓
その数値に応じた値を8bitLEDに表示

例)数値5 ⇒ LLLL\,LHLH

以下に、作成したプログラムを添付します

#include \”iodefine.h\”
#include <machine.h>

void InitSci2();
void sendData(char key);

void main(void){
int RData\,RDatax;
clrpsw_i();
//割り込みマスク変更禁止

InitSci2();
//SCI2の初期化

PORTA.DDR.BYTE = 0xFF;
//出力ポート

while(1){
if(SCI2.SSR.BIT.RDRF){
//受信できたらフラグが立つ

SCI2.SSR.BIT.RDRF = 0;
//受信フラグを解除

RData = SCI2.RDR;
//受信データをRDataに格納

sendData(RData);
//受信データをそのまま送信

RDatax = RData & 0x0F;
//受信データのマスク

PORTA.DR.BYTE = RDatax;
//マスクをかけたデータをLEDに表示

}
}
}

void InitSci2(void){
unsigned int dmy;
//初期設定

IOPORT.PFFSCI.BIT.SCI2S = 0;
//SCI2の使用設定

SCI2.SCR.BYTE = 0;
//シリアルコントロールレジスタ(SCIの送信/受信動作設定)

SCI2.SMR.BYTE = 0;
//シリアルモードレジスタ(SCIの通信フォーマットの設定)

SCI2.BRR = 80;
//9600bps

for(dmy = 280;dmy > 0;dmy--);
//Wait 1bit transfer time 時間稼ぎ

//動作開始設定
SCI2.SCR.BYTE = 0x70;
SCI2.SSR.BYTE &= 0x80;
}

void sendData(char key){
while(!SCI2.SSR.BIT.TDRE);
//送信完了まで待機

SCI2.TDR = key;
//送信データの格納

SCI2.SSR.BIT.TDRE = 0;
//送信フラグを立てる
}

小さな間違いでも構いませんので、ぜひご指導のほどよろしくお願い致します。
Parents
  • RX62NでのSCIサンプルを添付しました。
    テキストを貼付けると長くなるので、PDFにしてあります。
    部分的にテキストコピーできると思います。

    サンプルはInterface誌の付録ボードで動作確認したものです。
    通信エラー処理は入っていません。
    SCI1を使用しているので、SCI2に置き換えてみて下さい。
    RX621でも、ボードのクロックにあわせて変更するだけで動作すると思います。

    ハードが正常なら、ソフトでてっとりばやく動かすポイントは
    1) まずはエラーを無視する。
    2) SSR(ステータスレジスタ)に書き込まない。
    だと思います。

    SSRレジスタのTDRE\,RDRFビットは、ハードウェアマニュアルを見ると、「注2 書く場合'1'として下さい」という理解に苦しむ注が書いてあります。そのため、0を書き込む場合はどうするの?という疑問が湧いてきます。

    SCIの章を読んでいると、TDRE\,RDRFはTDR\,RDRを書いたり読んだりする事で更新されるだけのような書き方となっています。しかし、エラービットORER\,FER\,PERはクリアしろとなっており、ちょっとややこしいです。ORER\,FER\,PERを更新する場合はTDRE\,RDRFに影響を与えないように、ビット単位でクリアした方が良いかもしれません。

    私が参考にしたのは、ルネサスのアプリケーションノート
    「RX62N、M16C/62P SCI移行ガイド」
    です。(ルネサスのサイトから入手できます)

    このドキュメントのM16Cの所は無視して、RX62Nのところだけ参考にすれば良いと思います。(特に初期化部分)

    なお、このドキュメントでは、SSRのTDRE\,RDRFビットを使わずに、割り込みコントローラのIRビットを使って、同様の処理を実現しています。

    添付のソース(PDF)では、USE_IRシンボルを定義するとIRを使用し、未定義だと、TDRE\,RDRFを使用します。

    ちなみに、RX63系ではTDRE\,RDRFビットが廃止されており、IRを使うと、ポーリング動作が実現できると思います。
    (先ほどのドキュメントでは、ポーリングではなく、割り込みを推奨すると書いてありましたが...)

    9mEHjQfhZecbYRu3_A0452.pdf

Reply
  • RX62NでのSCIサンプルを添付しました。
    テキストを貼付けると長くなるので、PDFにしてあります。
    部分的にテキストコピーできると思います。

    サンプルはInterface誌の付録ボードで動作確認したものです。
    通信エラー処理は入っていません。
    SCI1を使用しているので、SCI2に置き換えてみて下さい。
    RX621でも、ボードのクロックにあわせて変更するだけで動作すると思います。

    ハードが正常なら、ソフトでてっとりばやく動かすポイントは
    1) まずはエラーを無視する。
    2) SSR(ステータスレジスタ)に書き込まない。
    だと思います。

    SSRレジスタのTDRE\,RDRFビットは、ハードウェアマニュアルを見ると、「注2 書く場合'1'として下さい」という理解に苦しむ注が書いてあります。そのため、0を書き込む場合はどうするの?という疑問が湧いてきます。

    SCIの章を読んでいると、TDRE\,RDRFはTDR\,RDRを書いたり読んだりする事で更新されるだけのような書き方となっています。しかし、エラービットORER\,FER\,PERはクリアしろとなっており、ちょっとややこしいです。ORER\,FER\,PERを更新する場合はTDRE\,RDRFに影響を与えないように、ビット単位でクリアした方が良いかもしれません。

    私が参考にしたのは、ルネサスのアプリケーションノート
    「RX62N、M16C/62P SCI移行ガイド」
    です。(ルネサスのサイトから入手できます)

    このドキュメントのM16Cの所は無視して、RX62Nのところだけ参考にすれば良いと思います。(特に初期化部分)

    なお、このドキュメントでは、SSRのTDRE\,RDRFビットを使わずに、割り込みコントローラのIRビットを使って、同様の処理を実現しています。

    添付のソース(PDF)では、USE_IRシンボルを定義するとIRを使用し、未定義だと、TDRE\,RDRFを使用します。

    ちなみに、RX63系ではTDRE\,RDRFビットが廃止されており、IRを使うと、ポーリング動作が実現できると思います。
    (先ほどのドキュメントでは、ポーリングではなく、割り込みを推奨すると書いてありましたが...)

    9mEHjQfhZecbYRu3_A0452.pdf

Children
No Data