ホーム フォーラム Texas Instruments マイコン MSP430 SPI通信のオーバーランエラーフラグについて

このトピックには7件の返信が含まれ、2人の参加者がいます。6 年、 2 ヶ月前クライフ クライフ さんが最後の更新を行いました。

8件の投稿を表示中 - 1 - 8件目 (全8件中)
  • 投稿者
    投稿
  • #2183 返信

    kkk
    参加者

    SPI通信のオーバーランエラーフラグについて

    デバイス型番:MSP430FR6879

    eUSCI A1でSPI通信(3線マスター)を実行しています。
    受信割り込み処理で受信バッファのデータを読み出す前にオーバーランエラーフラグ(UCAxSTATWのUCOE)のON/OFFを判定したところ、常にオーバーランエラーフラグがONと判定されました。
    デバッガ上で、受信割り込み処理でブレークをかけてレジスタの値を確認すると、オーバーランエラーフラグはON(=1)になっていることも確認しました。

    受信割り込み処理でテストポート出力を反転させてUCA1SOMIに入力される受信データと比較したところ、8クロック分の受信データが入力されるとテストポート出力も反転していたため、受信バッファのデータを読み出す前に受信バッファが上書きされていることは無いようでした。

    また、受信バッファからRAMに移した受信データも設計通りの値になっていたため、SPI通信は正常に実行できていると考えています。

    オーバーランエラーフラグがONになっている原因は何が考えられるのでしょうか?

    #2186 返信
    クライフ
    クライフ
    従業員

    kkk様

    投稿いただき、ありがとうございます。

    下記について、ご確認いただけますでしょうか。

    1. 使用されているMSP430型番をお教えください。
    2. リセット直後、UCOEはクリア(OFF)になりますが、kkk様のデバッグでもそのようになっておりますでしょうか。
      また、mainの先頭から処理を行い、どのタイミングでUCOEがONとなったか、確認されておりますでしょうか。
    3. MSP430が受信(UCA1RXBUFにデータがセットされた)後、UCA1RXBUFのデータ読み取りの前に送信側からデータが送られていることはないでしょうか。

      オーバーランエラーフラグ(UCOE)は受信バッファ(UCA1RXBUF)が読み出される前に新たにデータを受け取り、受信バッファに格納されるとセットされるフラグになります。
      送信側がMSP430の受信バッファ読み出しを待たずに送り続けることが原因である可能性がございます。

    ご確認のほど、よろしくお願い致します。

    Cruijff

    #2218 返信

    kkk
    参加者

    1.マイコンの型番は「MSP430FR6879」になります。
    2.リセット直後はUCOEはOFFになっています。
     どのタイミングでUCOEがONになったかは確認できていません。
    3.SPI通信の信号波形を確認したところ、MSP430が受信(クロック出力が8クロック出力)後、UCA1RXBUFのデータ読み出しの前に送信 側からデータが送られていますが、1ビットデータを読み出す直前(クロックの立ち下がり直後、設定UCCKPH=0、UCCKPL=1)に  UCA1RXBUFのデータを読み出しています。(添付ファイル参照)
     そのため、新たに8ビットデータを受信する前にUCA1RXBUFのデータを読み出しているので、UCOEはONにならないはず、と考えて
     います。

    #2228 返信
    クライフ
    クライフ
    従業員

    kkk様

    ご確認いただき、ありがとうございます。

    お手数ですが、追加で以下についてもご確認いただけますでしょうか。

    1. eUSCI_A1 受信割り込み以外に割り込み処理を設定しているものはございますか。
      Timer_A0,ADC12,Timer_B0など
    2. 頂きました波形を確認しましたが、このときの波形ではUCOEはセットされておりましたでしょうか。
      セットされる(0->1となる)ときの波形を取得いただくことは可能でしょうか。

    上記2点の質問背景としては、eUSCI_A1の受信割り込みよりも優先度の高い割り込みによって、SPI受信バッファを読み出す処理が遅延される可能性がないか、ご確認いただきたいためでございます。

    データシート(P65~66)では、ベクタテーブルによって上から順に優先度が予め定義されております。

    SPI受信割り込み終了後、eUSCI_A1より優先度が高い割り込みフラグがセットされていると、SPI受信バッファにデータがセットされても、優先度の高い割り込みの処理が先に実行されます。

    念の為eUSCI_A1以上の優先度が高い割り込みが使用されている場合、その割り込み処理を無効化(IE(Ineterrupt Enableビット)を0にする)させても同様にUCOEがセットされるかご確認いただけますでしょうか。

    よろしくお願い致します。

    Cruijff

    #2241 返信

    kkk
    参加者

    1.eUSCI_A1 受信割り込み以外にSPI通信時には下記の割り込み処理を設定しています。
     Timer_B0、Timer_A0、RTC_C

    2.このときの波形ではUCOEがセットされていたか確認していません。
     このときの波形の取得後に、UCA1RXBUFのデータ読み取り直前にブレークをかけると、MSP430が
     受信後(クロック出力が8クロック出力)にブレークがかかり、レジスタの値を確認してUCOEが
     セットされていることをデバッガと波形で確認しました。
     UCOEがセットされるときの波形の取得方法についてですが、タイマによって数μs間隔で割り込み
     をかけて、UCOEを監視およびポート出力を制御する方法で良いのでしょうか。
     他に良い方法があれば教えて頂けないでしょうか。

    また、他の割り込みによる処理の遅延について、上記2.のようにUCA1RXBUFのデータ読み取り直前に
    ブレークをかけて確認した際に、MSP430が受信後にブレークがかかりUCOEがセットされていること
    を確認したため、処理の遅延が無い場合でもUCOEがセットされていると考えています。
    (他の割り込みによる処理時間はSPI通信の8ビット送信時間(128μs)の半分以下なので、割り込み
    による遅延でオーバーランエラーは発生しないだろうとも考えています)

    #2283 返信
    クライフ
    クライフ
    従業員

    kkk様

    割り込みによる処理遅延でのオーバーランエラーフラグの可能性が低い旨、承知致しました。

    恐縮ですが、追加で下記についてお教えいただけますでしょうか。

    1. MSP430(マスター)から通信先デバイス(スレーブ)へなにかしらのコマンドを送信していますでしょうか。
    また送信後、受信バッファ読み出し等の処理は行われておりますでしょうか。

    上記の意図として、
    SPI通信はデータをマスターからスレーブへ送信する過程で、受信シフトレジスタも動作しており、
    送信後、受信バッファに(0xFFまたは0x00の)データが格納されます。
    (受信割り込みフラグもセットされます。)

    そのため、MSP430から送信が完了した後、送信完了割り込み(、または受信完了割り込み)等で受信バッファを読み出す処理がされていない場合、スレーブからのデータ受信時にオーバーランエラーとなります。
    最初の投稿で受信データは問題ない、ということからマスターからの送信時の受信バッファ未処理によるUCOEセットの可能性もございます。

    つきましては、kkk様で設計されたシーケンスでMSP430からスレーブに対してのSPI送信完了後、受信バッファ読み出し等の処理を行っているかご確認ください。

    よろしくお願い致します。

    Cruijff

    #2442 返信

    kkk
    参加者

    返信が遅くなり、申し訳ありませんでした。

    データ要求のためにコマンドを送信しており、その際にオーバーランエラーフラグがONになっていることを確認しました。
    しかし、上記のコマンドを送信後に3バイトデータを受信するのですが、1バイト目の受信バッファデータを読み出すとUCOEがOFFになり、次の2バイト目の受信バッファデータを読み出す直前にはUCOEがONになっていました。
    そのため、データを送信しておらず、データを受信するだけの状態でもUCOEがONになってしまう状況が発生しています。

    どのタイミングでUCOEがONになっているか確認したいのですが、デバッガ(CCS)によってUCOEがONになったタイミングを表示、またはブレークをかけることは可能なのでしょうか。

    #2473 返信
    クライフ
    クライフ
    従業員

    kkk様

    UCOEのフラグはレジスタ「UCA1STATW」のレジスタビット(5bit目)にセットされます。
    UCA1IFGの割り込みサービスルーチンでUCA1STATWの状態をチェックする条件文を記述頂ければ、UCOEのONタイミングが見れるのではないかと考えております。

    例えば、割り込みサービスルーチンに次のようなif条件文を加えると、UCOEがサービスルーチン内でセットされていた場合、条件内処理が実行されます。

    if(UCA1STATW&UCOE)
    {
    /* GPIOのトグル、Timerのカウンタ値を読むなど */
    }

    また、オーバーフロー検出するために、TIが推奨している検出フローがUser’s Guide P.772(30.3.6 Automatic Error Detection)に記載されております。
    合わせてこちらもご参考頂ければ幸いです。

    よろしくお願い致します。
    Cruijff

8件の投稿を表示中 - 1 - 8件目 (全8件中)