RL78 CSI について

RL78/G13を使用しています。

CSIで別のデバイスと通信したいのですが、シミュレータで出力波形を見るとクロックは出力されるのにデータが出力されません。

CSIを使用する上でアドバイスを頂けないでしょうか。

CSIは、SAU0のCSI11を使用し、シングル転送モード、連続転送モード、どちらでも同じです。

また、関係あるかどうかわからないのですが、SAU0のUART0も有効にしてコード生成しています。

コード生成されたデータは、r_cg_serial_userの割り込み処理の最後にF_SPI_comフラグのクリアを追加しています。

サブルーチンコールは以下のように行っています。

   if ((SSR11 & 0x0040 ) == 0) {
        P14_bit.no0 = 0;
        g_tx_data[0] = 0x31;
        g_tx_data[1] = 0x00;
        data_length = 1;
        F_SPI_com = 1;
        result = R_CSI11_Send_Receive(&g_tx_data[0], data_length, &g_rx_data[0]);
        
        while (1U)
        {
            if ( F_SPI_com == 0 )
                break;
        }

よろしくお願いします。

Parents
  • チョコさま、ご回答ありがとうございます。
    ソースを確認しましたが、CSIを制御するレジスタを直接いじっているところはありません。(と思っています。)
    コード生成で生成されたコードは、前述の通りr_cg_serial_userの割り込み処理にフラグ処理を追加した程度で、R_CSI11_Create関数もそのまま使用しています。
    I/Oポートも、P3およびP5も定義されているようです。
    void R_CSI11_Create(void)
    {
    ST0 |= _0008_SAU_CH3_STOP_TRG_ON; /* disable CSI11 */
    CSIMK11 = 1U; /* disable INTCSI11 interrupt */
    CSIIF11 = 0U; /* clear INTCSI11 interrupt flag */
    /* Set INTCSI11 low priority */
    CSIPR111 = 1U;
    CSIPR011 = 1U;
    SIR03 = _0004_SAU_SIRMN_FECTMN | _0002_SAU_SIRMN_PECTMN | _0001_SAU_SIRMN_OVCTMN; /* clear error flag */
    SMR03 = _0020_SAU_SMRMN_INITIALVALUE | _0000_SAU_CLOCK_SELECT_CK00 | _0000_SAU_CLOCK_MODE_CKS |
    _0000_SAU_TRIGGER_SOFTWARE | _0000_SAU_MODE_CSI | _0000_SAU_TRANSFER_END;
    SCR03 = _C000_SAU_RECEPTION_TRANSMISSION | _0000_SAU_TIMING_1 | _0000_SAU_MSB | _0007_SAU_LENGTH_8;
    SDR03 = _CE00_CSI11_DIVISOR;
    SO0 |= _0800_SAU_CH3_CLOCK_OUTPUT_1; /* CSI11 clock initial level */
    SO0 &= ~_0008_SAU_CH3_DATA_OUTPUT_1; /* CSI11 SO initial level */
    SOE0 |= _0008_SAU_CH3_OUTPUT_ENABLE; /* enable CSI11 output */
    /* Set SI11 pin */
    PM5 |= 0x01U;
    /* Set SO11 pin */
    P5 |= 0x02U;
    PM5 &= 0xFDU;
    /* Set SCK11 pin */
    P3 |= 0x01U;
    PM3 &= 0xFEU;
    }

    呼び出す前のif分は、SSR11のエラーチェックをしているだけなので、レジスタはいじっていません。
    すみませんが、ほかに確認する点はございませんでしょうか。
    よろしくお願いします。
  • チョコです。

    CS+CC-RLの環境でRL78/G13の64pin版で確認してみましたが,ちゃんとSO11にも波形が出ています。

    参考で,画面キャプチャしてPDFを作成したので添付しておきます。

    コード生成でCSI11マスタ送受信.pdf

  • チョコです。
    >残った疑問は、途中で端子機能を変えるとCSI信号が出ないということですが。
    以前にも書きましたように,SO11端子の兼用ポートは出力ラッチ1で出力に設定
    しておかないといけません。
    入力状態PMxx=1の状態で他のビットの操作をやってはいないでしょうか。
    ここらはハードウェア マニュアルの「4. 6 ポート機能使用時の注意事項」を参照
    してください。
  • KDX200です。
    うーん、プログラム中では、このSI11とSO11端子(を含むポート)はr_cg_port.cの中で、
    PM5 = _01_PMn0_NOT_USE | _02_PMn1_NOT_USE | _04_PMn2_MODE_INPUT | _08_PMn3_MODE_INPUT | _10_PMn4_MODE_INPUT |
    _20_PMn5_MODE_INPUT | _C0_PM5_DEFAULT;
    と、r_cg_aerial.cの中で、
    P5 |= 0x02U;
    これらは、コード生成で出力されらものです。
    それ以外のルーチンでは、
    key_inside = (P5 & 0xF8);
    inkey = (P5 & 0xF8);
    といった入力だけなんですけどねえ。
    この& 0xF8というビットマスクして取り込むことが問題なのでしょうかねえ。
  • チョコです。
    初期設定では,その後にr_cg_serial.cの中のR_CSI11_Createの設定の最後で
    /* Set SO11 pin */
    P5 |= 0x02U;
    PM5 &= 0xFDU;
    とやっているので,P51は1出力に設定されるのですが。
    レジスタの内容を確認してください。
  • チョコです。
    >この& 0xF8というビットマスクして取り込むことが問題なのでしょうかねえ。
    それは考えられません。シミュレータで展開されたコードを眺めても,AND A,P5となっているようなので,
    P5は読み出ししかしていません。
  • KDX200です。
    レジスタを確認しましたが、P5は0x02で、PM5は0xfdです。
    通信の途中でブレイクして値を確認しましたが、途中で変化しませんでした。
    プロジェクトの作成方法で、入力ポートにしていた端子をCSI用に変更したからなのでしょうかねえ。
    CSIを最初から定義した新しいプロジェクトでは問題ありません。(実機上でSPIデバイスとも通信できました。)
  • チョコです。
    >P5は0x02で、PM5は0xfdです。
    その値はSO11としては問題ないですね。
    そうなると,シリル出力許可レジスタ(SOE0レジスタ)のSOE03ビットが1になっていますか。
    どちらにしても,関係するレジスタの値を全て確認する必要があります。最終的な設定が
    正しければ,どんな順番で設定してもSO11からは何か出せるはずです。
  • KDX200です。
    >そうなると,シリル出力許可レジスタ(SOE0レジスタ)のSOE03ビットが1になっていますか。
    適当なところで停止させたときの値ですが、SOE03は1でした。
    それ以外の関連するSFRレジスタは、以下の通りです。
    PER0 0x25
    SPS0 0x0004
    SMR0 0x0020
    SCR0 0x0087
    SDR0 0x0000
    SIR0 0x0000
    SSR0 0x0000
    SS0 0x0000
    ST0 0x0000
    SE0 0x0008
    SOE0 0x0008
    SOL0 0x0000
    SO0 0x0f07
    SSC0 0x0000
    ISC 0x00
    PIM5 0x00
    POM5 0x00
    PMC0 0xff
    PM5 0xfd
    P5 0x02
    特に問題はないと思います。
    今更ですが、CS+はV4.01.00[05 Sep 2016]を使用しています。最新だと思います。
  • チョコです。
    SMR0,SCR0,SDR0,SSR0はSMR03,SCR03,SDR03,SSR03の間違いですね。
    気になるのは,SCR03の値が0x0087とあることです。ここは0xC087でないと,
    送信も受信もできません。
    送信したいときに,SCR03のTXE03(ビット15)が1(送信可能状態)になって
    いるかを確認してください。
  • KDX200です。
    >SMR0,SCR0,SDR0,SSR0はSMR03,SCR03,SDR03,SSR03の間違いですね。
    すみません。間違いです。

    SCR03を確認してみました。
    結果、0xc007でした。
    これであれば問題ないはずですが、うまくいきません。
    SMR03,SIR03,SSR03も前回と同じ値です。
    SDR03だけが0xce00となっていますが、これは送信するクロック分周比とデータでしょうから
    問題ないと思います。
    新しく作成したプロジェクトではうまくいってますが、もう少し追ってみます。
    よろしくお願いします。
  • KDX200です。

    いままで新規にプロジェクトを起こして作業していましたが、気になったことがありupします。

    CS+の初期の端子割り当てが添付のようにないっていました。

    注意書きで、最初に設定したらできないと表示されていますが、あまり気にせずにいました。

    添付画面のように、SCIで使用するポート、P30,P50,P51の端子割り当てがありません。

    もしかして、これが原因でしょうか。

    だとしたら、お騒がせして申し訳ございませんでした。

    でも、なぜ変更できないのでしょうか?

Reply
  • KDX200です。

    いままで新規にプロジェクトを起こして作業していましたが、気になったことがありupします。

    CS+の初期の端子割り当てが添付のようにないっていました。

    注意書きで、最初に設定したらできないと表示されていますが、あまり気にせずにいました。

    添付画面のように、SCIで使用するポート、P30,P50,P51の端子割り当てがありません。

    もしかして、これが原因でしょうか。

    だとしたら、お騒がせして申し訳ございませんでした。

    でも、なぜ変更できないのでしょうか?

Children
  • チョコです。
    >でも、なぜ変更できないのでしょうか?
    この設定は,ハードウェア(外部端子)の直接的な変更に繋がります。通常のシステムで,端子の変更を頻繁に行うことはプログラムと言うかシステムの管理上でトラブルが発生する可能性が高くなり好ましくありません。
    デバイスとしては,単純に「周辺I/Oリダイレクション・レジスタ(PIOR)」を変更すれば簡単に変わりますが,それにソフトウェアや接続されている外部が対応できるかは疑問です。
    そのために,コード生成ではハードウェア構成をこていしてしまっていると考えられます。
    プログラマブルな機能は頻繁に機能を切り替えてつかうものではなく,目的にあわせて設定し,その後は固定しておくのだと思っています。
  • チョコです。
    RL78/G13のマニュアルをチェックしたら,SCK11,SO11,SI11はリダイレクションの対象になっていません。
    従って,そのような機能はこの表には出てきません。
    端子として固定されているので,この表は無関係です。
  • KDX200です。
    チョコさま、ご回答ありがとうございます。
    つまるところ、最初にI/Oを決めなければならないと言うことですね。(SH-2はなかったような?)
    サンデープログラマーなので、思いつくままにやっていました。
    RL78は初めてなので、どう使っていいかもわからず始めてしまいました。
    これからは、仕様を固めて取りかかるようにします。
    ありがとうございました。
  • チョコです。
    最初にハードウェア構成を決めるのは,システムとしての問題であり,デバイスは無関係です。
    端子機能をソフトウェアで変更できても,途中で変えるとトラブルの元になるので,やめた方が
    いいです。
    (昔から,プログラマブルなデバイスの設定を頻繁に変更してトラブルを引き起こす例が多くみられ
    ました。)