Generic Content

かふぇるね“ はルネサス製品に対して自由に会話をするツールとなります。(回答者はルネサス社内外の方たちとなります) その為ルネサス製品やソリューションに対して正式な回答をご希望の場合はMyRenesasのTicketシステムを使用するようにお願いいたします。 

GR-ROSE+e2studio + FIT を使用したUSBサンプルプログラムが動作しない

お世話になっております。マイコン初心者のコミーです。

現在、GR-ROSE と e2studio + FIT を使用しPC(Teraterm)とUSB通信しようとチャレンジしています。

補足:E2Liteエミュレータを接続+GR-ROSEのUSBとPCを接続して使用しています。

手順書「 Renesas e2studio スマート・コンフィグレータ Application Examples:CMT,A/D,SCI,DMA,USB(アプリケーションノート)

R20AN0469JS0120 Rev.1.20

2019.06.20 」

をApplocation Example1~4までは順調に動作させることができましたが、USBのサンプル:Applocation Example5のみ動作させることができません。

*不具合動作1:COMポートは認識はするが(2分ほど)時間がかかる(デバック実行してから)

*不具合動作2:COMポート認識後、Teraterm で接続できるようになり、遅い反応ですが文字は打てます。

        ただし、GR-ROSEからのリアクションは一切なしです。

コードはそのまま(Applocation Example5)のPDFからコピーして使用しました。

変更したのはクロックの設定とデバックの設定だけです。(CTM0とLED点灯用のPORTは(Applocation Example1)にて設定)

原因に心当たりがありましたら、ご教示いただければと思います。

<クロック設定>

SCKCR2にチェック / 48(USBクロックUCLK)になるように設定

<デバック設定>

EXTAL周波数:12 / 動作周波数:120 / 接続タイプ:FINE / エミュレータから電源を供給する:いいえ

下記追加情報です。

<デバイス選択ウィンドウ>

