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

  • チョコさま、いろいろとありがとうございます。
    ソースを見直しても該当しそうなところが見つかりません。
    もともとSC11端子はデジタル出力、SI11,SO11端子はデジタル入力に設定し、SPI(CSI)は
    別の端子でソフトで実現しようと考えていました。
    マニュアル等をよく読むと、3線式で実現できそうだと考え設定を途中で変えていじっていた
    プログラムです。(3線式はIICのようにSIとSOが同一信号線と思い込んでいました。)
    もしや最初の端子の設定が影響しているのではと思い、新規プロジェクトを作成しました。
    うまく動いていませんが、状況が変わりましたらまたご報告します。
  • チョコです。

    >、SI11,SO11端子はデジタル入力に設定し

    これは明らかな間違いです。

    SI11は入力設定で構いませんが,SO11端子は出力に設定しないといけません。

    参考として,こちらで確認したプロジェクトを添付しておきます。

     

    RL78_CSI_TEST2.zip

  • チョコです。
    追加で説明します。
    SPI(特にマスタ)はCSI+ポート(CS信号出力用)だけで済みます。この場合のSI11信号は
    抵抗でプルアップしておくだけで,基本的にCSIの設定と変わりません。SO11,SCK11は
    共に出力で固定です。
    CSI11で送受信を開始する直前に対象とするスレーブのCS信号をローにします。その後に
    送受信を行い,完了したらCS信号をハイにするだけです。

    SO信号を入力にしておくのはスレーバ側の処理かと思います。(CSで選択されていない時
    には,出力しないようにするため。)
  • チョコさま、サンプルプログラム、ありがとうございます。
    頂いたプロジェクト、および新規に作成したプロジェクトでは、シミュレータで波形を確認できました。
    しかし、最初に作成したプロジェクト(ピン機能を途中でデジタルI/Oから未使用に変更したもの)
    では、うまくいきません。
    これからうまくいったプロジェクトをベースに、他のI/O処理を追加していってみようと思います。
    いろいろとお世話になりました。
    ありがとうございます。

    余談ですが、RL78のCSI(SPI)通信では、送信と同時に受信していますが、一般的なSPIデバイス
    はそうなのでしょうか。
    通信ですから、コマンドを送信した後で返信がくる(受信する)と思うのですが。
    今回接続を試みているのは加速度センサで、コマンドを送ってから返信を受信するものです。
  • チョコです。
    >余談ですが、RL78のCSI(SPI)通信では、送信と同時に受信していますが、一般的なSPIデバイス
    はそうなのでしょうか。
    双方向通信を行う場合には,インタフェースとしては送受信を同時に行う(全二重と呼んでいます)方が
    簡単ではないかと思います。
    ただし,インタフェースとしては全二重でも,上位のプロトコル(加速度センサ等の手順)に従って,
    コマンド等の送信時に受信したデータは無視し,データを受信する時にはダミーデータを送信する
    などで対応します。同時に送受信できるからと言って,送受信データを全て使用する必要はありま
    せん。
    全二重で使いたくない時には,送信と受信を適当に切り替えることで対応できますが,CSIの設定を
    切り替えるのは面倒ではないかと思います。
  • KDX200です。
    チョコさま、確かに送信と受信でCSI設定を切り替えるのは面倒ですね。
    とりあえず必要なバイト数だけ送受信して、必要なものだけを取り出せばいいわけですね。
    そういう使い方でいこうと思います。
    ありがとうございました。
    残った疑問は、途中で端子機能を変えるとCSI信号が出ないということですが。
  • チョコです。
    >残った疑問は、途中で端子機能を変えると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出力に設定されるのですが。
    レジスタの内容を確認してください。
Reply
  • チョコです。
    初期設定では,その後にr_cg_serial.cの中のR_CSI11_Createの設定の最後で
    /* Set SO11 pin */
    P5 |= 0x02U;
    PM5 &= 0xFDU;
    とやっているので,P51は1出力に設定されるのですが。
    レジスタの内容を確認してください。
Children
  • 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の端子割り当てがありません。

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

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

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

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