Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

SCIのポート同期について

のーしゃんです。

RX111でSCI5とSCI1の調歩同期通信で送信割込みをほぼ同時に開始させるように以下のコードを書きました。
SCI5.SCR.BIT.TIE = 1;
SCI1.SCR.BIT.TIE = 1;
SCI5.SCR.BIT.TE = 1;
SCI1.SCR.BIT.TE = 1;


SCI5に230,400bpsとSCI1に230,400bpsの同じ場合は、2μS程度のズレで送信されています。
下の画像の黄色がSCI5で緑がSCI1の通信ドライバーICの出口の波形です。

次に両SCIが38,400bpsの場合は25μS程度のズレになります。

ところがSCI5に230,400bpsでSCI1に38,400bpsにすると大きくズレます。

 

 

240μS程度もズレます。
割込みの優先順位を操作しても殆ど変化はありません。

基本的に同じBaudrate同士で使うので問題ないのですが、Baudrateが異なるとこのようになるのでしょうか?

SCIの動作が分周によって動作開始のスケジューリングが違うのかな?

のーしゃん

  • わわいです
    TIEがセットされてから送信開始まで、ってのはデータシートでも規定されてないので、どうなろうと文句は言えませんねー
    #だいたい、どうやって同期させて複数のTIEをセットするかってのも問題

    ましかし、相手はデジタル回路なんで、同じ設定ならある程度揃うことは期待できるでしょうけど、ボーレートが変わるとなるとそこら辺の事情も変わってきそうな気はしますね
  • 言わんとされてることがイマイチわからんのですが、スタート+データ+ストップで仮に 10ビットの送信がされるとして、230,400bpsと38,400bpsであれば送信完了でそれくらいの差は開くのでは?
  • In reply to fujita nozomu:

    のーしゃんです。
    TDRからTSRまではパラレルロードかな?と思っていて、TDRにライトすると即TSRにロードされてStart Bitが直ぐに出てくると思ったのです。

    TDRからTSRへ74299のようなパラレルロード型のシフトレジスタじゃなくてシリアルロードとすればTDRからTSRロードされる時間はボーレイトに左右される訳ですか。

    38,400bpsのStart+8Bit+Parity+Stopで11Bitとして286μSで230,400bps側は48μSなので差し引きで240μSの遅れがあるのですね。
    ボーレイトが同じなら差が無くなるのか。
  • SCI5.SCR.BIT.TE = 1; の前に何処かのポートにパルスを出し、それをトリガーにしてトリガーと共に波形観測します。
    トリガーからどれだけ遅れて出力されるか調べれば、あなたの知りたい事が分るんじゃないかな。
  • In reply to リカルド:

    リカルドさん、アドバイスありがとうございます。
    のーしゃんです。
    やってみました!

    以下のI/Oをトリガーにしました。
    PORTB.PODR.BIT.B3 = 1;
    PORTB.PODR.BIT.B3 = 0;
    PORTB.PODR.BIT.B3 = 1;

    送信割込みを有効する
    SCI5.SCR.BIT.TIE = 1;
    SCI5.SCR.BIT.TE = 1;
    の後と

    送信割込みのExcep_SCI5_TXI5関数の最初にSCI5.TDRにライトする手前にトリガーコードを入れました。
    230,400bpsではTDRにライトしてから44μSくらいなので10bit時間かかっています。

     

    38,400bpsの方は295μSくらいなので11bit時間です。

    TDRからTSRまではビットシフトで転送している感じですね。

    すっきりしました。

  • In reply to のーしゃん:

    僕の意図は分りますか?

    SCI5.SCR.BIT.TE = 1; SCI1.SCR.BIT.TE = 1;

    にしてからビットレイトに関係したクロック分だけ遅れると予想し、送信波形を見ればヒントが掴めるのではないかと言う考えです。
  • In reply to リカルド:

    リカルドさん、ごめんなさい。

    シングルポートで計測していました。
    2ポートで擬似同期のSCI5.SCR.BIT.TE = 1; SCI1.SCR.BIT.TE = 1;の前にトリガーコードを入れました。
    黄色が230,400bpsで緑色が38,400bpsで紫色がトリガー信号です。
    先ほどの38,400bpsの画像で右の方に太く出ているパルスがありますが、
    トリガー信号は他で使っている信号に加えているためです。
    今回はトリガー信号のみ出るように細工しました。

    画像下のズーム部でトリガー位置から50μSくらいで230,400bpsの送信開始、
    320μSくらいで38,400bpsの送信開始ですね。

     

     

  • In reply to のーしゃん:

    >画像下のズーム部でトリガー位置から50μSくらいで230,400bpsの送信開始、
    >320μSくらいで38,400bpsの送信開始ですね。

    この結果から考えられる事は、
    SCI5.SCR.BIT.TE = 1; SCI1.SCR.BIT.TE = 1;
    にしてからビットレイトに比例したクロック数だけ送れて送信が始まると言う事でしょう。

    次のようにすれば、SCI5.SCR.BIT.TE = 1; SCI1.SCR.BIT.TE = 1; の時間が分ります。
    もう少し時間測定の精度が上がるでしょう。

    SCI5.SCR.BIT.TIE = 1;
    SCI1.SCR.BIT.TIE = 1;

    PORTB.PODR.BIT.B3 = 0;
    PORTB.PODR.BIT.B3 = 1;

    SCI5.SCR.BIT.TE = 1;
    SCI1.SCR.BIT.TE = 1;

    PORTB.PODR.BIT.B3 = 0;
  • In reply to リカルド:

    SCI5.SCR.BIT.TE = 1;
    SCI1.SCR.BIT.TE = 1;
    とした後に送信割込みが発生して、割り込み処理でTDRにライトすることで送信が始まりますが、
    そういう事では無くてあらかじめTDRにライトしておいて、.TEを1にすることでクロック数だけ遅れて送信が始まることでしょうか?
  • In reply to のーしゃん:

    >SCI5.SCR.BIT.TE = 1;
    >SCI1.SCR.BIT.TE = 1;
    >とした後に送信割込みが発生して、割り込み処理でTDRにライトすることで送信が始まりますが、

    >TDRにライトすることで送信が始まりますが

    それならば「TDRにライト」付近でトリガー信号を作ります。
    2チャンネル有るのなら、トリガー信号も2本必要ですね。
  • In reply to リカルド:

    TDRにライト付近にトリガーですが、2018/8/9 0:52 の書き込みで実行してます。
    .TE=1の後にH→L→Hして、送信割込みのTDRにライトの手前でH→L→Hです。
    オシロ画像のトリガー波形に2本のLowパルスが数μS離れてありますよね。
    送信割込みの初回発生タイミングのズレはこれから確認します。
  • In reply to のーしゃん:

    擬似同期送信で
    PORTB.PODR.BIT.B3 = 1;
    PORTB.PODR.BIT.B3 = 0;
    PORTB.PODR.BIT.B3 = 1;
    SCI5.SCR.BIT.TE = 1;
    SCI1.SCR.BIT.TE = 1;
    として、
    SCI5とSCI1の送信割込みのフレームデータの最初1バイトをTDRにライトする前で
    PORTB.PODR.BIT.B3 = 1;
    PORTB.PODR.BIT.B3 = 0;
    PORTB.PODR.BIT.B3 = 1;
    します。
    トリガー信号が2個用意できなかったので1個とします。

    左下の赤丸の部分に3個のLowパルスがあります。
    最初が .TE=1 の部分で次の2個のパルスがSCI5とSCI1のTDRにライトする直前です。
    SCI5とSCI1の区別はつきませんが、5μSのズレなので、ほぼ同時で良いと思います。

    この最初のTDRのライトからボーレイトに応じたシフトアウト時間がTSRの通過時間である1キャラクター時間に一致していると思います。
    TSRが空でもTDRからTSRへの転送時間は1キャラクター時間かかることが、今回のボーレイト違いによるズレということと思います。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page