GR-ROSE用ボード定義ファイル(BDF)も使用し選択しました。

  • コミーさん、こんにちは。NoMaYと申します。

    USB CDCは、昔、RX62N(通称CQ基板)とRX631(GR-CITRUS)で試したことがある程度で、GR-ROSEでは試したことが無い(というか、すみません、持っていません)のですが、パソコン(Windowsのバージョン?)によっては、もともと認識されるのに時間が掛かるようなケースがあったような記憶があります。

    また、PCとボードを接続したその瞬間からボードのファームウェアが動作するようになっていないと、Windows側が何かしら異常処理対応をしている気配があったような記憶もあります。(あったような記憶がありますが、記憶が定かではないという自覚もあります。すみません。)

    ● e2 studioでデバッグ中とのことですけれど、RFP(Renesas Flash Programmer)でMOTファイルを書き込んで、ボード単体で試してみても同様の現象になりますでしょうか?

    また、現状はkommyさん側の企業秘密のようなものはソース中には無いかと思うのですが、ドキュメント通りにやれば作れる筈のプロジェクト一式ではあるのでしょうけれども、そちらのプロジェクト一式をzipファイルに固めて(PDFファイルは取り除いておくと良いと思います)添付して投稿すると、どなたかGR-ROSEを持っている方が試してみてくれることもあるように思います。添付して投稿されてみてはどうでしょうか?

    [追記]

    あと、まったくの天下り的なことのなのですが、デバッグ中のプログラムが途中で暴走して、無限ループしていたり、リセットを繰り返していたり、そんなことが起きて、期待したようにTeraTermと通信出来ないという可能性も気になりました。たとえば、スタックサイズが小さいままであるとか(ふと思い浮かんだだけですが)、そんなことが気になりました。

  • コミーさん、こんにちは。NoMaYです。

    GR-ROSEということですので、もしかしたらコンパイラはGNURXでしょうか?(そのことから何かヒントがすぐに思い浮かぶわけでは無いですけれども。)

  • コミーさん、こんにちは。NoMaYです。

    この件は自己解決されたということで良いのでしょうかね?

  • NoMayさんアドバイスありがとうございます。(返信がおそくなりもうしわけありません)まだ解決しておりません・・・

    1)まずはプロジェクトをエクスポートしたZIPファイルを添付します。

    2)>コンパイラはGNURXでしょうか?

    Renesas CCRX v3.04.00 のことでしょうか。

    マイコンにもSNSにも不慣れですが何卒よろしくお願いします。

    GR_ROSE_USB_sample_NG.zip

  • NoMayさんアドバイスありがとうございます。(返信がおそくなりもうしわけありません)まだ解決しておりません・・・

    1)まずはプロジェクトをエクスポートしたZIPファイルを添付します。

    2)>コンパイラはGNURXでしょうか?

    Renesas CCRX v3.04.00 のことでしょうか。

    マイコンにもSNSにも不慣れですが何卒よろしくお願いします。

    GR_ROSE_USB_sample_NG.zip

  • 3)NoMayさんからの確認事項↓を実施してみました。

    >RFP(Renesas Flash Programmer)でMOTファイルを書き込んで、ボード単体で試してみても同様の現象になりますでし>ょうか?

    結論としては通信できませんでした。ただE2Liteでのデバック中の動作ではタイマーによるLED点灯していたのですが、

    USEB通信はもちろん、RFPで書きこむとLEDの点灯すらしなくなりました。状況の報告だけさせていただきます。

  • 追記です。

    デバック中に他事をしていましたら(5分から10分放置)

    ①文字化け

    さらに「放置」

    ②読み取れる文字がでてきました。

    「デバック停止ボタンを押す」と

    ③通常動作で表示される文字が最終列付近にでてきました。

    とりあえず情報をのせます。このことから通信自体は惜しいところまできているような感じがします。

  • コミーさん、こんにちは。NoMaYです。

    プロジェクト一式ありがとうございます。また、RFPでの確認もありがとうございます。それで、念の為の確認ですけれど、RFPでの確認時、E2Liteを接続したままだったりとかしてないでしょうか?RFPでの確認というと、書き込んだ後、装置全体の電源を切り、E2Liteを取り外し、装置全体の電源を再度入れる、というのが一般的操作なのですけれど、ちょっと気になりました。

    また、文字化けしたデータがTeraTermに表示された件は、ちょっと解釈出来ない現象であるように思います。PCからのUSBデータリード要求に対してマイコンがゴミデータを返していることになるのですが、UART受信とは異なり、データを返すというアクティブなアクションをする必要がある(マイコンがしている)わけですので、何が起きたのだろう、という感じです。

    思うに、この後、連休明け実働3~4日しても、他の人からドンピシャリなリプライがなければ、ガチでUSBのデバッグをしないといけない、のではないかなぁ、という気がします。かれこれ6時間ぐらいソースを見たり回路図を見たり資料を見たりしていますが、もともとはRSK-RX65N 2MBを対象にしたガイドですがGR-ROSEでも同じ筈だけど、と私も思うのです。(実際、頂いた画面コピーの2枚目と3枚目は、仰る通り、惜しいところまできているような感じ、なわけですので。)

    [メモ]

    (1) main()のスーパーループでどんなUSBイベントが検出されているのかBreakpoint設定/Run/Breakを繰り返して把握する
    (2) USBモジュールのソース上はUSB_DEBUG_ONをマクロ定義するとデバッグメッセージをprintf()するようなので試す
    (3) WiresharkでUSBプロトコルアナライズが出来るような話を見掛けた記憶があるので試す

    (*) デバッグ時はコンパイラの最適化をOFFにする

    [追記]

    画面コピーの2枚目と3枚目から推測すると、R_USB_GetEvent(&ctrl)が何らかの理由で何十回と即リターンしてしまっているのかな。本来なら、然るべきUSBイベントの発生に応じて、僅かな回数しかリターンしない筈、であるのに。

    [追記2]

    待て待て待て、自分よ、それではスーパーループにならないよね、、、何か変な気がするのだけれども、、、

    > 本来なら、然るべきUSBイベントの発生に応じて、僅かな回数しかリターンしない筈、であるのに。

    [追記3]

    ひょっとしたら、FIT PCDCジュールの挙動が昔とは違っているのかなぁ、、、

    昔(2019年) (推測)

    ・USB_STS_CONFIGUREDになるまでR_USB_GetEvent(&ctrl)は返ってこない?

    今(2022年) (推測)

    ・USB_STS_CONFIGUREDになる前にもR_USB_GetEvent(&ctrl)はUSB_STS_NONEで何度も何度も返ってくる?

  • NoMayさん、おはようございます。さまざまな検証・考察をしていただきありがとうございます。

    まずRFPの件、

    >RFPでの確認時、E2Liteを接続したままだったりとかしてないでしょうか?RFPでの確認というと、

    >書き込んだ後、装置全体の電源を切り、E2Liteを取り外し、装置全体の電源を再度入れる

    については

    1)PCとつないでいたUSBケーブルをはずす

    2)RFPでMOTファイルを書き込む

    3)E2Liteとの接続USBを外す

    4)GR-ROSEとPCをUSEケーブルで接続

    結果は前述どおり、LED点滅(タイマー制御による)もUSB通信もできていないもようです。

    (今朝再度実施してみました)

    ちなみにGR-ROSEと外部への接続は4)のケーブルのみですがよいのでしょうか?

  • FITモジュール [ r_usb_pcdc ] のサンプル(スマートコンフィグレータからインポート)

    したもの。

    ↑ ただのエコー動作

    (キーボードを打ち込んだものがそのまま帰ってくる。Teraterm の設定をローカルエコーにして)

    このサンプルは動作(E2Liteでのデバック動作)しましたので参考までに添付します。

    (添付写真:ABC と打つと AABBCCと表示)

    何かのきっかけになればと考えています。

    大変にお手数をおかけしていますがよろしくお願いします。


    GR_ROSE_USB_sample_OK.zip

  • コミーさん、こんにちは。NoMaYです。

    > ちなみにGR-ROSEと外部への接続は4)のケーブルのみですがよいのでしょうか?

    ルネサスさんのGR-ROSEのウェブページを見ると、USBバスパワーで動作するようですので、それで良いと思います。(すみません、私は実物を持っていません。) デバッグ時と単体動作時で挙動が異なることは気にはなりますけれども、、、

    > FITモジュール [ r_usb_pcdc ] のサンプル(スマートコンフィグレータからインポート)したもの。
    ...
    > このサンプルは動作(E2Liteでのデバック動作)しました

    今の予感としては、以下のアプリケーションノートのUSB(PCDC)の練習課題は今のFITモジュールではもう動作しない、という顛末の可能性があるような気がしてきたのですけれども、、、

    Renesas e² studio スマート・コンフィグレータ アプリケーションサンプル:CMT, A/D, SCI, DMA, USB編
    www.renesas.com/jp/ja/document/apn/renesas-e-studio-smart-configurator-application-examples-cmt-ad-sci-dma-usb

    私の手持ちのボードにはRXスマートコンフィグレータの生成コードでUSB PCDCを試せるものがないのですが、あれば以下の点を確認してみたいところです。

    (1) 2019年当時のFITモジュールをかき集めて置き換えて練習課題を試す → 動作するような予感

    それに対して、

    (0) 現在の状況: 2022年入手のFITモジュールを使用して練習課題を試す → 動作しない

  • NoMayさんアドバイスありがとうございます。kommyです。

    GR-ROSEをお持ちでないのに考察していただきありがとうございます。

    >このアプリケーションノートのUSB(PCDC)の練習課題は今の>FITモジュールではもう動作しない

    残念ながら↑の可能性大なのでしょうか。スマートコンフィグレータで使いやすくなっているとは言え、少し躓いただけで、私のように内部を本当に理解していない人間では原因がつかめないことがよくわかりました。

    ユーザーマニュアルを少しづつ見ながら理解を深めていきたいと思います。

  • コミーさん、こんにちは。NoMaYです。

    くだんのアプリケーションノート上では、LチカもUART通信もUSB通信も表面上は同じレベルのことに見えるでしょうけれども、10年前、20年前、といった時代にはイメージ的には、1倍、4倍、16倍といった感じの歴然とレベルの異なるスキルでしたよ。そして、今でもUSB通信なんて普通に躓く人達があちらこちらにいるはずだと思いますよ。ただ、皆さん、プロの(それで生計を立てている)ソフトウェア開発者さんやハードウェア開発者さんですので、遅かれ早かれ自己解決されてしまうのでしょうけれども。もちろん、組織というか組織の人脈というか、そういった面からの支援もありますでしょうし。それゆえ、逆に、果たしていつ頃から動作しなくなったのだろうかが分からない、ということもあったりするということでもあるのでしょうが。

    あと、今回のような(推測ですが)使っているライブラリのバージョンにまつわる話は、ちょっと凝ったArduinoシールドのサンプルプログラムがArduino本体をバージョンアップしたら動かなくなった、という普通に見聞きする話と同類かなと思うのです。(と推測しています。) こちらは、売る側も買う側もコミュニティも、初心者ユーザが大半を占めていることを前提としていると思いますので、動作しなくなったといった話はわりと早く上がってきたりするものなのではないかなぁ、とも思ったりしました。

    今、以下のように推測していますけれども、APIがこういう振る舞いだと、あのプログラムでは動作するはずがないかなぁ、と、、、

    > [追記]
    > 画面コピーの2枚目と3枚目から推測すると、R_USB_GetEvent(&ctrl)が何らかの理由で何十回と即リターンしてしまっているのかな。本来なら、然るべきUSBイベントの発生に応じて、僅かな回数しかリターンしない筈、であるのに。
    > [追記2]
    > 待て待て待て、自分よ、それではスーパーループにならないよね、、、何か変な気がするのだけれども、、、本来なら、然るべきUSBイベントの発生に応じて、僅かな回数しかリターンしない筈、であるのに。
    > [追記3]
    > ひょっとしたら、FIT PCDCジュールの挙動が昔とは違っているのかなぁ、、、
    > 昔(2019年) (推測)
    > ・USB_STS_CONFIGUREDになるまでR_USB_GetEvent(&ctrl)は返ってこない?
    > 今(2022年) (推測)
    > ・USB_STS_CONFIGUREDになる前にもR_USB_GetEvent(&ctrl)はUSB_STS_NONEで何度も何度も返ってくる?

    サンプルプログラムの記述

        R_USB_Open(&ctrl, &cfg); /* Initializes the USB module */
        /* Loop back between PC Terminal and USB MCU */
        while (1)
        {
            switch (R_USB_GetEvent(&ctrl))
            {
            case USB_STS_CONFIGURED :
                break;
            case USB_STS_WRITE_COMPLETE :
                /* Read the input from PC terminal*/
                R_USB_Read(&ctrl, g_buf, 1);
                break;
            case USB_STS_READ_COMPLETE :
                /* Clear start message flag*/
                flag_start = 0;
                略
                /* Print message at PC terminal */
                slength = strlen(print_str);
                R_USB_Write(&ctrl, (uint8_t *)print_str, slength);
                /* Change blinking rate */
                CMT0.CMCOR = (uint16_t)(5000 * interval_level);
                break;
            default :
                break;
            }
            /* USB_STS_CONFIGUREDの前にR_USB_Write()してしまっているのでは?かつ、怒涛の勢いで? */
            /* USB_STS_CONFIGUREDの後も怒涛の勢いは衰えずにR_USB_Write()してしまっているのでは? */

            if (flag_start == 1)
            {
                /* Print start message until the 1st input from PC host is received */
                sprintf(print_str, "Press space bar twice to start ...\r ");
                slength = strlen(print_str);
                R_USB_Write(&ctrl, (uint8_t *)print_str, slength);
            }
        }

     
    こんな感じでないと動作しないような、、、と思ったけれども、これだと"Press space bar twice to start ...\r "を取りこぼすケースがあるはずですので駄目だな、と思い直しました。(USB接続後にTeraTermで仮想COMポートをオープンした場合など。)

        R_USB_Open(&ctrl, &cfg); /* Initializes the USB module */
        /* Loop back between PC Terminal and USB MCU */
        while (1)
        {
            switch (R_USB_GetEvent(&ctrl))
            {
            case USB_STS_CONFIGURED :
                /* Print start message until the 1st input from PC host is received */
                sprintf(print_str, "Press space bar twice to start ...\r ");
                slength = strlen(print_str);
                R_USB_Write(&ctrl, (uint8_t *)print_str, slength);
                break;
            case USB_STS_WRITE_COMPLETE :
                /* Read the input from PC terminal*/
                R_USB_Read(&ctrl, g_buf, 1);
                break;
            case USB_STS_READ_COMPLETE :
                略
                /* Print message at PC terminal */
                slength = strlen(print_str);
                R_USB_Write(&ctrl, (uint8_t *)print_str, slength);
                /* Change blinking rate */
                CMT0.CMCOR = (uint16_t)(5000 * interval_level);
                break;
            default :
                break;
            }
        }

      
    ですので、、、

        R_USB_Open(&ctrl, &cfg); /* Initializes the USB module */
        /* Loop back between PC Terminal and USB MCU */
        while (1)
        {
            switch (R_USB_GetEvent(&ctrl))
            {
            case USB_STS_CONFIGURED :
                /* CONFIGUREDフラグを立てる処理を追加する */
                break;
            case USB_STS_WRITE_COMPLETE :
                /* Read the input from PC terminal*/
                R_USB_Read(&ctrl, g_buf, 1);
                break;
            case USB_STS_READ_COMPLETE :
                /* Clear start message flag*/
                flag_start = 0;
                略
                /* Print message at PC terminal */
                slength = strlen(print_str);
                R_USB_Write(&ctrl, (uint8_t *)print_str, slength);
                /* Change blinking rate */
                CMT0.CMCOR = (uint16_t)(5000 * interval_level);
                break;
            default :
                break;
            }
            /* 上記CONFIGUREDフラグが立つまで以下をスキップする処理を追加する */
            if (flag_start == 1)
            {
                /* 1秒待つ(送信間隔を空ける)処理を追加する */
                /* Print start message until the 1st input from PC host is received */
                sprintf(print_str, "Press space bar twice to start ...\r ");
                slength = strlen(print_str);
                R_USB_Write(&ctrl, (uint8_t *)print_str, slength);
            }
        }

     
    とか、かなぁ、、、と思ったけれども、R_USB_Write()とUSB_STS_WRITE_COMPLETE、R_USB_Read()とUSB_STS_READ_COMPLETE、それぞれ対応関係の整合性が取れてないので駄目だな、と思い直しました。

    これは数時間考えないと書けないかもなぁ、、、

  • こんにちは。NoMaYです。

    あぁっ、良く見ると`\n`で無くて`\r`ですね。

    Press space bar twice to start ...\r 

     

  • こんにちは。NoMaYです。

    そういえば、仮想COMポートとなると、Windowsのバージョンの違いによる動作の違いも気になりますね。