勘違い! - PICでSPI - RTC・DS3234SとSDカードがいっしょに使えない
以下なんだかんだと書いていますが、複数のSPIデバイスをいっしょに使う話についてはきむしげさん(きむ茶工房ガレージハウス)の
「SPIマスターにSPIデバイスを複数個接続して見ます」
にソースを含めた詳細な記事があります。きっと私の記事よりずっと参考になると思います。
なお動くのは動くけれども(SDカードの読み書きの)動作が不安定という場合は
「PICでSPI - SDカードの書き込みエラーの話」
が参考になることがあるかもしれません。
私の使っているSDカードアダプタはそもそも単独で使ってもエラーが出ることがわかりました (^^;;
「SDカードでエラーが起きる理由 - PICでSPI」
---------
なんとか動くものができました \(^o^)/
「PIC/I2C大気圧センサーLPS331APの測定値をSDカード(SPI)に記録する - はじめに」
------
RTC・DS3234Sの/CSが何回Lowに落ちているかバイナリカウンタで数えたところ意図した回数より多かったです。どこかで/CSがLowに落ちてしまっているようです。おそらくこれが原因だと思います。具体的にどこでLowに落ちているのか調査中です。
------
「PICでSPI - 超高精度SPIバスRTC(リアルタイムクロック)DS3234Sの使い方」の記事ではRTCの/CSをRA0にしていたのですが今回はRB5に変更しました。これがよくなかったようです。/CSをRA7にしたらあっさり動きました。
きっとPIC初心者がおバカなことをやっていたということだと思うのですが.....
------
超高精度SPIバスRTC(リアルタイムクロック)DS3234Sが使えることは確かめました。
「PICでSPI - 超高精度SPIバスRTC(リアルタイムクロック)DS3234Sの使い方」(ソース付き)
「PICでSPI - 超高精度SPIバスRTC(リアルタイムクロック)DS3234Sの実装」
SPIを使ってSDカードが読み書きできることも確かめました。
「PICでSPI SDカードを読み書きする」
そこで今度はI2Cセンサで取得した気圧や温度を定期的に取得して時刻とともにSDカードに記録するという話になるのですが.....
=====
SDカードはmode 2、RTCはmode 0ということで同じSPIデバイスでも初期化の仕方がちょっと違います。最初ここでつまずくかなあと思っていたのですがこれはなんていうことはないようです。
mode 0からmode 2にするときは
SSP2CON1 |= 0b00010000;
mode 2からmode 0にするときは
SSP2CON1 &= 0b11101111;
とすればいいだけのようです。
そう言えばDS3234Sはデータシートにはmode1/mode3と書いてあったような。mode 0で動いてます。
ただこの二つのデバイスをいっしょに使おうとしたらどうしてもうまく行きません。
# ================ ここから事実誤認が始まります ==============
例えば、
RTC読み込み、SDカード書き込み、RTC読み込み、....
とすると最初のRTC読み込みもSDカード書き込みもちゃんとできるのですがその後のRTC読み込みで読み込んだデータが意味不明なことになってしまいます。
いろいろプログラムを変更したりあちこちのピンのレベルをチェックしたりして「できるだけ簡単なうまくいかない使い方」を探したらこんなケースでうまくいかないことがわかりました。
RTC読み込み、0xFF出力、RTC読み込み、
という場合です。
RTC読み込みのあとでとうぜん/CSはHighに戻しているのでPICから0xFFが出力されても何の影響もないはずですが、実際には何か起きています。
もっとも0xFF出力の前にはmode 2に切り替えていたと思うのでRTCが0xFFとは認識していないような....
最初RTCの/CSが(配線の不良か何かで)Lowに落ちっぱなしではないかと思いました。Lowに落としっぱなしはよくはないのですがそうしておいてもぜんぜん動かないわけではありません。でもプログラムでCSをHighにするとRTCの時刻が取得できなくなりますから/CSはちゃんと機能しているみたいです。
SDカードの読み書きで0XFFが出力されることはいくらでもありそうなので、もういっしょに使うのは諦めました。あんまり精度がよくないのですがI2CのRTC、DS1307+で我慢しようかと思います。
<===== じつは/CSが(理由はまだわからないのですが)意図しないときLowに落ちてました。この0xFFを送ると異常が発生するというのも/CSを確認したところLowに落ちているときでした。
----
でもあきらめきれないわけで....
きむしげさん(きむ茶工房ガレージハウス)のSDカードライブラリを眺めていたらSDカードの場合/CSをLowに落としたあと最初に0xFFを送信していました。
コメントを拝見したら「確実にCSを切替える為にクロックを送信しておく」とありました。
だったら0x00でも0x7Fでもなんでもいいだろうとものは試しとやってみました。
そしたらRTCからデータを取得できるようにはなったのですが、SDカード初期化でエラーが起きるようになりました (^^;;
いつも勘違いやら計算間違いで記事の訂正ばっかりしているのですが、これに関しては「あれ、私の勘違いでした。動きました!」という訂正記事を書いてみたいものです。
<===== 訂正記事を書くことになりました (^^;;
現在の実験風景
A. PIC18F26K22
B. 74HC4066(同じアドレスのI2Cデバイスを使うため)
C. ACM1602(I2C接続LCD)
D. SDカード(とそのソケット)
E. DS3234S(RTC)
F. RTCバックアップ用リチウム電池
SDカードを使うというのは持ち歩くのが前提なわけでこれら(+大気圧センサーとか温度センサー....)をどうケースに収めるかが問題です。
----
関連
趣味の電子工作
PIC
「PICでSPI SDカードを読み書きする」
「PICでSPI - 超高精度SPIバスRTC(リアルタイムクロック)DS3234Sの使い方」(ソース付き)
「PICでSPI - 超高精度SPIバスRTC(リアルタイムクロック)DS3234Sの実装」
「PICでI2C - リアルタイムクロック(RTC) DS1307+の使い方」
「PICでI2C - 大気圧・温度センサーLPS331APの使い方」
「温度センサー3種の精度比較(摂氏0度~40度編)」
« 決定された流星の実経路をSVGで地図にプロットする | トップページ | カノープスと周辺の星 »
「趣味の電子工作」カテゴリの記事
- 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)
この記事へのコメントは終了しました。
コメント