こんにちは、ユキと申します。
RL78/G13のCSIで、バッファ空き割込みを使った連続送受信をマスタとして行うときのことについてご教授いただけないでしょうか。コンパイラはCC-RL、IDEはe2studioを使用しております。
現在、コード生成を使い、CSI21を以下のような設定で動作させようとしています。
転送モード:連続転送モードデータ長:8ビットデータ転送方向:MSBデータ送受信タイミング:タイプ4転送レート: クロック・モード:内部クロック(マスタ) ボー・レート:2000000bps通信完了割り込み優先順位:低コールバック機能設定:すべて有効
コード生成を実行した上で、自分のコードでR_CSI21_Send_Receive()を呼び出しているのですが、以下のような現象が起きています。
・1バイトのデータを送信した時は通信が成功する・2バイト以上のデータを送信するとオーバーランエラーが発生する・シングル転送モードを使った場合は、2バイト以上のデータを送信してもオーバーランエラーは発生しない
そして、r_cg_serial_user.cのr_csi21_interrupt()の、
if (g_csi21_tx_count > 0U) { if (g_csi21_tx_count != (g_csi21_send_length - 1U)) { *gp_csi21_rx_address = SIO21; gp_csi21_rx_address++; } SIO21 = *gp_csi21_tx_address; gp_csi21_tx_address++; g_csi21_tx_count--; }上記のコードを以下のように書き換えてみると、オーバーランエラーが発生しなくなりました。
if (g_csi21_tx_count > 0U)
{
if (g_csi21_tx_count != (g_csi21_send_length - 1U))
*gp_csi21_rx_address = SIO21;
gp_csi21_rx_address++;
}
SIO21 = *gp_csi21_tx_address;
gp_csi21_tx_address++;
g_csi21_tx_count--;
if (g_csi21_tx_count > 0U) { *gp_csi21_rx_address = SIO21; gp_csi21_rx_address++; SIO21 = *gp_csi21_tx_address; gp_csi21_tx_address++; g_csi21_tx_count--;}
期待通りの動作をするようになったものの、何故こうなるのか理解できておりません。上記はコード生成でできるコードなので、私の使い方が間違っている気がするのですが……
バッファオーバーランが起きる時、送信データの1バイト目を書き込んだ後の最初のバッファ空き割込みで、実際にはSDRにデータが存在するような動作をしているように見えます。
しかし、ハードウェアマニュアルを読むと、送信データの1バイト目を書き込んだ後の最初のバッファ空き割込みでは、データを受信していないし、バッファ空き割込みなのだからSDRは空いている。何もせずに2バイト目のデータをSDRに書き込んで良いというように読み取れました。
私の理解は正しいのでしょうか。そして、何故このような動作をするのでしょうか。ご助言をいただけると嬉しいです。
足りない情報がございましたら、おっしゃってください。
よろしくお願いいたします。
ユキさん、こんにちは。NoMaYです。ソースコード有難う御座います。それで、ユキさんの仕事の納期とチョコさんの時間の空き具合の兼ね合いになってしまうのですが、チョコさんがRL78/G12 24MHzで6Mbps動作させることが出来たソースを待つという手もあるように思います。チョコさんは、コード生成機能の初期化関数のみ使用し、送信起動回りや割り込み回りを御自身で作成されていて、チョコさんの先日のリプライの以下の文面から、今回の問題はチョコさんのソースでは発生しないのではないだろうか、と私は思い始めているからです。今回の件は、最初の割り込みを特別扱いするから起きてしまう、ように思えるからです。> 私は,こんな排他制御的なことはやりません。> 最初の送信データの書込みから割り込み処理させています。最初の割り込みを特別扱いするのは、以下の画面コピーの通り、ハードウェアマニュアルからして、そうなっているのですが、最初の送信データを書いた直後に、たまたま、重い割り込み処理が発生して、最初の割り込み受付が受信完了後になったら、同じことになるとも思えるのです。それを回避する為にも、チョコさんが仰られている方法を取らないといけない、ように思えるのです。ところで、余談ですが、ハードウェアマニュアルを見直していて、あれっ?と思ったのは、シリアルアレイユニットは、一応、シフトレジスタと送受信バッファの2段構成にはなっているのですが、けちけち設計のRL78なので(?)、送信バッファと受信バッファが兼用されてそうですね。だから、受信データが有効な期間が短いのでしょうね。バッファが別々なら、次のデータの受信完了(=次のデータの送信完了)まで保持出来ると思うのですが、次の送信データの書き込みまでしか保持されないのでしょうね。