フォト
2019年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
無料ブログはココログ

« arduinoで安価にテレビに映像を出力する | トップページ | 最近のNHK語学番組は学習環境が充実しています »

2014年3月16日 (日)

ArduinoでSPIシリアルフラッシュメモリW25Q64を使ってみる(1)

Arduinoで容量の大きい外付けメモリを使いたいと思い、色々と調べて
SPI接続の8Mバイトのフラッシュメモリが使えるそうなので試してみました。

試した製品は、WINBOND製のW25Q64BVAIGという製品です。
パソコンのBIOSにも使われている製品のようです。

結論を先に言うと使えます。これはいいですよ。
8Mバイトも容量があると、グラフィックLCDでサイズ違いの日本語フォントが
同時に使えますね。

今回試した製品ですが、こんか感じです。

Dscn2484

8ピンDIP形式 3.3V駆動のSPIバス接続のフラッシュメモリです。
いつものごとくAliexpressで購入しました。10個で送料込みで$12.5でした。

3.3Vなので通常のArduinoでの利用はレベルシフタ等が必要ですが、私のUNOは
3.3Vも利用できるので問題なしです。

回路はこんな感じでシンプルです。

Dscn2481

01

さて、このメモリを使うプログラムですが、Arduinoで使っているサンプルがどこにも
ありません。仕方がないのでデータシートを見て自作しました。

フラッシュメモリはEEPROMと違いちょっと操作が面倒です。
ブロック、セクター、ページ等の単位出てきます。書込みがちょっと厄介です。

作成途中ですが取りあえず動いたので、公開します。
ここからダウンロードできます。指定セクタ内の任意アドレスにデータを書き込めます。
読込はリニアなアドレス指定で参照できます。

ダウンロード W25Q64.ino (11.7K)

シリアルモニタで動作確認をするとこんな感じです。

03



2016/05/23 追記

GitHubにてライブラリを公開しました。
https://github.com/Tamakichi/Arduino-W25Q64



« arduinoで安価にテレビに映像を出力する | トップページ | 最近のNHK語学番組は学習環境が充実しています »

arduino」カテゴリの記事

AVR」カテゴリの記事

コメント

初めまして、Tomと申します。
現在、Arduinoで遊びだしてから、約1週間になります。
先般修理した、NotePCのBIOS用フラッシュメモリ(W25Q64)からデータを読み出したいと思い、ここにたどり着きました。
上記、サンプルスケッチ(ダウンロード W25Q64.ino (11.7K))の中で、データの読み出しだけを行うためには、どこからどこまでのエリアを使用すればよろしいのでしょうか?

まだ、Arduinoを使用したばかりで、勉強不足です。
どうかご教示願います。

Tom

Tomさん

サンプルスケッチ(ダウンロード W25Q64.ino (11.7K))よりも、
GitHubで公開している「Arduino用 SPI接続フラッシュメモリW25Q64ライブラリ」のサンプルソース
の方が分かり易いと思います(コメントで説明を付けています)。そちらを参照して下さい。

公開ページ
https://github.com/Tamakichi/Arduino-W25Q64

ライブラリ添付のサンプルソース
https://github.com/Tamakichi/Arduino-W25Q64/blob/master/W25Q64/examples/sample/sample.ino

サンプルソースの読み出しは次のような感じになっています。


// データの読み込み(アドレス0から256バイト取得)
memset(buf,0,256);
n = W25Q64_read(0,buf, 256);
Serial.print("Read Data: n=");
Serial.println(n,DEC);
dump(buf,256);

// 高速データの読み込み(アドレス0から256バイト取得)
memset(buf,0,256);
n = W25Q64_fastread(0,buf, 256);
Serial.print("Fast Read Data: n=");
Serial.println(n,DEC);
dump(buf,256);

サンプルのsetup()の初期化処理の記述と
上記のW25Q64_read()またはW25Q64_fastread()でいけると思います。

たま吉さん

アドバイスありがとうございました。
今後も、何かありましたら、ご教示ください。

Tom

たま吉さん,
初めまして、wasaと申します。
”Hello world” 等文字列の書き込み及び読み取りしたいですが、
教えてください。
よろしくお願いします

wasaさん

先頭にアドレス(0)に"Hello world"への書き込みは次のような感じです。
(動作確認環境が用意出来ないため、コンパイルおよび動作確認は行っていません)

char str[] = "Hello world";
W25Q64_eraseSector(0,true);
W25Q64_pageWrite(0, 0, str, strlen(str)+1);

読み出し
char buf[16];
W25Q64_read(0,buf, 16);

関数の使い方については、ライブラリのソースおよびサンプルソースを参照してください。

たま吉さん

アドバイスありがとうございました。
動作確認できた。
wasa

たま吉さま

W25Q64のライブラリ、大変便利で勉強になっています。


現在、W25Q64をTFT-LCDにくっつけて、東雲フォント等を書き込もうと苦戦中です。
最新のライブラリのhttps://github.com/Tamakichi/Arduino-W25Q64 を見ていて、疑問に思ったので質問します。アドバイス頂ければ幸いです。

●W25Q64_pageWrite()の中に
if (W25Q64_IsBusy()) {
return 0;
}
と記述がありますが、書き込み後の
 while(W25Q64_IsBusy()) ;

されずに、あえてreturn 0;とされている理由をご教授頂けないでしょうか?

●W25Q64_pageWrite()の引数にbyte n を使われていますが、unsinged int にしないで256バイト書けないような気がしますが、いかがでしょうか。

RockSolidHead さん


●1
あまり深い意味はないのですが、
書き込み要求前に、Busyが発生したこを知りたいためです。
通常は、このタイミングで発生しないと思います。

while(W25Q64_IsBusy()) ;
でも問題ないと思います。

●2
お恥ずかしい.. ご指摘の通りです。

byte型だと0~255なので、256は指定出来ませんね。
ご指摘ありがとうございます。

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: ArduinoでSPIシリアルフラッシュメモリW25Q64を使ってみる(1):

« arduinoで安価にテレビに映像を出力する | トップページ | 最近のNHK語学番組は学習環境が充実しています »