PIC解説

【PIC】ぷちFatFsでmicroSDカードと通信する

投稿日:2020-09-07 更新日:

今回はPICでmicroSDカードを使用する方法を紹介します。なお、microSDじゃなくて普通のSDカードでも同様にできるはずです。

以下microSDカードも含めてSDカードと呼ぶことにします。SDカードのメリットとして大量のデータを保存できることと、PCからも簡単にアクセスできることが挙げられます。

 

ぷちFatFsについて

SDカードとの通信プログラムを最初から作るのはとても大変ですが、ありがたいことに、SDカードを簡単に扱うことのできるライブラリが公開されています。ChaN氏のFatFs、そしてそこから機能を限定して縮小したぷちFatFsです。

これらのライブラリはSDカードと直接やり取りする下位レイヤとアプリケーションの上位レイヤに分かれています。

そのため、使用するデバイスに合わせて下位レイヤの関数を作ればアプリケーションではデバイスに依存せず使用できるという特徴があります。

デバイスごとのサンプルプログラムも用意されているのでそれをベースに自分の環境に合わせてカスタマイズします。

ぷちFatFsは機能が制限されているのですが、ファイルの読み書きやブラウズといったことはできるので、基本的にはこちらで十分かと思います。

 

ライブラリの入手

ChaN氏のぷちFatFs のページ下部にある Resources>Downroad:Petit FatFs R0.03a (2020年9月現在)をクリックしてzipファイルをダウンロードして解凍します。

解凍したファイルの内、diskio.c が先程紹介した下位レイヤの関数になっていて、中身は空っぽです。

ライブラリを使用するためにはこのファイルに disk_initialize(), disk_readp(), disk_writep() の3つの関数を記述する必要があります。

そのベースとなるサンプルプログラムも先程のライブラリのすぐ下でダウンロードできます。

※今回PIC16F18857に合わせて作成した diskio.c はこちらです。これをそのまま使用もしくは改造してもらって構いません。(開いたページでCtrl + sで保存できると思います)

SPIの設定

SDカードとの通信にはSPIが使われます。SPIについてはこちらの記事も参考にどうぞ。https://rikeden.net/?p=356

 

ChaN氏の How to Use MMC/SDCAbout SPI を参考にSPIの設定を行います。SPIのモードは0または3と書かれているのですが、私が試したところ上手くいきませんでした。

そして理由はよく分かりませんが、モード2(Idle High/ Transmit on transition from active to Idle)で上手くいきました。SDカードとの通信が上手くいかない場合はSPIの設定をいろいろ試してみると良いかもしれません。

 

diskio.cの作成

ぷちFatFsを利用するためには diskio.c を完成させる必要があります。

まずはサンプルプログラムを見てみます。

しかし、ダウンロードしたサンプルのPICのフォルダを見てみると、diskio.c が見当たりません。

ファイルの中身を覗いてみた結果、pic24_mmcp.c にその内容が書かれていました。

これを diskio.c としてプロジェクトにインポートして修正を加えていきました。L11~L47はデバイスに依存する部分なのでここを修正していきます。

修正点は以下の通りです。

  1. インクルードファイルの変更
  2. CSピンの変更
  3. UART関連の削除
  4. SPI関連の関数の変更
  5. 遅延関数の変更

修正後のプログラムはこのようになりました。

それに加えて、FORWARD() が使用されていたL220をコメントアウトしておきます。

 

続いて send_cmd() を修正する必要があります。この関数の中で再帰呼出しを行っている部分があるのですが、XC8では再帰呼出しできないので、これを修正します。

send_cmd()_send_cmd() に変更して新しく send_cmd() を作り、その中で _send_cmd() を2回呼ぶことにしました。

こんがらがりそうですが、実際に見てもらった方が早いと思います。

 

これで diskio.c は完成ですが、最後に pffconf.h の設定をしなければいけません。

pffconf.h のL12からの部分で使用する関数を設定できます。

ただでさえ機能が限定されたぷちFatFsの中でさらに不要な関数は取り除いてコードサイズを小さくできるというわけです。

今回は lseekwrite は使用しないので以下のようにしました。

 

接続

続いてSDカードの接続方法を紹介します。

今回は秋月電子で販売されているmicroSDカードDIP化キットを使用しました。SDカードをSPIで接続する場合の接続方法はこのようになっています。

microSDpinout

気を付けなければならない点は、SDカードの電源は 3.3V であるということです。5VをかけるとSDカードが破損する可能性があるので気を付けましょう。

また、DO (MISO) のラインにはプルアップ抵抗が必要な場合があるそうです。

 

アプリケーション

ぷちFatFsのライブラリの利用準備が整ったので、その使い方を見ていきましょう。

まずは pff.h, pffconf.h, diskio.h, pff.c, diskio.c をプロジェクトにインポートしますが、main.c からインクルードするのは pff.h だけで大丈夫です。SDカードを操作する関数については、ぷちFatFs のページに詳しく書いてありますし、直感的で分かりやすいので割愛します。

 

SDカードのルートディレクトリに ”Hello World” という内容の text.txt を作成しておきました。今回はこのファイルの内容を読み取ってLCDに表示させてみたいと思います。

ただし、ファイル名は8.3形式で扱われるので、プログラム中では TEXT.TXT と大文字になっています。ファイル名は9字以上だとルールに従って省略されるので注意してください。

 

プログラムは以下の通りです。ちなみにデバッグ用としてエラーの内容を表示する die() 関数を用意しています。

I2Cライブラリ

LCDライブラリ

ぷちFatFsライブラリ

pff.h / pffconf.h / diskio.h / pff.c / diskio.c

回路図

Schematic

 

きちんとSDカードの中身を読み取ることができました。

 

今回の記事は以上となります。ご覧いただきありがとうございました。

-PIC解説

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

PICでカラーLCDモジュールを動かしてみた話【ST7789】

今回は以前にAmazonで購入したまま積んでいた フルカラーグラフィックLCDをPICで制御してみました。 激ムズというわけではありませんでしたが、いくつかつまずいたポイントがあったので備忘録がてら記 …

【PIC】I2Cでセンサーの値を読み取る

電子工作といえば色々なセンサーを使ってみたいですよね。 温度・湿度センサーや加速度センサー、ジェスチャーセンサーなんてものもあります。多くのセンサーはI2C通信で扱えるので一つやり方を覚えてしまえば色 …

【PIC】I2C通信のやり方

マイコンでLチカが出来たら次はLCDに文字を表示したり、色々なセンサーを扱いたいですよね。今回はマイコンと周辺機器の通信によく使われるI2C通信のやり方をちょっとだけ詳しく解説していきます。 目次1 …

PIC超入門!ゼロからLチカまでの道【その3:コンフィギュレーション~プログラミング】

前回プロジェクトを作成して設定まで終わったのでいよいよプログラミングに入ります。PICの第一の関門であるコンフィギュレーションも順を追ってやっていけば簡単にできます。 前回の記事はこちらhttps:/ …

【PIC】LCD 1602の使い方

今回はパラレル接続のキャラクタLCDの使い方を紹介します。 タイトルに1602とついていますが、キャラクタLCDの制御ICは大抵同じものなので、文字数の違うものだったり、メーカーの違うものであっても同 …