« 決定された流星の実経路をSVGで地図にプロットする | トップページ | カノープスと周辺の星 »

2014年12月19日 (金)

勘違い! - 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カード初期化でエラーが起きるようになりました (^^;;

いつも勘違いやら計算間違いで記事の訂正ばっかりしているのですが、これに関しては「あれ、私の勘違いでした。動きました!」という訂正記事を書いてみたいものです。

  <===== 訂正記事を書くことになりました (^^;;

現在の実験風景
Imgp1259800

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でSPI - RTC・DS3234SとSDカードがいっしょに使えない:

« 決定された流星の実経路をSVGで地図にプロットする | トップページ | カノープスと周辺の星 »

フォト

サイト内検索

  • 記事を探されるんでしたらこれがいちばん早くて確実です。私も使ってます (^^;; 検索窓が表示されるのにちょっと時間がかかるのはどうにかしてほしいです。

新着記事

リンク元別アクセス数

  • (アクセス元≒リンク元、原則PCのみ・ドメイン別、サイト内等除く)

人気記事ランキング

  • (原則PCのみ、直近2週間)
無料ブログはココログ