Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

RX63NでのSCI通信に関して

RX63Nを用いたSCI通信を行おうとテストプログラムを作成したのですがSCI0のTX端子からの信号が出ない状況です.

https://japan.renesasrulz.com/cafe_rene/f/forum5/836/rx63n

上記の質問と症状が同じだったため参考にしましたがうまくいっていない状態です.

下記の設定や送信部の間違いを指摘していただきたいと思います.

また,現在SCIの出力の確認にオシロスコープを用いてデバッグを行っている(PC側の受信プログラムに自信がないため)のですが他によい方法があればご教授お願いします.

 

//初期設定

void set_port_SCI(){
SYSTEM.PRCR.WORD = 0xA502; //プロテクト解除(SCIモジュール有効化のため)
SYSTEM.MSTPCRB.BIT.MSTPB31 = 0; //SCI0モジュールストップの解除
SYSTEM.PRCR.WORD = 0xA500; //プロテクト

SCI0.SCR.BYTE =0x00; //初期化
PORT2.PMR.BIT.B0 = 0; //P20を汎用I/Oへ
PORT2.PMR.BIT.B1 = 0; //P21を汎用I/Oへ
//マルチピンファンクションでpin設定
MPC.PWPR.BIT.B0WI = 0; //PFS(PFSWE)書き込みを許可
MPC.PWPR.BIT.PFSWE = 1; //PFSレジスタへの書き込みを許可
MPC.P20PFS.BIT.PSEL = 0x0A; //P20 TXD set
MPC.P21PFS.BIT.PSEL = 0x0A; //P21 RXD set
MPC.PWPR.BIT.PFSWE = 0;
MPC.PWPR.BIT.B0WI = 1;
//歩調同期SCI
SCI0.SMR.BIT.CKS = 0; //PCLKクロック, PCLKB/1 = 48MHz
SCI0.SMR.BIT.STOP = 0; //STOPBIT 1ストップビット
SCI0.SMR.BIT.PM = 0; //パリティモード
SCI0.SMR.BIT.PE = 0; //パリティなし
SCI0.SMR.BIT.CHR = 0; //データ長 8bit
SCI0.SMR.BIT.CM = 0; //歩調同期式モード
//ビットレート設定
SCI0.BRR = 38; //ビットレート 38400?

SCI0.SCR.BIT.RIE = 1;
SCI0.SCR.BIT.TIE = 1;
SCI0.SCR.BIT.RE = 1; //受信許可
SCI0.SCR.BIT.TE =1; //送信許可
return 0;
}

 

//メイン関数

