初歩の質問ですみません。シリアル通信ができません。

RX621マイコンを使っているのですがシリアル送信がうまくいきません。マイコンとbluetooth無線通信モジュールをつかって、PCへ文字をシリアル送信したいのですが、tera termには文字が表示されず送られているのか確認できません。プログラムはマニュアルを見ながらかいたのですが、以前使っていたH8マイコンとは少し違うようで何か間違いがあるかもしれません。以下にプログラムを載せるので、間違いや少しでも気になる所、もっと別のコードがあるなどあればアドバイスをお願いします。

あと出力端子はTxD2-Aを使用しているのですが、このAの意味がわかりません。TxDn, TxDn-A, TxDn-Bの違いも教えていただけるとありがたいです。

全部でなくても少しでも分かる事があれば回答よろしくお願いします。

/////////////////////////////////////////////////////////////////////////////
コンパイルエラーはありません。
TXI割り込みを用いて'a'一文字を約一秒ごとに送信しています。
TXI割り込みが起こるたびにポートDのビット0とビット1に
接続しているLEDが交互に光ります。
LEDは交互に一秒ごとに光るため割り込みは起こっていると思います。
PCLKは24MHzです。
/////////////////////////////////////////////////////////////////////////////

#define SCI_BPS_9600 77

int flag = 0;

void main(void);
void sci_init(int baud);
void sci_send(void);

void main(void){
long int i;
PORTD.DDR.BYTE = 0xff;
PORTD.DR.BYTE = 0xff;

sci_init(SCI_BPS_9600);

while(1){
for(i=0;i<6000000;i++){}
flag = ~flag;
SCI2.SCR.BYTE = SCI2.SCR.BYTE | 0x30;
SCI2.SCR.BYTE = SCI2.SCR.BYTE & 0xcf;
}
}

void sci_init(int baud){
volatile int i;
SYSTEM.MSTPCRB.BIT.MSTPB29 = 0;
PORT1.DDR.BYTE = 0xff;

IOPORT.PFFSCI.BIT.SCI2S = 0;

SCI2.SCR.BYTE=0x00;
SCI2.SCR.BIT.CKE = 0;
SCI2.SMR.BYTE=0x00;
SCI2.SCMR.BYTE = 0x00;

SCI2.BRR=(unsigned char)baud;

for(i=2600; i > 0; i--);

SCI2.SCR.BIT.TIE = 1;
SCI2.SCR.BIT.RIE = 1;
SCI2.SCR.BIT.TEIE = 1;
ICU.IPR[0x82].BIT.IPR = 1;
ICU.IER[0x1c].BIT.IEN0 = 1;
}

void sci_send(void){
SCI2.TDR = 'a';
PORTD.DR.BIT.B0 = flag;
PORTD.DR.BIT.B1 = ~flag;
}

