皆様
毎度お世話になっております。
RX71Mマイコンを使用して、DTCによりRSPIから32bitのデータを連続送受信することを試みています。
現時点でDTCが正常に起動して、実際に通信も起きていることが確認できたのですが、
CPUへの割り込みが2回発生してしまう問題があります。
DTCはFITモジュールを使用しており、CPU割り込みはDTCの全転送終了後に1度発生する設定にしてあります。
DTCの転送回数を2回や4回などに変更しても、同じようにCPU割り込みは2回発生しています。
通信の流れは以下のようにしています。
①RSPI0の割り込みを無効化
②DTC起動要因の設定(FITモジュールのR_DTC_Create, R_DTC_Control関数)
③RSPI0の割り込みを有効化
④RSPI.SPDR.LONGレジスタに最初の32bitデータを書き込み
④に関しては、現時点では送信バッファエンプティ割り込みを発生させるために、最初のデータはプログラムから手動で書き込んでいます。
割り込みのタイミングに関しては、
最初の一回は④で書き込んだデータの転送終了時、2回目はDTCの全転送終了時に発生しているようです。
自分の希望としては、最初の一回目の割り込みは発生しないようにして、2回目の割り込みだけを発生させるようにしたいのですが、
そのような方法はあるのでしょうか?
よろしくお願いいたします。
開発環境:CS+ for CC V7.00.00
使用デバイス: RX71M_RSK
anonyさん、こんにちは。NoMaYと申します。内蔵周辺機能には詳しく無くて、どこまでリプライ出来るか分からない(RSPIはループバックモードを動かした程度、DTCは未経験、RX71Mも未経験)ですけれども、気になったのは、以下の「最初の一回は④で書き込んだデータの転送終了時」に発生する割り込みなのですが、具体的には、何の割り込みなのでしょうか?(送信バッファエンプティ割り込み、アイドル割り込み、エラー割り込み、受信バッファフル割り込み、それ以外?、のどれでしょうか?)>最初の一回は④で書き込んだデータの転送終了時、2回目はDTCの全転送終了時に発生しているようです。
anonyさん、こんにちは。NoMaYです。RX71Mのハードウェアマニュアル(画面コピー)のDTCの割り込みの説明とINTCのブロック図を見る限り、どうして「最初の一回は④で書き込んだデータの転送終了時」に送信バッファエンプティ割り込みが発生するのか、不思議ですね、、、もう少しハードウェアマニュアルを見てみます、、、www.renesas.com/jp/ja/doc/products/mpumcu/doc/rx_family/r01uh0493jj0110-rx71m.pdf今回は前者の設定ですね割り込み要因の伝播経路(推測)からは最初の一回目の挙動は不思議ですね(ただ、ブロック図はブロック図、ですが、、、)
anonyさん、こんにちは。NoMaYです。RXマイコンでは、送信割り込みを使った連続送信処理をシンプルに記述する手法として、ダミーの送信バッファエンプティ割り込みを強制的に発生させる手法がありますが、その手法と今回の謎の1回目の割り込みとは話が整合しているような予感がしなくもないような気がしてきました。もし、この手法がDTCでも使えるのであれば、そもそも最初の1バイト目の送信を特別扱いすることなく、最初の1バイト目からを全てDTC転送することが出来るようになるのですが、そのことを見越して、そのような挙動になっている可能性もあります。ですが、まだ、ハードウェアマニュアルに記載を見付けることは出来ていません。(なお、ハードウェアマニュアルの他に、RXスマートコンフィグレータでRSPI+DTCで送信するコードを生成させ、そのコードを参考に見てみようかとも思い始めました。)なお、以下のRX71Mのハードウェアマニュアルの画面コピーは、DTC(やDMA)が絡んで来ない状況でRSPI単独またはSCI単独(参考)でダミーの送信バッファエンプティ割り込みを強制的に発生させるやり方について書かれた箇所ですが、参考までに抜き出してみました。RSPIの場合SCIの場合
anonyさん、こんにちは。NoMaYです。RXスマートコンフィグレータでコード生成させたコードを見たところ、以下のようになっていて、最初の1バイトの送信を特別扱いしていないようでした。今回の件は、だんだんと、ダミーの送信バッファエンプティ割り込みを使う前提に立った上での、そういう割り込みを発生させるようになっているという、DTC(およびDMAも)の仕様なのではないだろうか?という気がしてきました。[追記] 17:55 下の方に追記しました。src\smc_gen\Config_RSPI0\Config_RSPI0.c
/******************************************************************************* Function Name: R_Config_RSPI0_Send_Receive* Description : This function sends and receives RSPI0 data* Arguments : tx_buf -* transfer buffer pointer (not used when data is handled by DMAC/DTC)* tx_num -* buffer size* rx_buf -* receive buffer pointer (not used when data is handled by DMAC/DTC)* Return Value : status -* MD_OK or MD_ARGERROR******************************************************************************/MD_STATUS R_Config_RSPI0_Send_Receive(uint32_t * const tx_buf, uint16_t tx_num, uint32_t * const rx_buf){ /* Enable transmit interrupt */ RSPI0.SPCR.BIT.SPTIE = 1U; /* Enable receive interrupt */ RSPI0.SPCR.BIT.SPRIE = 1U; /* Enable error interrupt */ RSPI0.SPCR.BIT.SPEIE = 1U; /* Enable RSPI function */ RSPI0.SPCR.BIT.SPE = 1U; return MD_OK;}
[追記] 17:55更にコードを見ていたら、以下のようにもなっていて、r_Config_RSPI0_transmit_interrupt()で素朴にr_Config_RSPI0_callback_transmitend()が呼ばれているので、これは送信バッファエンプティ割り込みは1回しか発生していないことを示唆しているようにも、思え始めました、、、(RX71Mは手元に無いので、自分でRX65Nで確かめてみた方が良さそうな気がしてきました、、、)src\smc_gen\Config_RSPI0\Config_RSPI0_user.c
/******************************************************************************* Function Name: r_Config_RSPI0_transmit_interrupt* Description : This function is SPTI0 interrupt service routine* Arguments : None* Return Value : None******************************************************************************/#if FAST_INTERRUPT_VECTOR == VECT_RSPI0_SPTI0#pragma interrupt r_Config_RSPI0_transmit_interrupt(vect=VECT(RSPI0,SPTI0),fint)#else#pragma interrupt r_Config_RSPI0_transmit_interrupt(vect=VECT(RSPI0,SPTI0))#endifstatic void r_Config_RSPI0_transmit_interrupt(void){ r_Config_RSPI0_callback_transmitend();}途中省略/******************************************************************************* Function Name: r_Config_RSPI0_callback_transmitend* Description : This function is a callback function when RSPI0 finishes transmission* Arguments : None* Return Value : None******************************************************************************/static void r_Config_RSPI0_callback_transmitend(void){ /* Start user code for r_Config_RSPI0_callback_transmitend. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */}