PICでSPI - SDカードの書き込みエラーの話
以前から頭を悩ましていた測定データをSDカードに記録するときエラーが起きる話ですが、完全に解決したように思えます。
ただ“鰯の頭も信心から”的な話ですので眉に唾をつけて読んだ方がいい記事です。
------
なお複数のSPIデバイスをいっしょに使う話についてはきむしげさん(きむ茶工房ガレージハウス)の
「SPIマスターにSPIデバイスを複数個接続して見ます」
にソースを含めた詳細な記事があります。きっと私の記事よりずっと参考になると思います。また私の使っているSDカードアダプタはそもそも単独で使ってもエラーが出ることがわかりました (^^;;
「SDカードでエラーが起きる理由 - PICでSPI」
=======
これまでの経緯
SDカード単独で使うと問題ないのですがADコンバータやRTCといった他のSPIデバイスといっしょに使うとエラーが発生しました。
「SPI接続でトラブル! 三つのデバイスが使えない」
複数のSPIデバイスの間の干渉と考え対策をとりました。
「SPI接続でSDカードとMCP3208がいっしょに使えない話」
「「自記温度計、自記気圧計 - 複数のSPIデバイスがいっしょに使えなかった話」
一応の解決を見たわけですが、その後まだエラーが発生することがあります。特に10MHzを超える信号を近くで扱っているとエラーの発生確率(?)が高まります。
複数デバイスを使う話と関係あるのかないのかわからないのですがどうやらSDカードの入出力は高周波ノイズに弱いようです。
ノイズ対策ということでこんなことをしてみました。
SDカードソケットのある基板を挟み込むようにシールド版を入れました。
(「PIC+SPI+I2C 自記温湿度計+気圧計+8ch電圧計+周波数カウンタ(技術要素一覧)」に“全体像”があるので見比べていただくと違いがよくわかります)
下の方から(上の写真だと右の方から)見た写真です。
シールド板(シールドケース)はアルミ板(できれば銅板)でちゃんとしたものを作ればいいのですがめんどうですし材料もないのでかなり手抜きです。
プラ板2枚で台所にあったアルミホイルを重ねたものをサンドイッチにしています。
こんなのでほんとうに効果あるのかと思われそうですがちゃんと役目を果たしているようです。
これまでならぜったいエラーが起きると思われる“環境“でも問題なく動作するようになりました。さらに“悪い環境”にしたらSDカードの書き込みではまったくエラーは起きないもののADコンバータがまともな数値を示さなくなり気温が50℃とかなってしまいました (^^;;
タワー全体をシールドケースに入れる、というのが正解みたいです。
------
ところで最初のSPIデバイス同士の干渉と思われる現象ですが、きむしげさん(きむ茶工房ガレージハウス)の話(「きむ茶工房ガレージハウスの掲示板」)によると
SDはSSで切り変えるのでなくSS後のCKを送った後切り替えるので、DOUTがかち合う場合が有りそうな時が有る......
のだそうです。とすると私はちょっとまとはずれな対応をとっていたのかもしれません。回路をもとに戻しプログラムを見なおして試してみればはっきりするのですがもうその気力がなくて....
-------
関連記事
「記事一覧(測定、電子工作、天文計算)」
「趣味の電子工作」
「PIC」
「趣味の実験」
「趣味の気象観測」
「PIC+SPI+I2C 自記温湿度計+気圧計+8ch電圧計+周波数カウンタ(技術要素一覧)」
「PIC+SPI+I2C 自記温湿度計+気圧計+8ch電圧計のソース - main()」
「PICでSPI SDカードを読み書きする」
「PICでSPI - 超高精度SPIバスRTC(リアルタイムクロック)DS3234Sの使い方」
「PIC18F26K22でSPI - 8ch/ADコンバータ MCP3208の使い方(ソース付き)」
「PIC/I2C大気圧センサーLPS331APの測定値をSDカード(SPI)に記録する - はじめに」
「PIC/I2C大気圧センサーLPS331APの測定値をSDカード(SPI)に記録する - 実装編」
「I2C/SPI大気圧センサーLPS25Hの使い方 - 1 - 実装」
« I2C薄型液晶ディスプレイ(LCD)・AQM1602XAの使い方 | トップページ | ADコンバータでマイナスの電圧を測定する方法 »
「趣味の電子工作」カテゴリの記事
- PICで作る100MHz周波数カウンタ検証用XOR(エクスクルーシブオア)逓倍器(2016.03.08)
- 150MHz(~200MHz?)周波数カウンター用プリスケーラー(1/4分周器)(2016.03.06)
- 測温抵抗体(Pt100、白金薄膜温度センサー)の抵抗値を温度に変換する(平方根を使わない)計算式(2016.03.01)
- GPS/JJY(標準電波)を基準周波数源とするためのPLLの詳細(2016.02.27)
- GPS受信モジュール1PPS対決 - GE-612T vs GM-5157A(2016.02.21)
コメント
この記事へのコメントは終了しました。
« I2C薄型液晶ディスプレイ(LCD)・AQM1602XAの使い方 | トップページ | ADコンバータでマイナスの電圧を測定する方法 »
本題と関係なくてすみません、建設中の第2タワーで笑いました^^。
投稿: ほよほよ | 2015年4月 2日 (木) 12時19分
第二タワーはほよほよ式正弦波発生器、自動平衡ブリッジ、ベクトル電圧計、アナログスイッチ、16bitADコンバータからなるインテリジェントビルになる予定です (^^)
投稿: セッピーナ | 2015年4月 2日 (木) 13時24分
こんにちは
MCP3208手に入ったので実験してみました。
SDとMCP3208を配線してSDのファイルを読み出す事を行いました、
SD初期化エラー出ちゃいました。
が、プログラムの初期化時にSDとMCP3208のSS信号をHIGHにした後、
SPI_Init(SPI_MODE2,SPI_CLOCK_DIV16,16) ;
ans = SD_Init() ;
を行ったら動作したので、
SDとMCP3208から1秒毎に交互に読み出すプログラムにして
行いました、動作しています、この記事は後日作成してUPします。
投稿: きむしげ | 2015年4月 5日 (日) 12時27分
わざわざお知らせいただきありがとうございます m(._.)m
訂正記事を用意しならが記事をお待ちすることにします (^^;;
私の方はSDカードの基板をシールドしてからエラーがまったく起きなくなりました。
どうもハード的な問題が最初からあってソフト的な問題とごっちゃになってわけが分からなくなっていたのかもしてません。
投稿: セッピーナ | 2015年4月 5日 (日) 14時49分