RL78/G13 CSI通信(複数スレーブ切替)できません

初めてお世話になります。axonteraです。

RL78/G13を7つ使って、マスタ1、スレーブ6のCSI通信を行おうとしていますが、うまくいっていません。
【症状】
・マスタから送信したデータが1バイト遅れてマスタの受信データになる
・スレーブ側はオーバーランエラーが出て送受信できていない
【条件】
・マスタ、スレーブともコード生成を使用
・通信条件(CSI00):シングル転送モード、8ビット、MSB、タイミングタイプ1、312500bps、割り込み優先度レベル2
・マスタでCS後、100usのディレイ後に送受信開始(R_CSI_Send_Receive実行)
・スレーブ側はCSを検知してすぐに送信バッファ(配列変数)にデータ格納し、続いてR_CSI_Send_Receive実行

現在はスレーブを1つにして、他の5つのスレーブはR_CSI_Createを実行せず、P10とP12をNchオープンドレインに設定
したところ、SI00(マスタ)が0固定になってしまいました。そこで上記5つのスレーブでPM1 = 0x02、P1 = 0x05を追記
して出力を1にしてみましたが、今度は立ち上がりの鈍い波形になり、マスタのマイコンが熱くなって(60℃くらい)しまいました。
その鈍い波形もやはり当初の1バイト遅れデータのように見えます。

何か思い当たるアドバイスがあればお願いいたします。

Parents
  • チョコです。

    >・マスタから送信したデータが1バイト遅れてマスタの受信データになる

    この理由が分かったような気がします。

    スレーブが、マスタからの1バイト目を受信すると、シフトレジスタには受信データが入り、そのデータがSDRレジスタに転送されます。

    この状態で、スレーブが新しいデータを書き込む(次の通信準備をする)と、次の通信ではスレーブが書き込んだデータがシフトレジスタに転送されてこのデータがマスタに送信されます。

    もし、スレーブが新しいデータを書き込む前にマスタが次の通信を開始すると、シフトレジスタの値(つまりは、前回マスタが送信したデータ)が送信されます。

    このため、「マスタから送信したデータが1バイト遅れてマスタの受信データになる」という現象になっている考えられます。

    この対策としては、「マスタが次のデータを通信する前に、スレーブの準備ができるまで遅延を挿入する。」となります。このための確実な方法はRL78/G10のアプリケーションノート(R01AN2759JJ0201)にあるようなハンドシェイク信号を追加することです。回路を変更するのは大変ならば、前回紹介した「マスタ側でのソフトタイマでの遅延を追加する」ことです。これは、コード生成されたコードの修正が必要です。修正するたびに元に戻るので、面倒です。

    そこで、マスタ側での通信データ数を1に設定して、必要な回数をループさせることが考えられます。そのループに遅延を入れれば、コード生成されたコードはいじる必要はなくなります。この方法を試してみてください。

     

    以上

Reply
  • チョコです。

    >・マスタから送信したデータが1バイト遅れてマスタの受信データになる

    この理由が分かったような気がします。

    スレーブが、マスタからの1バイト目を受信すると、シフトレジスタには受信データが入り、そのデータがSDRレジスタに転送されます。

    この状態で、スレーブが新しいデータを書き込む(次の通信準備をする)と、次の通信ではスレーブが書き込んだデータがシフトレジスタに転送されてこのデータがマスタに送信されます。

    もし、スレーブが新しいデータを書き込む前にマスタが次の通信を開始すると、シフトレジスタの値(つまりは、前回マスタが送信したデータ)が送信されます。

    このため、「マスタから送信したデータが1バイト遅れてマスタの受信データになる」という現象になっている考えられます。

    この対策としては、「マスタが次のデータを通信する前に、スレーブの準備ができるまで遅延を挿入する。」となります。このための確実な方法はRL78/G10のアプリケーションノート(R01AN2759JJ0201)にあるようなハンドシェイク信号を追加することです。回路を変更するのは大変ならば、前回紹介した「マスタ側でのソフトタイマでの遅延を追加する」ことです。これは、コード生成されたコードの修正が必要です。修正するたびに元に戻るので、面倒です。

    そこで、マスタ側での通信データ数を1に設定して、必要な回数をループさせることが考えられます。そのループに遅延を入れれば、コード生成されたコードはいじる必要はなくなります。この方法を試してみてください。

     

    以上

Children
No Data