RX231 CAN通信が開始できない

RX231にてCAN通信を学習しようと試みています。

初期化+送信の手順を実行中です。
CTXD0端子から信号が出ません。
オシロスコープで確認しても信号が確認できません。
問題点等ご教授いただけないでしょうか。
よろしくお願いいたします。

マイコン:RX231 R5F52318ADFP
開発環境:CS+、スマートコンフィグレータ
エミュレータ:E1

---------------------------------------------------------------------------------------------------------------------
#include <machine.h>
#include <r_rscan_rx_private.h>
#include <r_rscan_rx_if.h>
#include <r_rscan_rx_config_reference.h>
void main(void);
static void _initCAN(void);


void main(void)
{
_initCAN();

while(1){
RSCAN0.TMSTS0.BIT.TMTRF = 0; //送信結果フラグクリア
while((RSCAN0.TMSTS0.BYTE & 0x06)!=0){} //確認
RSCAN.GRWCR.BIT.RPAGE=1; //書き込み開始
RSCAN0.TMIDH0.WORD = 0x0000; //標準ID、データフレーム、 送信履歴をバッファしない
// IDセット
RSCAN0.TMIDL0.BIT.TMID = 0x0123; //送信IDバッファ0にIDをSET!
// データ長セット
RSCAN0.TMPTR0.BIT.TMDLC = 8; //送信DLCバッファ0にDLCをSET!
// データセット
RSCAN0.TMDF00.BIT.TMDB0 =0xFF; //受信DATA0を送信
RSCAN0.TMDF00.BIT.TMDB1 =0x00; //受信DATA1を送信
RSCAN0.TMDF10.BIT.TMDB2 =0x00; //受信DATA2を送信
RSCAN0.TMDF10.BIT.TMDB3 =0x00; //受信DATA3を送信
RSCAN0.TMDF20.BIT.TMDB4 =0x00; //受信DATA4を送信
RSCAN0.TMDF20.BIT.TMDB5 =0x00; //受信DATA5を送信
RSCAN0.TMDF30.BIT.TMDB6 =0x00; //受信DATA6を送信
RSCAN0.TMDF30.BIT.TMDB7 =0x00; //受信DATA7を送信
RSCAN.GRWCR.BIT.RPAGE=0; //書き込み終了
RSCAN0.TMC0.BIT.TMTR = 1; //送信要求 TMTRを"1"に
}
}

