コードジェネレータで出力したUARTモジュールのスマートコンフィグレータで出力したFITのSCIモジュールへの置き換えについて


こんにちは、KATA_KANと申します。

現在、RX72M RSK にUART通信でWifiモジュール(ESP8266)を接続し、ESP8266デフォルトF/WのATコマンドを行おうとしています。

ルネサス製品で、ESP8266の制御を行っているサンプルがないかと探していたところ、
RL78/G10向けのサンプルプログラムを見つけることが出来ました。
www.renesas.com/.../search

本サンプルプログラムを、RX72M RSK用に作り替えようとしたのですが、
サンプルプログラムではコードジェネレータで作られた UART モジュール(r_cg_sau.c)の API を使っていたようでしたので、
e2studio 2022/1 版でスマートコンフィギュレータから出力した FIT の SCI モジュール(r_sci_rx.c) の API に置き換えようとしました。

しかし、単純に R_UART0_Send() ⇒ R_SCI_Send() などのように置き換えるだけでは上手く動作しませんでした。
モジュールのソースコードを確認したところ、コードジェネレータで作られたUARTモジュールのAPIは、基本ノンブロッキング動作で動いているようで、
FIT の SCI モジュールの API は設定によるのかブロッキング動作で動いているように見えました。

FIT の SCI モジュールの API をコードジェネレータで作られた UART モジュールの API と同様に動かすことは出来るのでしょうか?
また、動かすことが出来るのであれば、その際のコンフィグをどのようにすればよいの、ご助言を頂けますと幸いです。

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

    > FITのSCIモジュールのAPIは設定によるのかブロッキング動作で動いているように見えました。

    こちらは送受信ともリングバッファを使うようになっていますので、基本的な捉え方としては、ノンブロッキング動作であると思います。そして、思うに、設定、といった部分の話で無くて、APIの呼び出し方、の部分の話かな、という気がします。

    普段からFIT SCIモジュールを使っているわけでは無いですので、ちょっと勘違いもあるかもしれませんが、以下のRL78/G10のサンプルプログラムの R_ESP_UART_GetRxCount() と R_ESP_UART_Receive() のFIT SCIモジュールへの置き換えを以下のようにしてみてはどうでしょうか?(もちろん、他の関数も適宜置き換えるもの、としてですけれども。)

    R_ESP_UART_GetRxCount() ⇒ 受信リングバッファ内の受信済みバイト数を取得する関数へ置き換える

    R_ESP_UART_Receive() ⇒ 単に以下のソースを書き換えるだけでなく、上位側込み込みで置き換える

    RL78/G10のサンプルプログラム
    (1) まずR_ESP_UART_Receive()で受信動作を起動(受信サイズは受信バッファの最大サイズで起動されてますね)
    (2) R_ESP_UART_GetRxCount()で受信済みバイト数を取得
    (3) 受信済みバイト数が必要数になったら受信終了

    FIT SCIモジュールへの置き換え
    (1) 受信リングバッファで常に受信状態にありますので特に何もしない
    (2) R_ESP_UART_GetRxCount()で受信リングバッファ内の受信済みバイト数を取得
    (3) 受信済みバイト数が必要数になったら、そこでR_ESP_UART_Receive()で受信済みデータをガッと取得して受信終了

    上記のような感じになるのではないかなぁ、と思うのです。

    以下、RL78/G10のサンプルプログラムのソースです。(FIT SCIモジュールへ置き換えたものではありません。)

    r01an4791xx0100-rl78g10-connectivity/workspace/e2studio/src/cg_src/r_esp_hw.c

    #include "r_esp_hw.h"
    extern volatile uint16_t  g_uart0_rx_count;            /* uart0 receive data number */

    /******************************************************************************
    * Function Name: R_ESP_UART_GetRxCount
    * Description  : Gets the value of the UART received data counter.
    In this sample program, this function gets the value of g_uart0_rx_count
    * Arguments    : None
    * Return Value : Value of the UART received data counter
    ******************************************************************************/
    uint16_t R_ESP_UART_GetRxCount(void) {
        return g_uart0_rx_count;
    }

    /******************************************************************************
    * Function Name: R_ESP_UART_Send
    * Description  : Start the UART transmission processing.
    In this sample program, this function calls R_UART0_Send()
    * Arguments    : uint8_t * const tx_buf     Start address of the area
    where data to be sent is stored
    *                uint16_t tx_num            Length of data to be sent
    * Return Value : None
    ******************************************************************************/
    void R_ESP_UART_Send(uint8_t * const tx_buf, uint16_t tx_num) {
        R_UART0_Send(tx_buf, tx_num);
    }

    /******************************************************************************
    * Function Name: R_ESP_UART_Receive
    * Description  : Starts the UART reception processing.
    In this sample program, this function calls R_UART0_Receive()
    * Arguments    : uint8_t * const rx_buf     Start address of the area
    for storing the received data
    *                uint16_t rx_num            Length of data to be received
    * Return Value : None
    ******************************************************************************/
    void R_ESP_UART_Receive(uint8_t * const rx_buf, uint16_t rx_num) {
        R_UART0_Receive(rx_buf, rx_num);
    }

    /******************************************************************************
    * Function Name: R_ESP_UART_Start
    * Description  : Enable UART processing.
    * Arguments    : None
    * Return Value : None
    ******************************************************************************/
    void R_ESP_UART_Start(void) {
        R_UART0_Start();
    }

    /******************************************************************************
    * Function Name: R_ESP_UART_Stop
    * Description  : Disable UART processing.
    * Arguments    : None
    * Return Value : None
    ******************************************************************************/
    void R_ESP_UART_Stop(void) {
        R_UART0_Stop();
    }

     

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

    投稿直後に、念の為にと思って、ソースを見直したら、すぐ間違いに気付く、というのは恥ずかしいですけれども、、、以下にした方が良さそうです、、、

    R_ESP_UART_GetRxCount() ⇒ 受信リングバッファ内に1バイト以上あれば読み出して独自受信バッファにコピー
                 そして独自受信バッファにコピー済みのバイト数を返す

    FIT SCIモジュールへの置き換え
    (1) 受信リングバッファで常に受信状態にありますので特に何もしない
    (2) R_ESP_UART_GetRxCount()で受信済みバイト数を取得
    (3) 受信済みバイト数が必要数になったら受信終了 + 受信済みデータを随時解析している箇所もあったです(ごめんなさい)

  • >NoMaY さん
    返信ありがとうございます。
    説明を読むうち、なるほどと思いました。

    >こちらは送受信ともリングバッファを使うようになっていますので、基本的な捉え方としては、ノンブロッキング動作であると思います。
    >そして、思うに、設定、といった部分の話で無くて、APIの呼び出し方、の部分の話かな、という気がします。

    「コードジェネレータで作られた UART モジュール」と「スマートコンフィギュレータから出力した FIT の SCI モジュール」とで、
    APIの動作思想が違うということですね。

    コードジェネレータで作られた UART モジュールの場合:
    R_ESP_UART_Receive()では受信の開始(初期化)を行い、以後、コールバックで受信バッファを更新。
    ※リングバッファではなく、引数で指定したバッファに直接コールバックで受信データを書き込んでいる?

    と動作するのに対し、

    スマートコンフィギュレータから出力した FIT の SCI モジュールの場合:
    受信リングバッファはコールバックで常に更新、R_SCI_Receive()では、受信リングバッファに蓄積されたデータの引き取りを行う。

    と、いうように異なる動作をするということですね(解釈が違っていたらごめんなさい)
    単純に置き換えても駄目だということは理解できました!

    置き換え案の提案までして頂きありがとうございます。
    置き換えに苦慮していたのが R_ESP_UART_GetRxCount() でしたので、案を頂けましたのは大変助かります。

    頂いたネタを元に、もう少し考えてみようかと思います。ありがとうございます!

  • r_sci_rxモジュールには SCI_CFG_USE_CIRCULAR_BUFFER というパラメータがありデフォルトでは0なので、リングバッファとして生成されないのでは?

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

    ひょっとして同じようなことをしようとしてハマッてしまいましたか?(ごめんなさい、そこまでAPIや使い方が頭の中に入っているというわけでは無くて。)