ArduinoでSPIシリアルフラッシュメモリW25Q64を使ってみる(1)
Arduinoで容量の大きい外付けメモリを使いたいと思い、色々と調べて
SPI接続の8Mバイトのフラッシュメモリが使えるそうなので試してみました。
試した製品は、WINBOND製のW25Q64BVAIGという製品です。
パソコンのBIOSにも使われている製品のようです。
結論を先に言うと使えます。これはいいですよ。
8Mバイトも容量があると、グラフィックLCDでサイズ違いの日本語フォントが
同時に使えますね。
今回試した製品ですが、こんか感じです。
8ピンDIP形式 3.3V駆動のSPIバス接続のフラッシュメモリです。
いつものごとくAliexpressで購入しました。10個で送料込みで$12.5でした。
3.3Vなので通常のArduinoでの利用はレベルシフタ等が必要ですが、私のUNOは
3.3Vも利用できるので問題なしです。
回路はこんな感じでシンプルです。
さて、このメモリを使うプログラムですが、Arduinoで使っているサンプルがどこにも
ありません。仕方がないのでデータシートを見て自作しました。
フラッシュメモリはEEPROMと違いちょっと操作が面倒です。
ブロック、セクター、ページ等の単位出てきます。書込みがちょっと厄介です。
作成途中ですが取りあえず動いたので、公開します。
ここからダウンロードできます。指定セクタ内の任意アドレスにデータを書き込めます。
読込はリニアなアドレス指定で参照できます。
シリアルモニタで動作確認をするとこんな感じです。

2016/05/23 追記
GitHubにてライブラリを公開しました。
https://github.com/Tamakichi/Arduino-W25Q64
« arduinoで安価にテレビに映像を出力する | トップページ | 最近のNHK語学番組は学習環境が充実しています »
「arduino」カテゴリの記事
- Freenove Mecanum ホイール カー キットを購入しました(2025.05.28)
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Zorin OSでArduino Uno互換機(CH340)が認識しない(2025.01.19)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- Arduino用 SKK日本語変換ライブラリの開発 その1(2024.12.28)
「AVR」カテゴリの記事
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
- Arduino用SJIS漢字フォントライブラリ SDカード版を作成しました(2018.10.30)
- ATtiny13AでI2C接続キャラクタLCDを利用する(4)(2018.04.16)
- ATtiny13Aで赤外線リモコン受信センサーを使う(2)(2018.04.15)
- ATtiny13AでHC-SR04を使った距離計測(2018.04.14)
コメント
« arduinoで安価にテレビに映像を出力する | トップページ | 最近のNHK語学番組は学習環境が充実しています »

初めまして、Tomと申します。
現在、Arduinoで遊びだしてから、約1週間になります。
先般修理した、NotePCのBIOS用フラッシュメモリ(W25Q64)からデータを読み出したいと思い、ここにたどり着きました。
上記、サンプルスケッチ(ダウンロード W25Q64.ino (11.7K))の中で、データの読み出しだけを行うためには、どこからどこまでのエリアを使用すればよろしいのでしょうか?
まだ、Arduinoを使用したばかりで、勉強不足です。
どうかご教示願います。
Tom
投稿: Tom | 2016年6月 2日 (木) 19時55分
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()でいけると思います。
投稿: たま吉さん(管理者) | 2016年6月 2日 (木) 21時16分
たま吉さん
アドバイスありがとうございました。
今後も、何かありましたら、ご教示ください。
Tom
投稿: Tom | 2016年6月 5日 (日) 15時20分
たま吉さん,
初めまして、wasaと申します。
”Hello world” 等文字列の書き込み及び読み取りしたいですが、
教えてください。
よろしくお願いします
投稿: wasa | 2017年12月20日 (水) 13時51分
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);
関数の使い方については、ライブラリのソースおよびサンプルソースを参照してください。
投稿: たま吉さん(管理者) | 2017年12月21日 (木) 14時25分
たま吉さん
アドバイスありがとうございました。
動作確認できた。
wasa
投稿: wasa | 2017年12月22日 (金) 12時10分
たま吉さま
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 | 2019年6月23日 (日) 16時54分
RockSolidHead さん
●1
あまり深い意味はないのですが、
書き込み要求前に、Busyが発生したこを知りたいためです。
通常は、このタイミングで発生しないと思います。
while(W25Q64_IsBusy()) ;
でも問題ないと思います。
●2
お恥ずかしい.. ご指摘の通りです。
byte型だと0~255なので、256は指定出来ませんね。
ご指摘ありがとうございます。
投稿: たま吉さん(管理者) | 2019年6月23日 (日) 19時09分