RX231のAD変換器、DA変換器 の使い方について

明けましておめでとうございます。
はじめまして、ニックダラスと申します。
初めての投稿で、RXマイコンプログラムは初心者です。失礼がありましたら、お許しください。
昨年11月よりRX231を用いて、RX231のAD変換にて音声信号をRXマイコンに取り込んで、そのデジタル信号を加工し、RX231のDA変換して、音声信号を出力を試みていますが、うまくいきません。
事前に、LED点滅プログラム と FFTデモプログラムの動作確認はできましたが、FFTプログラムを改造して、AD変換し、1024個のデータをリングバッファリングして、そのデータをDA変換するようにしたいのですが、サンプリング周波数の変更、DA変換器の追加、DA変換器割り込み設定等ができません。
ほぼ初心者で申し訳ないですが、ご指南、ご指導願えないでしょうか。ルネサスさんのHP掲載のマニュアル等は一通り、読みました。ほかに参考書等があれば、教えてくださいませ。
ターゲットボード: Target Board for RX231
開発環境:      setup_e2_studio_2022-10
          VSCodeUserSetup-x64-1.74.0
FTTデモプログラム: dsp_demo_rx231_tb
          r01an4431jj0160-rx-apl.pdf
GND         GND   J2-12
アナログ入力    AN0001 J2-43
アナログ出力    IO_DA1 J2-50
その他       ファンクションジェネレーター、オシロスコープ
以上です

  • NoMaYさん、いつもお世話になります。ニックダラスです。

    注意点、ありがとうございます。

  • NoMaYさん、いつもお世話になります。ニックダラスです。

    現状では、48kHzサンプリングはD/A変換の性能からNGですね。ほんと、ご指摘ありがとうございます。

    サンプリング周波数は、8kHz~16kHzで考え直します。先ずは、AD,DAの折り返しの動作確認することが自分には最優先です。

  • NoMaYさん、いつもお世話になります。色々とやってました。ニックダラスです。

    長々とすみません。

    DMAを使うことになりました。また、FITモジュールを使います。理由は、AD変換器からメモリへの転送プログラムが提供されているからです。

    AD変換器からメモリへ転送プログラムが提供されていることから、メモリからDA変換器への転送もDMAを使うことにし、色々と取り組んでいます。
    なお、AD部分がコード生成(CG)ではなく、FITモジュールで設計されているので、DA部分もFITモジュールで下記のように設計し、色々と設定をトライしていますが、動作しない状況です。

    ★デモプログラムで提供されているmain.cに書かれている内容
    static void init_dmac_s12ad(void)
    {
    dmaca_stat_t status;
    /* ---- Set up the DMAC module ---- */
    gs_dmac_cfg_s12ad.transfer_mode = DMACA_TRANSFER_MODE_NORMAL;
    gs_dmac_cfg_s12ad.repeat_block_side = DMACA_REPEAT_BLOCK_DISABLE;
    gs_dmac_cfg_s12ad.data_size = DMACA_DATA_SIZE_WORD; /* S12AD's ADDR register width */
    gs_dmac_cfg_s12ad.act_source = IR_S12AD_S12ADI0; /* S12AD as activation source */
    gs_dmac_cfg_s12ad.request_source = DMACA_TRANSFER_REQUEST_PERIPHERAL;
    gs_dmac_cfg_s12ad.dtie_request = DMACA_TRANSFER_END_INTERRUPT_ENABLE;
    gs_dmac_cfg_s12ad.esie_request = DMACA_TRANSFER_ESCAPE_END_INTERRUPT_DISABLE;
    gs_dmac_cfg_s12ad.rptie_request = DMACA_REPEAT_SIZE_END_INTERRUPT_DISABLE;
    gs_dmac_cfg_s12ad.sarie_request = DMACA_SRC_ADDR_EXT_REP_AREA_OVER_INTERRUPT_DISABLE;
    gs_dmac_cfg_s12ad.darie_request = DMACA_DES_ADDR_EXT_REP_AREA_OVER_INTERRUPT_DISABLE;
    gs_dmac_cfg_s12ad.src_addr_mode = DMACA_SRC_ADDR_FIXED;
    gs_dmac_cfg_s12ad.des_addr_mode = DMACA_DES_ADDR_INCR;
    gs_dmac_cfg_s12ad.src_addr_repeat_area = DMACA_SRC_ADDR_EXT_REP_AREA_NONE;
    gs_dmac_cfg_s12ad.des_addr_repeat_area = DMACA_DES_ADDR_EXT_REP_AREA_NONE;
    gs_dmac_cfg_s12ad.interrupt_sel = DMACA_CLEAR_INTERRUPT_FLAG_BEGINNING_TRANSFER;
    gs_dmac_cfg_s12ad.p_src_addr = (void *)&S12AD.ADDR1; /* ADDR1 - A/D Data Registers 1 */
    gs_dmac_cfg_s12ad.p_des_addr = gs_buf_info_s12ad[CURRENT].p_buf_start;
    gs_dmac_cfg_s12ad.transfer_count = gs_buf_info_s12ad[CURRENT].samples;

    IEN(S12AD,S12ADI0) = INT_DISABLE; /* Once S12ADI0 interrupt is disabled here,
    R_S12AD_Start enables the interrupt again. */


    ★下記は、デモプログラムを参考に当方でDA変換器からメモリへのDMA設定を書いたものです。
    static void init_dmac_da(void)
    {
    dmaca_stat_t status;
    /* ---- Set up the DMAC module ---- */
    gs_dmac_cfg_da.transfer_mode = DMACA_TRANSFER_MODE_NORMAL;
    gs_dmac_cfg_da.repeat_block_side = DMACA_REPEAT_BLOCK_DISABLE;
    gs_dmac_cfg_da.data_size = DMACA_DATA_SIZE_WORD; /* S12AD's ADDR register width */
    gs_dmac_cfg_da.act_source = IR_S12AD_S12ADI0; /* ???????????????? S12AD as activation source */
    gs_dmac_cfg_da.request_source = DMACA_TRANSFER_REQUEST_PERIPHERAL;
    gs_dmac_cfg_da.dtie_request = DMACA_TRANSFER_END_INTERRUPT_ENABLE;
    gs_dmac_cfg_da.esie_request = DMACA_TRANSFER_ESCAPE_END_INTERRUPT_DISABLE;
    gs_dmac_cfg_da.rptie_request = DMACA_REPEAT_SIZE_END_INTERRUPT_DISABLE;
    gs_dmac_cfg_da.sarie_request = DMACA_SRC_ADDR_EXT_REP_AREA_OVER_INTERRUPT_DISABLE;
    gs_dmac_cfg_da.darie_request = DMACA_DES_ADDR_EXT_REP_AREA_OVER_INTERRUPT_DISABLE;
    gs_dmac_cfg_da.src_addr_mode = DMACA_DES_ADDR_INCR;
    gs_dmac_cfg_da.des_addr_mode = DMACA_SRC_ADDR_FIXED;
    gs_dmac_cfg_da.src_addr_repeat_area = DMACA_SRC_ADDR_EXT_REP_AREA_NONE;
    gs_dmac_cfg_da.des_addr_repeat_area = DMACA_DES_ADDR_EXT_REP_AREA_NONE;
    gs_dmac_cfg_da.interrupt_sel = DMACA_CLEAR_INTERRUPT_FLAG_BEGINNING_TRANSFER;
    gs_dmac_cfg_da.p_src_addr = gs_buf_info_da[CURRENT].p_buf_start;
    gs_dmac_cfg_da.p_des_addr = (void *)&DA.DADR1; /* DADR1 - D/A Data Registers 1 */
    gs_dmac_cfg_da.transfer_count = gs_buf_info_s12ad[CURRENT].samples;

    IEN(S12AD,S12ADI0) = INT_DISABLE; /* ?????????? Once S12ADI0 interrupt is disabled here,
    R_S12AD_Start enables the interrupt again. */

    DSP FTTのデモプログラムのAD部分のDMA設定を参考に、DA部分のDMA設定部分を設計してみましたが、RX231 TBの100pinからアナログの出力がありません。
    お忙しいところ、恐縮ですが、アドバイスを頂けないでしょうか。

  • ニックダラスさん、こんにちは。NoMaYです。

    まずは、以下の設定でコードを書いてみてはどうでしょうか。(サンプルプログラムも存在すると信じていますけれども。)

    (1) ソフトウェアトリガ
    (2) データ転送数は1
    (3) 転送元も転送先もメモリ

    動いたら

    (4) 転送先をD/A変換レジスタへ変更

    動いたら

    (5) DMA起動要因を割り込みへ変更

    動いたら

    (6) 転送数を2以上へ変更

    なお、(4)(5)(6)の順番は、動作しない状況/デバッグ状況に応じて、弾力的に変えて試行錯誤してみる。

    また、FITモジュール関連の構造体をスタック上に配置することは避ける。

    [関連リンク]

    FIT moduleを使っていてtroubleに遭遇してしまったところです。
    community-ja.renesas.com/cafe_rene/forums-groups/tools/f/forum21/6382/fit-module-trouble
     

  • NoMaYさん、ニックダラスです。

    早々にありがとうございます。とにかくやってみます。

    トラブル遭遇も参考にさせていただきます。

  • NoMaYさん、ニックダラスです。

  • NoMaYさん、ニックダラスです。ご報告です。【DA用のDMA動作しました】

    CMT1のCMI1の割り込み許可、dmaca_stat_t da_status; と main.cのIEN の変更をして動作確認しました。

    dmaca_stat_t da_status;
    /* ---- Set up the DMAC module ---- */
    gs_dmac_cfg_da.act_source = IR_CMT1_CMI1;

    gs_dmac_cfg_da.src_addr_mode = DMACA_SRC_ADDR_INCR;
    gs_dmac_cfg_da.des_addr_mode = DMACA_DES_ADDR_FIXED;
    gs_dmac_cfg_da.p_src_addr = gs_buf_info_da[CURRENT].p_buf_start;
    gs_dmac_cfg_da.p_des_addr = (void *)&DA.DADR1; /* DADR1 - D/A Data Registers 1 */
     
    IEN(CMT1,CMI1) = INT_DISABLE;

    IEN(CMT1,CMI1) = INT_ENABLE;