////////////////// intprg.c ////////////////////////
void Excep_SCI2_TXI2(void){
sci_send();

Parents
  • sci_send() が TXI 割り込みからしか呼ばれてないようですが、sci_send() を main() の sci_init() の後で呼ぶとかなんかしないと TXI 割り込みも発生しないのでは?ああ違うか。sci_send() は呼ばれてんのか。

    とりあえずのところ↓あたりを参考にされるのが近道ではないかと思いますが。

    RX62N、RX621 グループ SCIa を用いた調歩同期式通信

    japan.renesas.com/.../an_r01an1883jj_rx62n_621_serial.jsp

  • fujita nozomuさん、コメントありがとうございます。

    TXI割り込み時に呼ばれる関数(sci_send)で一度だけTDRに書き込むとドキュメントに書いてあったのですが、こういう事でいいのでしょうか?

    教えていただいたサイトのプログラムも読んでみまして、同じような処理がしてありましたが、複雑すぎて全部は理解できてません。初心者ですみません。

    もし、プログラムに間違いがなければ、ボーレートや接続機器を見直してみます。

  • 過去のシリアルがらみのスレッドで参考になりそうなものです。

    タイトルで検索すると出てきます。

    「RX62Nの送受信割込み制約」

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

    ---

    上記のスレッドでサンプルプログラムを掲載したのですが、ここに再添付します。

    テキストファイルでなくて、PDFです。

    以下はその時の説明です。

    ---

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

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

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

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

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

    Sample_SCI.pdf
  • 先ほど添付したPDFのオリジナルソースが見つかったので、添付します。

    zip内にCソースが入っています。

    SampleSCI.zip
Reply Children
  • TxD2-AのAの意味ですが、Aグループと解釈すれば良いと思います。

    ポートファンクションレジスタで端子グループを切り替える際に、TxDn-AとRxDn-Aはセットで選択するようになっています。TxDn-AとRxDn-Bのようにグループが違う、ちぐはぐな選択はできません。

  • Higetakaさん,コメントありがとうございます。

    TxD2-A,Bの意味はわかりました,ありがとうございます。

    教えていただいたプログラム(Sample_SCI.pdf)を実行してみたところtera termが(応答なし)となってすぐクラッシュしてしまいます。

    USE_IRシンボルを定義すした場合も同じ結果でした。

    それとmain関数の最後のforループがなぜか繰り返し行われていないかもしれません。

    プログラムを少し改変してfor文の繰り返し中にLEDを光らせて確認してみました。

    以下に改変したプログラムを載せます。

    少しでも何かわかればお力添えお願いします。

    //////////////////////////////////////////////////////////

    この関数の実行中はLEDを光らせるようにしました

    //////////////////////////////////////////////////////////

    static void delay_1ms(void)

    {

       // 実測でループ回数を決定

       unsigned int n = 20000;

       // LED_DR = LED_ON;

       while (n--)

           nop();

       // LED_DR = LED_OFF;

    }

    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    static void delay_1ms(void)

    {

       // 実測でループ回数を決定

       unsigned int n = 20000;

       LED_DR = LED_ON;

       while (n--)

           nop();

       LED_DR = LED_OFF;

    }

    /////////////////////////////////////////////////////////////////////////////////////

    受信を行っていないためforループのsci_sendを’A'を送信するようにしました

    /////////////////////////////////////////////////////////////////////////////////////

    void main(void)

    {

    unsigned char ch;

    setup_clock();

    setup_port();

    setup_sci();

    // setpsw_i();

    // clrpsw_i();

    // LED_DR = LED_ON;

    sci_send('A');

    sci_send('B');

    sci_send('C');

    sci_send('D');

    sci_send('E');

    sci_send('F');

    for(;;){

    ch = sci_recv();

    sci_send('ch');

    }

    }

    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    void main(void)

    {

    unsigned char ch;

    setup_clock();

    setup_port();

    setup_sci();

    // setpsw_i();

    // clrpsw_i();

    // LED_DR = LED_ON;

    sci_send('A');

    sci_send('B');

    sci_send('C');

    sci_send('D');

    sci_send('E');

    sci_send('F');

    for(;;) {

    delay_ms(100);

    ch = sci_recv();

    sci_send('A');

    }

    }

  • プログラム実行でターミナルソフトがハングするのであれば、見込みはありだと思います。

    ターミナル側で何等かのデータを受信している可能性があります。

    (それ以前は何も反応なしという事でしたか?)

    ---

    こちらからはそちら側の環境が見えず想像しにくいので、情報の開示をお願いします。

    まずは、今確認されている環境(マイコンからPCまでの接続経路)がどうなっているのかです。

  • Higetakaさん,ありがとうございます。

    ・windows7

    ・RX621マイコン(R5F56218DFP)

    ・bluetooth通信モジュール(VS-BT001) 

    ・開発環境 HEW

    ・シリアル通信 teraterm

    ・マイコンと無線通信モジュールを接続し,そこからPCに接続したドングルを通して通信しています

    main関数の最後のch = sci_recv();をコメントアウトしたところ,クラッシュはせず,ループも行われるようになりました。teraterm上では「・・・」とでて以降表示されなくなったり,3文字ぐらい文字化けをおこして以降表示されなくなる現象が生じています。また,teratermを開いてから何も表示されないときもあります。無線通信モジュールのLEDが点滅し続けているので何かしらは送り続けていると思います。初期設定はコピペのままなのですが,ボーレートなどの設定が間違っているのでしょうか?

  • たぶんボーレートの違いだと思われます。もうひと頑張りです。

  • PCLKの値が間違っているのでしょうか?ボーレートの間違いがあるとすればそこくらいしかないのですが。

    コンペアマッチタイマにも同様のクロック設定を行いLEDの光る間隔から,PCLKが自分が思っている値とあっているか調べたのですが,ちゃんと思っていた間隔でLEDが光ったので間違いないんじゃないかと思うんですが。

    SYSTEM.SCKCR.BIT.PCK = 1;

    ↑でPCLKは(12MHz×4 =)48MHzという認識で間違いないでしょうか?

  • 提供したサンプルは外部クロック12MHzのボードでPCLK x4 (48MHz)の設定にしたものです。

    9600 bpsの設定で通信実績のあるものです。

    ---

    bluetooth通信モジュール(VS-BT001)ですが、仕様を見ると、

    出荷時の通信仕様:115200bps、パリティなし、1ストップビット

    2線式通信速度範囲:2400bps~921.6kbpsまで11段階

    となっています。

    マイコンと通信モジュールとPCターミナルのすべての通信速度設定が同じになっているかどうか、再確認されてみてはいかがでしょうか。

  • 直接の回答では有りませんが、デバッグ作業のご参考に

    本件ではテラターム使用との事ですが、やはりテキストモードでしょうか?

    HEX表示モードにすれば文字化けする事無く内容が表示されます

    ただ、テラタームよりも便利なツールがありますよ

    シリアルモニタで検索すると沢山出てきますが、お勧めは↓

    www.vector.co.jp/.../se449799.html

    これの良い点はボーレートやパリティ、ストップビット設定がリアルタイムで変更出来る事

    ボーレートが妖しいと思ってもテラタームはすぐには変わってくれない

    なので、上記ソフトはかなり便利

    ボーレートを2400bpsからしらみつぶしに順に上げて行くだけで簡単に合わせれます

    ボーレートさえ合わせれば、パリティやストップビットを順に替えていくだけ

    自作プログラムでボーレートやその他パラメータが違っていたとしても

    間違った原因を追究するよりも

    現状のボーレートやその他パラメータがどうなってるのか?を確認するのがてっとり早い

    9600bpsにしたつもりであっても実際は19.2kかも知れない

  • ハードウエアは出来合いのものを使っているのですか?私の場合は意外にSCIの配線ミスが多いです。また、USB-RS232C変換ケーブル(bluetooth無線通信モジュール=ドングル?)を使用と思いますが、メスのクロスにジェンダ変換とかじゃないですよね?弊社のある部署はこれでやっていて混乱することがあります。オシロスコープがあればボーレートも含めてチェックしてみることをお勧めします。

    まずは、有線でやってみるのが良いかも?

  • lumiheart さん  ありがとうございます。。。

    シリアルデバッグツール。。。拙作ご利用いただいておるようでありがとさんです。

    このツール、つくったのが古くて、Windows7の64bit版移行だとそのままでは

    COMが選択リストにはいらないので、互換性オプションでVistaとかそのあたりに

    設定してもらうようにしてるんですがね。

    そろそろちゃんとCSでつくりなおそう、とかおもっているんですが。。。。

    関係ないけど、ちょっとうれしくなってかきこんじゃいました(笑