SPI接続でSDカードとMCP3208がいっしょに使えない話
複数のSPIデバイスをいっしょに使う話についてはきむしげさん(きむ茶工房ガレージハウス)の
「SPIマスターにSPIデバイスを複数個接続して見ます」
にソースを含めた詳細な記事があります。きっと私の記事よりずっと参考になると思います。
なお動くのは動くけれども(SDカードの読み書きの)動作が不安定という場合はひょっとしたら
「PICでSPI - SDカードの書き込みエラーの話」
が参考になることがあるかもしれません。また私の使っているSDカードアダプタはそもそも単独で使ってもエラーが出ることがわかりました (^^;;
「SDカードでエラーが起きる理由 - PICでSPI」
---------
前記事「SPI接続でトラブル! 三つのデバイスが使えない」の続きです。SPI接続で複数のデバイスを接続するという話の“解決編”です。
この記事は最初に後半部分を書いてその後前半部分を書いているのですが、今朝起きて昨夜仕込んでいた測定結果を見ようと思ったら測定データがどこにもありませんでした (T_T)
まだ未解決の模様です (^^;;
=====>
原因/理由がはっきりしないのですが、暫定対応(?)で動くようにはなりました。
「自記温度計、自記気圧計 - 複数のSPIデバイスがいっしょに使えなかった話」
<== いちばん最後に書いてある方法で解決しました。その後問題なく動作しています)
-------
(ここが前半部分)
以下いろいろ書いていますが、読まない方がいいです (^^;;
この記事についてきむしげさん(きむ茶工房ガレージハウス)からコメントをいただきました。
通常SPIはCS信号でOUT信号を駆動・解放を行うのですが、
MCP3208は解放していないって事なのかな?
なら一度MCP3208のCS信号をON/OFFしたら解放しないでしょうか?
なるほど、そう言えばこれまでおまじない的に何かしないとまともに動作しないデバイスもありました。
さっそくやってみました。SDカードの初期化をする前に一度MCP3208のデータを読んでみることにしました。
そうしたら..... 動きました!
つまり今は以下に書いた2.7kΩなしでちゃんと動いています。
いちおう自分の名誉(?)のために書いておくとこれに関する記述はデータシートにはなさそうです(ちょっと自信をなくしています書いてあるけれど見つけられないだけかもしれません)
CS/SHDN ピンは、Low 時にデバイスとの通信を開始し、High 時に変換を終了してデバイスを低電力の待機状態にするために使用されます。変換と変換の間はCS/SHDN ピンをHigh にしておくことが必要です。
あるいは
CS ピンがLow の時にデバイスの電源が入れられた場合、通信を開始するにはHigh にしてからLow に戻すことが必要です。
どちらも当たり前の話で今回の“トラブル”とは違うことだと思います。
いずれにしてもお騒がせしました。すみませんでした m(._.)m
=====
(ここが後半部分)
SPIに関するところだけ取り出すと要するにこういう回路だとSDカードの読み書きでエラーが起きるというお話でした。
なおSDカードのところのプルアップ抵抗はSDカードスロットのボードについているものです。必要ないような気もするのですが....
この回路だとSDカードの読み書きができませんがMCP3208をはずすと正常に読み書きできるようになります。
もちろん基本的なところはチェックしました。電源電圧は正常かとか。ピッタリ3.3Vを示しており交流分も(DMMで見る限りは)なさそうです。こんなのDMMの交流レンジで見てもしようがないような気がしますがオシロスコープを持ってないので。
パスコンの入れ忘れもないようです。
IN、OUT、CLKの三つに「24ビットバイナリーカウンター(12STAGEリップルキャリー・バイナリー・カウンター 」で作ったバイナリカウンターを接続してみます。
どんどんカウントされるので信号をやりとりしようとはしているようです。
おそらくどこかにHighの電圧が低すぎるとかLowの電圧が高すぎるというところがあるのでしょう。
そこでこんなチェックをしました。
図の“×”を付けてあるところを一つづつ切り離しSDカードの読み書きができるようになるか確かめます。
複数の入力に分岐していくのでドライブできるか心配していたINもCLKも関係ありませんでした。そしてOUTを切り離すとSDカードの読み書きができるようになりました。
ここがあやしいのはわかったわけですがどうしたらいいかわかりません。OUTは信号がかち合わないように/CSがHighにあるときはZ(ハイインピーダンス)になっているように思えます。
要するに使われないときは接続されていないのと同じことだと思うのですがそうではないようです。
/CSがちゃんとHighになっていない、なんてことも考えて確認してみたのですが使用していないときはほとんどVDDと同じ電圧になっていました。
どう考えてもここが問題になるはずがないと思われるところが問題になっているわけで手のうちようがありません。プルアップしたりプルダウンしたりしてみたのですが状況に変化はありません(正確に書くとSDカードライブラリーで起きるエラーコードは変化しました。プルアップで状況は悪化、プルダウンだと多少改善したように見えるがやっぱり動かないという状況です)
そこでやけっぱちでこんなことをしてみました。
MCP3208のDOUTとバスラインの間に1KΩの抵抗を入れてみました。気持ちとしてはMCP3208がつながっているようなつながっていないような状態を作ろうということです。
そうしたら見事に動きました \(^o^)/
データばデジタルですから動きさえすれば測定精度には影響ないでしょう。問題はこの抵抗の抵抗値をどうするかです。
試しにいろいろ変えてやってみました。
OKと書いたのはSDカードの読み書きもADコンバータMCP3208のデータも取得できたとものです。
10kΩ NG、5kΩ OK、1kΩ OK、500Ω OK、300Ω NG
だいたい500Ωから5kΩであればよさそうです。
この抵抗が小さくなると直接つないだのと同じですからSDカードの読み書きができなくなります。また大きくなると切り離されたのと同じことなのでSDカードの読み書きはできてもMCP3208のデータは取得できなくなります。
とすれば中間くらいの値がいいだろうということで2.7kΩにしました。
ということで今は元気に動作しています (^^)
ところでSPIバスのプルアップ抵抗ってほんとうに要るんでしょうか。入れたら動作が安定したという記事も見かけたのですが。
このことについてもきむしげさん(きむ茶工房ガレージハウス)からコメントをいただきました。
SDはIN、OUTのアイドル状態はHighレベルです、規格によると
端子は50k~100kΩでプルアップを推奨しているみたいですね、
でもフローティング状態にならなければ良いと思いますが....
とのことです。
-------
関連記事
「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 - 実装」
関連記事リスト
趣味の電子工作
PIC
« 2015年2月10日、今日のラブジョイ彗星の位置 | トップページ | ラブジョイ彗星・2015年2月11日(~2月28日)の位置(数値データ付き) »
「趣味の電子工作」カテゴリの記事
- 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)
コメント
この記事へのコメントは終了しました。
« 2015年2月10日、今日のラブジョイ彗星の位置 | トップページ | ラブジョイ彗星・2015年2月11日(~2月28日)の位置(数値データ付き) »
動作おめでとうございます。
通常SPIはCS信号でOUT信号を駆動・解放を行うのですが、
MCP3208は解放していないって事なのかな?
なら一度MCP3208のCS信号をON/OFFしたら解放しないでしょうか?
SDはIN、OUTのアイドル状態はHighレベルです、規格によると
端子は50k~100kΩでプルアップを推奨しているみたいですね、
でもフローティング状態にならなければ良いと思いますが....
投稿: きむしげ | 2015年2月11日 (水) 19時34分
なるほど一度ON/OFFですか。考えてもみませんでした。
空読みするということでいいんでしょうね。
訂正記事の用意をしておいた方がいいような気もしてきました (^^;;
プルアップも必要なんですか。抵抗値からするとI2Cとは意味合いが違いそうですね。
いつもいつもありがとうございます m(._.)m
投稿: セッピーナ | 2015年2月11日 (水) 19時44分