PIC解説

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

投稿日:

今回は 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 についてはこちらの記事も参考にどうぞ。

【PIC】SPI通信のやり方

 

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

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

関連記事

PICでUSARTに四苦八苦

今回はパソコンとのシリアル通信に挑戦しましたがなかなか苦労しました。最初に結論だけ言うと、 マイコンの TX は相手の RX に、RX は TX に! 逆に接続するよ! ってことでした。それでは本文↓ …

PIC超入門!ゼロからLチカまでの道【その2:プロジェクト作成~プロパティ設定】

前回 MPLAB X IDE を導入したので、今回はプロジェクトの作成から説明していきます。 前回の記事はこちら PIC超入門!ゼロからLチカまでの道【その1:部品購入~IDE導入】 目次1 プロジェ …

【PIC】LCD 1602の使い方

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

【PIC】SPI通信のやり方

多くの PIC に搭載されている MSSPモジュールを使うと I2C と SPI の2つのシリアル通信を行うことができます。 今回は SPI通信のやり方(マスター)を紹介します。 I2C についてはこ …

【PIC】I2CでLCDに文字を表示する

前回の記事で I2C通信を制御するライブラリを作成したので、今回はそれを使って LCD に文字を表示させてみたいと思います。 前回の記事はこちら↓ 【PIC】I2C通信のやり方 目次1 LCD2 接続 …