メディア

SPI通信などのノイズ対策や、誤動作への対処法Q&Aで学ぶマイコン講座(90)(3/3 ページ)

» 2024年03月15日 11時00分 公開
[STマイクロエレクトロニクスSTマイクロエレクトロニクス]
前のページへ 1|2|3       

ソフトウェアの対処法

(1)エラー検出

 例えば、クロックラインにノイズが乗って、クロックが1発多く入力されると、通信機能の入力バッファーのシフターがデータを1ビット余分に受信してシフトします。その後、正常なクロックが入力され、最終的に最初のビットを消して、異常値を受信してしまいます。図4は、ノイズによってD4を2回受信して、D0がシフトアウトされ欠落する例ですが、この他にも受信データの変化点でノイズが入ると、異常値を受信することが考えられます。このように、ノイズが入るタイミングによってさまざまなエラーパターンが想定されます。いずれの場合も、結果的に受信データは異常になります。受信データの異常は、パリティチェックやCRCを使うと検出することができます。また、クロックが正常よりも多く入力されるとオーバーランが検出されるため、ソフトウェアでエラーを検出し、再送するように送信側に依頼します。

<strong>図4:ノイズ起因のエラー例</strong> 図4:ノイズ起因のエラー例[クリックで拡大]

 STM32L5x2マイコンのSPIには、オーバーランフラグOVRやCRCエラーフラグCRCERRがあるので、それらのフラグをチェックすることで検出可能です。

 CRCチェックでは、まずSPIx_CR1 レジスタの CRCEN ビットをセットし、CRCを有効にします。

 受信が始まると、シフトレジスタに受信された値のCRCを計算し、同時に送られてくるCRC の値と一致しなかった場合、CRCERRフラグがセットされるのでCRCエラーを検出できます。

 クロックラインにノイズが乗って、クロックが1発多く入力される事象以外でも、通信中に発生したエラーはSPIエラーフラグを使って検出できます。オーバーランやCRCエラーの他にも、モードフォールトやフォーマットエラーといったエラーがあります。いずれもERRIEビットをセットしておくことでSPI割り込みが発生し、検出できます。

(2)通信機能のリセット

 データの再送で解決できる程度の軽いエラーであれば回復は簡単ですが、通信モジュール自体が回復不能な状態に陥った場合、モジュール自体の初期化が必要です。一番簡単な初期化方法は、マイコン全体をソフトウェアでリセットすることです。しかし、それでは正常に動作していた他の機能も初期化されてしまい、システムに支障をきたします。

 例えば、SPIを初期化するには、入力バッファーをクリアにして各レジスタを初期値に戻すか、当初の設定に戻してSPIを再起動する必要があります。

 STM32L5x2マイコンには、ペリフェラルリセットレジスタという周辺機能を個別に初期化できるレジスタがあります。

 例えば、ペリフェラルリセットレジスタ 1(RCC_APB1RSTR1)のビット15「SPI3RST」を1に設定すると、SPI3の機能が初期状態に戻ります。SPI2であればビット14「SPI2RST」です。SPI1であればペリフェラルリセットレジスタ2(RCC_APB2RSTR)のビット12「SPI1RST」です。

 これらのビットを1にした後、SPIの初期化ルーティンへ飛んでいき、SPIを再設定するとSPIは復活します。もともと、初期化ルーティンの中にペリフェラルリセットレジスタを設定するコードを入れておくと、周辺機能のエラー時に初期化ルーティンを実行するだけで、SPIを復活させることができます。こうすれば、エラー時の処理専用ルーティンと兼用できます。

 STM32L5x2マイコンを含むSTM32ファミリー*4)の製品は、HAL(ハードウェア抽象化レイヤー)を使ってプログラムを作りますが、HALには、

HAL_<ペリフェラル名>_Init()


 という関数が準備されています。これを呼び出すことで周辺機能の初期化を簡単に行うことができます。

(*4)STM32ファミリー

⇒次の記事を読む

Q&Aで学ぶマイコン講座:過去の質問一覧はこちら

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSフィード

公式SNS

EDN 海外ネットワーク

All material on this site Copyright © ITmedia, Inc. All Rights Reserved.
This site contains articles under license from AspenCore LLC.