static void _initCAN(void){


PORT1.PODR.BIT.B5 = 1;
PORT1.PODR.BIT.B4 = 0;
MPC.P14PFS.BYTE = 0x10; // 端子機能選択 P14 CTXD0
MPC.P15PFS.BYTE = 0x10; // 端子機能選択P15 CRXD0
PORT1.PDR.BIT.B4 = 1; // TX端子の方向を出力に設定
PORT1.DSCR.BIT.B4 = 1; // High出力
PORT1.PDR.BIT.B5 = 0; // RX端子の方向を入力に設定(デフォルト)
PORT1.PMR.BIT.B4 = 1; // TX端子のモードを周辺機能に設定
PORT1.PMR.BIT.B5 = 1; // RX端子のモードを周辺機能に設定

MPC.PWPR.BIT.PFSWE = 0;
MPC.PWPR.BIT.B0WI = 1;

//ここから初期設定
while(RSCAN.GSTS.BIT.GRAMINIT != 0){
nop();
}

RSCAN.GCTRL.BIT.GSLPR = 0;
RSCAN.GCTRL.BIT.GMDC = 1; //グローバルリセットモードに設定
while(RSCAN.GSTS.BIT.GSLPSTS != 0){}

RSCAN0.CTRL.BIT.CSLPR = 0;
RSCAN0.CTRL.BIT.CHMDC = 1; //チャネルリセットモードに設定
while(RSCAN0.STSL.BIT.CSLPSTS != 0){}


RSCAN.GCFGL.BIT.DCS = 1; //クロックソースをCANMCLKに設定
RSCAN0.CFGH.BIT.TSEG1 = 0x0014; //ビットタイミングの設定 TSEG1,TSEG2,SJW =5,2,1
RSCAN0.CFGL.WORD = 0x0002; //通信速度の設定 500kbps

RSCAN.GCTRL.BIT.GMDC = 0; //グローバル動作モードに設定/
while(RSCAN.GSTS.BIT.GRSTSTS != 0){}
RSCAN.RFCC0.BIT.RFE = 1; //FIFOバッファ使用許可

RSCAN0.CTRL.BIT.CHMDC = 0; //チャネルリセットモードに設定
while(RSCAN0.STSL.BIT.CRSTSTS != 0){}

nop();

}

  • kaiさん、こんにちは。NoMaYと申します。

    すみません、ちょっと状況に関して分からないことがあるのですが、FITのRSCANモジュールを組み込んでいるにも関わらず、どういう経緯で手書きのベタ書きのソースなのですか?

    アプリケーションノート RXファミリ RSCANモジュール Firmware Integration Technology
    www.renesas.com/jp/ja/document/apn/rx-family-rscan-module-using-firmware-integration-technology

    要旨
    本アプリケーションノートはFirmware Integration Technology (FIT)を使ったRSCAN モジュールについて説明します。メールボックス(保持可能なメッセージ数は1)、FIFO(保持可能なメッセージ数は4)、またはこれらを組み合わせてメッセージを転送できます。
    以降、本モジュールをRSCAN FIT モジュールと称します。
    注: E1 エミュレータを使用してアプリケーションを開発する場合で、E1 エミュレータからボードに電源を供給する場合は、デバッグ構成で示される3.3V ではなく5.0V を供給してください。5.0V が供給されない場合はRSCAN が正しく動作しません。

    対象デバイス
    • RX230 グループ、RX231 グループ
    • RX23E-A グループ
    • RX23W グループ
    • RX24T グループ
    • RX24U グループ
    本アプリケーションノートを他のマイコンへ適用する場合、そのマイコンの仕様にあわせて変更し、十分評価してください。

    ターゲットコンパイラ
    • ルネサスエレクトロニクス製C/C++ Compiler Package for RX Family
    • GCC for Renesas RX
    • IAR C/C++ Compiler for Renesas RX
    各コンパイラの動作確認環境に関する詳細な内容は、セクション「6.1 動作確認環境」を参照してください。


    [メモ]

    アプリケーションノート RXファミリ CAN API Firmware Integration Technology
    www.renesas.com/jp/ja/document/apn/rx-family-can-api-using-firmware-integration-technology

    要旨
    Renesas CAN API (Application Programming Interface)を使って、CAN バス上のデータを送信、受信、監視できます。本ドキュメントでは、CAN API の使用方法とCAN モジュールのいくつかの機能について説明します。
    本アプリケーションノートではCAN API のソースコードファイルが提供されます。API を使ったデモのソースコードも提供され、can_api_demo.c、およびswitches.c に記載されています。

    対象デバイス
    • RX64M グループ
    • RX71M グループ
    • RX65N グループ、RX651 グループ
    • RX66T グループ
    • RX66N グループ
    • RX72T グループ
    • RX72M グループ
    • RX72N グループ
    本アプリケーションノートを他のマイコンへ適用する場合、そのマイコンの仕様に合わせて変更し、十分評価してください。

    ターゲットコンパイラ
    • ルネサスエレクトロニクス製C/C++ Compiler Package for RX Family
    • GCC for Renesas RX
    • IAR C/C++ Compiler for Renesas RX
    各コンパイラの動作確認環境に関する詳細な内容は、セクション「10.1 動作確認環境」を参照してください。


  • 迅速なご対応ありがとうございます。
    ベタ書きの理由はRSCANモジュールを使用した際、動作しなかったためです。
    アプリケーションノートのexampleを参考に記載しました。
    ベタ書きの時と同様に、CTXD0端子から信号が出ません。


    --------------------------------------------------------------------------------------------------
    #include <machine.h>
    #include "r_rscan_rx_if.h"

    void main(void)
    {
    //R_CAN_OPENを呼び出す前の初期化設定
    R_BSP_RegisterProtectDisable(BSP_REG_PROTECT_MPC);
    PORT1.PODR.BIT.B5 = 1;
    PORT1.PODR.BIT.B4 = 0;
    MPC.P14PFS.BYTE = 0x10; // 端子機能選択 P14 CTXD0
    MPC.P15PFS.BYTE = 0x10; // 端子機能選択 P15 CRXD0
    PORT1.PDR.BIT.B4 = 1; // TX端子の方向を出力に設定
    PORT1.DSCR.BIT.B4 = 1; // High出力
    PORT1.PDR.BIT.B5 = 0; // RX端子の方向を入力に設定(デフォルト)
    PORT1.PMR.BIT.B4 = 1; // TX端子のモードを周辺機能に設定
    PORT1.PMR.BIT.B5 = 1; // RX端子のモードを周辺機能に設定
    R_BSP_RegisterProtectEnable(BSP_REG_PROTECT_MPC);
    //R_CAN_OPEN
    /* r_rscan_rx_config.h でメインコールバックの割り込み要因をすべて“0”に設定 */
    can_cfg_t config;
    can_err_t err;

    /* タイムスタンプおよび Open 関数関連の設定 */
    config.timestamp_src = CAN_TIMESTAMP_SRC_HALF_PCLK;
    config.timestamp_div = CAN_TIMESTAMP_DIV_1024;
    err = R_CAN_Open(&config, NULL);

    //R_CAN_InitChan
    /* r_rscan_rx_config.hでチャネル割り込み要因をすべて“0”に設定*/
    can_bitrate_t baud;
    // can_err_t err;
    /* チャネル0の初期設定 (RSKRX231) */
    baud.prescaler = CAN_RSK_8MHZ_XTAL_500KBPS_PRESCALER;
    baud.tseg1 = CAN_RSK_8MHZ_XTAL_500KBPS_TSEG1;
    baud.tseg2 = CAN_RSK_8MHZ_XTAL_500KBPS_TSEG2;
    baud.sjw = CAN_RSK_8MHZ_XTAL_500KBPS_SJW;
    err = R_CAN_InitChan(CAN_CH0, &baud, NULL);

    while(1){
    //R_CAN_SendMsg()
    can_txmsg_t txmsg;
    can_err_t err;
    /* メッセージの設定 */
    txmsg.ide = 0; // IDフィールドは11ビット
    txmsg.rtr = 0; // ローカルメッセージ
    txmsg.id = 0x022; // 通信先ID
    txmsg.dlc = 5; // データ長
    txmsg.data[0] =1; //データ…
    txmsg.data[1] =0;
    txmsg.data[2] =1;
    txmsg.data[3] =1;
    txmsg.data[4] =0;
    txmsg.one_shot = false; // エラー時、通常のリトライを実施
    txmsg.log_history = false; // 履歴FIFOのログを取らない
    txmsg.label = 0; // (メッセージのログを取らないのでラベルは無視)
    /*
    * 送信メールボックス2にメッセージを配置
    * 送信完了割り込みが許可されていない場合、メッセージ送信後に関数は復帰する
    * (ここではエラーは発生しない前提)。
    */
    err = R_CAN_SendMsg(CAN_BOX_TXMBX_2, &txmsg);
    }
    }

  • kaiさん、こんにちは。NoMaYです。

    > ベタ書きの理由はRSCANモジュールを使用した際、動作しなかったためです。

    なるほど、そういうことでしたか。(でもまだ、MPC周りが手書きなのは何故なんだろう、というのはありますけれど、これは後で自分でコード生成させたりデモプログラムをダウンロードしたりしてから考えてみます。)

  • こんにちは。NoMaYです。

    すみません、途中経過ですけれども、FITのRSCANモジュールのRX231のデモプログラムがあるようでしたのでダウンロードしてみました。これから中を見てみます。

    以下、デモプログラムをダウンロードした手順のCS+の画面コピーです。(7枚)








     

  • こんにちは。NoMaYです。

    すみません、途中経過その2ですけれども、ダウンロードしたFITのRSCANモジュールのRX231のデモプログラムにはCS+向けプロジェクトファイルが入っていませんでしたのでe2 studioで変換して、CS+でビルドしてみました。変換したプロジェクトファイルは以下に添付しました。これから中を見て差異を追ってみます。

    rscan_demo_rx231_mtpj_20210818.zip

    以下、WindowsエクスプローラとCS+の画面コピーです。



     

  • NoMaYさん
    ご対応感謝いたします。
    RSCANモジュールのRX231のデモプログラムがあったのですね。気が付きませんでした。

    私の方でも一部コードを変更してトライしてみたのですが、CANの受信できません。
    (CANにサンプルコードとは異なるピンを用いているため)

    void can_init_ports(void)
    {

    R_BSP_RegisterProtectDisable(BSP_REG_PROTECT_MPC);

    /* init CAN channel 0 */
    PORT1.PODR.BIT.B5 = 1;
    PORT1.PODR.BIT.B4 = 0;
    MPC.P14PFS.BYTE = 0x10; // Pin Func Select P14 CTXD0
    MPC.P15PFS.BYTE = 0x10; // Pin Func Select P15 CRXD0
    PORT1.PDR.BIT.B4 = 1; // set TX pin direction to output
    PORT1.DSCR.BIT.B4 = 1; // High-drive output
    PORT1.PDR.BIT.B5 = 0; // set RX pin direction to input (dflt)
    PORT1.PMR.BIT.B4 = 1; // set TX pin mode to peripheral
    PORT1.PMR.BIT.B5 = 1; // set RX pin mode to peripheral

    R_BSP_RegisterProtectEnable(BSP_REG_PROTECT_MPC);
    }

  • kaiさん、こんにちは。NoMaYです。

    > 私の方でも一部コードを変更してトライしてみたのですが、CANの受信できません。
    > (CANにサンプルコードとは異なるピンを用いているため)

    すみません、念の為の確認ですが、can_init_ports()以外の部分はデモプログラムと同じですよね?

    あと、デモプログラムをそのまま動かすと言うのは、そちらの基板の都合上、どう頑張ってみても不可能でしょうか??

  • kaiさん、こんにちは。NoMaYです。

    それから、r_rscan_rx_config.hの以下の部分は問題無いですか?

    /*
     * Setting for CAN clock source.
     * 0 = PCLKB/2
     * 1 = CANMCLK = EXTAL pin              // RSKRX231,RSKRX23W
     */
    #define CAN_CFG_CLOCK_SOURCE            (1)

     

  • kaiさん、こんにちは。NoMaYです。

    > can_init_ports()以外の部分はデモプログラムと同じですよね?

    すみません、よく考えたら、この問いは間違ってますね。BSPの設定は適切に変更されていますか?ですね、、、

  • NoMaYさん。

    >あと、デモプログラムをそのまま動かすと言うのは、そちらの基板の都合上、どう頑張ってみても不可能でしょうか??
    基板の構成上、かなり厳しいです。できれば今の構成で進めたいと思っています。

    >それから、r_rscan_rx_config.hの以下の部分は問題無いですか?
    問題ありません。CANMCLKが選択されています。

    >BSPの設定は適切に変更されていますか?
    BSPの設定はスマートコンフィグレータから設定しました。VCCを3.3→5.0Vに変更しています。