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です。ごめんなさい。私がリプライ出来るのはここまでのようです。(ここが限界のようです。) 後は、他の人からのリプライを待って頂けますか?すみません。
kaiさん、こんにちは。NoMaYと申します。すみません、ちょっと状況に関して分からないことがあるのですが、FITのRSCANモジュールを組み込んでいるにも関わらず、どういう経緯で手書きのベタ書きのソースなのですか?アプリケーションノート RXファミリ RSCANモジュール Firmware Integration Technologywww.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 Technologywww.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に変更しています。