void main(void)
{
unsigned int i = 0 , j;
unsigned char str;
unsigned char trans_data[] = "This is data to be transfered.\n";

//データ送信例
while(i<10){
while(SCI0.SSR.BIT.TEND == 0);
SCI0.TDR = 0xf0;
i += 1;
for(j=0; j<100; j+=1);
}
return 0;
}

  • fizzさん
    SYSTEM.PRCR.WORD = 0xA502; //プロテクト解除(SCIモジュール有効化のため)
    SYSTEM.MSTPCRB.BIT.MSTPB31 = 0; //SCI0モジュールストップの解除
    SYSTEM.PRCR.WORD = 0xA500; //プロテクト
    ですが私のは
    SYSTEM.PRCR.WORD=0xA50B; //プロテクトOFF
    SYSTEM.MSTPCRA.BIT.ACSE=0;
    MSTP(SCI2)=0; //これここでないとダメ
    SYSTEM.PRCR.WORD=0xA500; //プロテクトON
    こうなっていました、これが原因ではありませんか。
  • おはようございます。NAKAといいます。

    初期の設定は大丈夫なような気がします。
    やや不思議なのは、割込みを使ってなさそうなのに
    SCI0.SCR.BIT.RIE = 1;
    SCI0.SCR.BIT.TIE = 1;
    があったり、
    voidの関数なのに
    return 0;
    があることでしょうか?

    どんな感じで動作確認されているのか?がちょっとわかりづらいです。
    例えば初期設定set_port_SCI()はどこでやられているのか?
    当たり前すぎたらごめんなさい。

    とりあえずはこんな感じ?

    void main(void)
    {
     unsigned long i;
     unsigned char j;

     set_port_SCI();           //初期設定

     while(1)
      {
        for(i=0;i<0xFFFFFFFF;i++)  //適当な待ち時間
        {
         nop();
        }
         SCI0.TDR = j;        //カウンター値を送信
        j++;             //カウンターインクリメント
      }
    }

    とすれば、適当な待ち時間毎にカウンター値を送信しそうですけど。

  • In reply to IKUZO:

    IKUZOさん
    返信ありがとうございます.

    ご指摘いただいた方法をこれから試そうと思います.
    重ねての質問になってしまうのですが,SCI通信では待機状態でhigh状態になると思うのですがその時の電圧を教えていただけると幸いです.
  • In reply to NAKA:

    NAKAさん
    返信ありがとうございます.

    割り込みの設定があるのはエコーバックによりPC側のプログラムのデバッグを行うために設定しています.void関数内に戻り値があるのはミスなので削除しました.

    set_port_SCIはhwsetup.c内で呼び出しておりこの関数を通っていることはLEDを使用して確認しています.
    ご指摘いただいた内容でも出力が見られなかったのでもう一度マニュアルを読み直したいと思います.

    TX端子からの(high)出力電圧は3.3V程度と認識しており,オシロスコープで端子の電圧を監視し同程度の電圧が出力されているかどうかを確認することでデバッグを行っています.
  • In reply to fizz:

    fizzさん NAKAです。

    不思議ですね?
    63NなのでGR-SAKURA(ピンク色の基板)と同じですよね!
    NAKAと全く同じ設定だと思うのですが、ちゃんと通信できてますよ!
    まさかですがオシロスコープで当たっているピンが違うとか?
    となりのピンとショートさせちゃってハードが損傷しているとか?

    設定をもし参考になれば比べてみてください。

    /*******************************************************************************
    // 関数名 : fn_Init_SCI0(void)
    // 動作 : SCI0の初期化
    // 引数 :
    // 作成 : NAKA 12.02.09
    // ****************************************************************************/
    void fn_Init_SCI0(void)
    {
    SYSTEM.PRCR.WORD = 0xA502; //WORDで変更しないとNG! MSTPCRAはプロテクト1
    SYSTEM.MSTPCRB.BIT.MSTPB31 = 0; //SCI0モジュールストップを0:解除 P255

    SCI0.SCR.BYTE = 0x00; //SCR CLEAR!

    PORT2.PMR.BIT.B0 = 0; //P20を汎用I/O機能にset
    PORT2.PMR.BIT.B1 = 0; //P21を汎用I/O機能にset

    //マルチピンファンクションでpin設定
    MPC.PWPR.BIT.B0WI = 0; //PFSWE書込み 0:許可
    MPC.PWPR.BIT.PFSWE = 1; //PFS書込み 1:許可

    MPC.P20PFS.BIT.PSEL = 0x0A; //P20⇒TXD0 set!
    MPC.P21PFS.BIT.PSEL = 0x0A; //P21⇒RXD0 set!

    MPC.PWPR.BIT.PFSWE = 0; //PFS書込み 0:禁止
    MPC.PWPR.BIT.B0WI = 1; //PFSWE書込み 1:禁止

    PORT2.PMR.BIT.B0 = 1; //P20を周辺機能にset
    PORT2.PMR.BIT.B1 = 1; //P21を周辺機能にset

    //調歩同期SCI
    SCI0.SMR.BIT.CKS = 0; //CLOCK 0:PLCKB/1 = 48MHz
    SCI0.SMR.BIT.STOP = 0; //STOPBIT 0:1STOP
    SCI0.SMR.BIT.PM = 0; //パリティモードBIT 0:偶数
    SCI0.SMR.BIT.PE = 0; //パリティイネーブル゙BIT 0:NON
    SCI0.SMR.BIT.CHR = 0; //LENBIT 0:8bit
    SCI0.SMR.BIT.CM = 0; //モードBIT 0:調歩同期

    //ビットレート設定
    SCI0.BRR = 38; //ビットレート 155:9600(0.16%) 77:19200(-2.34%) 47:31250(0%) 38:38400(-2.34%) 12:115200

    ICU.IPR[214].BIT.IPR = 5; //SCI0割込みプライオリティ 0:禁止 ~ 15:最高
    ICU.IER[0x1A].BIT.IEN6 = 1; //RX割り込み要求許可 IER_1A_IEN6 P361
    ICU.IER[0x1A].BIT.IEN7 = 1; //TX割り込み要求許可 IER_1A_IEN7 P361

    SCI0.SCR.BIT.RIE = 1; //受信割込み 1:許可
    SCI0.SCR.BIT.TIE = 1; //送信割込み 1:許可
    SCI0.SCR.BIT.RE = 1; //受信動作 1:許可
    SCI0.SCR.BIT.TE = 1; //送信動作 1:許可

    //エラー割込み準備
    ICU.GEN[12].BIT.EN0 = 1; //グループ12_EN0(SCI0_ER_INT)割込み許可

    SYSTEM.PRCR.WORD = 0xA500; //プロテクト書き換え禁止  WORDで変更しないとNG!

    SCI0_Tx_WP =0; //ポインタ CLEAR
    SCI0_Tx_RP =0;
    SCI0_Rx_WP =0;
    SCI0_Rx_RP =0;

    }
  • In reply to fizz:

    fizzさん
    YRDKRX63NのRS232Cポートですがオープン状態で
    2番端子RXDが-6.47Vで
    3番端子TXDが0.002Vでした。

  • 自分が以前に作ったプログラムを参考にして下さい。
     幾つか要点が有ります。
     SHとRXのレジスタ名やビット名は同じですが、内容が違う。
     間に合わせで作ったようなレジスタです。
     SHのプログラムを流用できない。
     割り込み制御のフラグを設けている意味が無い。
     割り込み制御のフラグは割り込み状態にして、割り込み制御は割り込みコントラーラで行う。
     SCRレジスタのフラグで制御しようとしても駄目
     割り込みを使わなくても、SCIの設定は割り込みにする。


    SCIn->SCR.BYTE = 0x00 ; // SCR.TIE, RIE, TE, RE, TEIEビットを“0”にする
    // RXD の PORTn.ICR.Bjビットを“1”にする。これは
    // この関数を呼び出した側で処理する。
    /*
    リセット後:0x00
    7:TIE 0:送信割り込み禁止 1:送信割り込み許可
    6:RIE 0:受信割り込み禁止 1:受信割り込み許可
    5:TE 0:送信禁止 1:送信許可
    4:RE 0:受信禁止 1:受信許可
    3:MPIE 0:通常の受信動作 1:マルチプロセッサ割り込み許可
    2:TEIE 0:送信完了割り込み禁止 1:送信完了割り込み許可
    1~0:CKE 00:内臓クロック 01:内臓クロック、ポートからクロック出力
    10:外部クロック 11:外部クロック
    CKEは、マニュアル参考
    */

    SCIn->SMR.BYTE = 0x00 ; // 28.2.1.5 シリアルモードレジスタ(SMR)
    /*
    リセット後:0x00
    7:CM 0:調歩同期式モード 1:クロック同期式モード
    6:CHR 0:8ビットデータ 1:7ビットデータ
    5:PE 0:パリティ無し 1:パリティ有り
    4:OE 0:偶数パリティ 1:奇数パリティ
    3:STOP 0:1ストップビット 1:2ストップビット
    2:MP 0:マルチプロセッサ機能の禁止 1:許可
    1~0:CKS 00:PCLKクロック 01:PCLK/4 10:PCLK/16 11:PCLK/64
    */

    SCIn->SCMR.BYTE = 0xF2 ; // 28.2.1.8 スマートカードモードレジスタ(SCMR)
    // リセット後:0xF2
    // マニュアルには、「SCMRレジスタには初期値を設定」となっている

    SCIn->BRR = BRR ; // 28.2.1.9 ビットレートレジスタ(BRR)
    /*
    ●BRR の求め方

    PCLK x 10^6 48000000
    N = ----------------- - 1 = ---------- - 1 = 39.0625 - 1 = 38 = 0x26
    64 x 2^(2n-1) x B 32 x 38400

    PCLK = 48 [MHz] 12[MHz] * 4逓倍  PCLKは、8~50MHz と言う制約がある
    B = 38400[bps] ビット・レイト
    n = 0

    [(48000000/32)/ 9600] - 1 = (1500000/ 9600) -1 = 155 = 0x9B
    [(48000000/32)/ 19200] - 1 = (1500000/ 19200) -1 = 77 = 0x4D
    [(48000000/32)/ 38400] - 1 = (1500000/ 38400) -1 = 38 = 0x26
    [(48000000/32)/ 76800] - 1 = (1500000/ 76800) -1 = 19 = 0x13
    [(48000000/32)/115200] - 1 = (1500000/115200) -1 = 12 = 0x0C
    */

    Counter = 65000 ; // 0.04us * 65000 = 2600us = 2.6ms
    do{} while(--Counter) ; // 少なくとも1ビット期間待つ

    SCIn->SCR.BYTE = 0xF4 ; // 28.2.1.6 シリアルコントロールレジスタ(SCR)
    // 【重要】RX62N では、TE と RE を1ビットづつ
    // 1にして、両方を1にする事は出来ない
    // 両ビットを1にするには、両ビットを0にしてからバイトで書き込む
    /*
    リセット後:0x00 RXではSHと様子が違う
    RXでは以下の割り込みを許可しただけでは、割り込みを発生しない。
    許可すると、IR16~IR253 の「割り込み要求レジスタ」に反映される。
    「割り込み要求プライオリティ」と「割り込み要求許可」が揃って、割り込みを発生する。
    シリアルステータスレジスタ(SSR)の代わりに「割り込み要求レジスタ」を使う。

    7:TIE 1:送信データ・エンプティ割り込み許可
    6:RIE 1:受信割り込み許可
    5:TE 1:送信許可
    4:RE 1:受信許可
    3:MPIE 0:マルチプロセッサ割り込み禁止
    2:TEIE 1:送信終了割り込み許可
    1-0:CKE 00:内部クロック。SCK端子は入出力ポート
    */

    // 28.2.1.7 シリアルステータスレジスタ(SSR)をクリア
    BRR = SCIn->SSR.BYTE ; // エラーフラグを0にするには、書き込む前に読み込む必要がある。
    // 読むのはダミーで、データは使わない。
    SCIn->SSR.BYTE = 0x80 ; // フラグをリセット。bit7:TDRE に0を書き
    // 込むと送信してしまうので、1にする。
    // bit2:TEND は読み込み専用なので、1を書く必要は無い
  • PMRでの端子機能が汎用入出力ポートのままになっています

    MPCでの端子機能設定後に、下記の処理が必要です

      PORT2.PMR.BIT.B0 = 1;  //P20周辺機能として使用

      PORT2.PMR.BIT.B1 = 1;  //P21周辺機能として使用

     

    TXD端子からの出力は SCR.TE = 1 ライト時にH出力に切り替わります

     

    デバッグ方法については、出力端子の波形を見るのが一番だと思います。

    その上で、私はこの質問のように動いているのかどうかが分からない状態ではデバッガでレジスタを書き換えて確認しています。

    送信なら、デバッガでTDRに書けばデータが送信されます。

  • In reply to windypon:

    windypyさん
    返信ありがとうございます

    I/O設定を周辺機器に設定していないのが原因でした.
    次回からはご指摘いただいたデバッグ方法を使用しようと思います.

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page