次世代メモリF-RAMを使おう

投稿者:

近日発売予定の商品の紹介です。発売されました!
スイッチサイエンスでは、次世代不揮発メモリの一つであるF-RAM(FeRAM)をブレッドボードで使えるようにするためのブレイクアウト基板に実装した、F-RAM Breakoutを作りました。

F-RAMという名称はメーカー(旧Ramtron、現Cypress)の呼称だそうなので、一般的にはFeRAMという呼び名のほうが通りがいいみたいです。FeRAMはFerroelectric Random Access Memoryの略で、日本語で言うと「強誘電体メモリ」。情報の保持に強誘電体を使うメモリだということですね。

記録する理屈の説明は他のサイトにおまかせしますが、特長は

  • 電源を切ってもデータを保持
  • 書き換え可能回数が非常に多い
  • 書き込み速度が速い
  • バイト単位で書き換えが可能

の4つです。つまり、SRAMのように使えてROMのようにデータが消えない、夢のようなメモリだといえるでしょう。あまりに夢のようなので、ブレイクアウトを作ったのでした。
だったらEEPROMと同じでは?と思う方もいるかもしれませんが、EEPROMは書き換え回数がそれほど多くないのです(多くて100万回くらい)。F-RAMは10^14(100兆)回の書き換えが保証されているので、制限を気にせずガンガン書き換えられます。

今回採用したF-RAMはCypressのFM25W256です。容量256キロビットですからバイトで言うと32キロバイト。電源電圧は2.7-5.5Vまで対応しているので、mbedにもArduinoにもそのままつなげられます。

F-RAM BreakoutとArduinoを接続

さっそくArduinoと接続してデータを読み書きして、本当に電源を切ってもデータが消えないのか試してみました。
このF-RAMのインターフェースはSPIなので、Arduinoとの接続は簡単です。
D10 - /CS
D11 - SI(MOSI)
D12 - SO(MISO)
D13 - CK(CLK)
VDDは5V、VSSはGNDにつないで、残るWPとHD(HOLD)は今回使わないので5Vにつなぎます。

接続を確認したら、次はスケッチ(ソフトウェア)です。このF-RAMはSPIで接続されているので、SPIライブラリが必要です。
あとはSPI接続のSRAMとだいたい同じように読み書きができるのですが、一つ違うのは書き込み時にWREN(書き込みイネーブル)コマンドを発行する必要があることです。
WRENの件は覚えておくこととして、まずは読み出しスケッチで内容を読み出してみます。先頭の256バイトをシリアルで出力します。一回しか実行しないので、loop()の中身は空です。
(初出時、一行目の「#include <SPI.h>」が抜けていました。申し訳ありません。)

#include <SPI.h>

const byte CMD_WREN = 0x06; //0000 0110 Set Write Enable Latch
const byte CMD_WRDI = 0x04; //0000 0100 Write Disable
const byte CMD_RDSR = 0x05; //0000 0101 Read Status Register
const byte CMD_WRSR = 0x01; //0000 0001 Write Status Register
const byte CMD_READ = 0x03; //0000 0011 Read Memory Data
const byte CMD_WRITE = 0x02; //0000 0010 Write Memory Data

const int FRAM_CS = 10; //chip select is D10 pin

void setup()
{
  Serial.begin(9600);
  pinMode(FRAM_CS, OUTPUT);
  digitalWrite(FRAM_CS, HIGH); // /CSをHighに

  //Setting up the SPI bus
  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV2);

  digitalWrite( FRAM_CS, LOW); // /CSをLowに

  SPI.transfer(CMD_READ);
  SPI.transfer(0); // アドレス上位
  SPI.transfer(0); // アドレス下位

  int addr = 0;
  int data[16];
  for (int j=0; j < 16; j++) {
    for (int i=0; i < 16; i++) {
      data[i] = SPI.transfer(0x00);
    }
    char s[30];
    sprintf(s, "%04x : %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x ", addr,data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8],data[9],data[10],data[11],data[12],data[13],data[14],data[15]);
    Serial.println(s);
    addr += 16;

    digitalWrite(FRAM_CS, HIGH); // /CSをHighに
  }
}
void loop()
{
}

最初の一回しかアドレスを設定していませんが、読み出しや書き込みを行うたびに自動でアドレスが+1されるので、連続で読み書きすることができます。
実行するとこんな出力になります。最初の16バイトにデータが入っているのは、テストで書き込んだからです。買ったばっかりだとおそらく全部0になっているのでしょう。

0000 : 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
0010 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0020 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0030 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0040 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0050 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0060 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0070 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0090 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00a0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00b0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00c0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00d0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00e0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00f0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

メモリダンプができるようになったので、今度は書き込んでみましょう。

#include <SPI.h>

const byte CMD_WREN = 0x06; //0000 0110 Set Write Enable Latch
const byte CMD_WRDI = 0x04; //0000 0100 Write Disable
const byte CMD_RDSR = 0x05; //0000 0101 Read Status Register
const byte CMD_WRSR = 0x01; //0000 0001 Write Status Register
const byte CMD_READ = 0x03; //0000 0011 Read Memory Data
const byte CMD_WRITE = 0x02; //0000 0010 Write Memory Data

const int FRAM_CS = 10; //chip select 1

void setup()
{
  Serial.begin(9600);
  pinMode(FRAM_CS, OUTPUT);
  digitalWrite(FRAM_CS, HIGH); // /CSをHighに

  //Setting up the SPI bus
  SPI.begin();
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV2);

  digitalWrite(FRAM_CS, LOW); // /CSをLowに
  SPI.transfer(CMD_WREN); // 書き込みイネーブルコマンド
  digitalWrite(FRAM_CS, HIGH); // /CSをHighに

  digitalWrite(FRAM_CS, LOW); // /CSをLowに
  SPI.transfer(CMD_WRITE); //write command
  SPI.transfer(0); // アドレス上位
  SPI.transfer(0); // アドレス下位

  for (int i = 0;i < 16;i++) SPI.transfer(0xff-i);

  digitalWrite(FRAM_CS, HIGH); // /CSをHighに
}

void loop()
{
}

やっていることは読み出しとさほど変わらないのですが、CMD_WRENを送信しているところがちょっと違います。SPI接続のSRAMでもこういうコマンドはないので、SPI接続SRAMのライブラリを流用しようと思った場合は注意しましょう。

書き込んでからまた読み出しスケッチを使って読み出すとこんな表示になりました。

0000 : ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0
0010 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0020 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0030 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0040 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0050 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0060 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0070 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0090 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00a0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00b0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00c0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00d0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00e0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00f0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

そして一度ArduinoからUSBケーブルを外して電源を供給しない状態にしてから、またUSBケーブルをつないでF-RAMの内容を読み出してみると……

0000 : ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0
0010 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0020 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0030 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0040 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0050 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0060 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0070 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0090 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00a0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00b0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00c0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00d0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00e0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00f0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

無事中身が残っていました。SRAMと違って、一晩電源を切っていても問題なくデータが残っています。

従来のメモリに比べると割高ではある次世代メモリですが、書き込みが簡単で不揮発というメリットは大きいでしょう。近い将来の主役メモリになりうる次世代メモリを使ってみたいという方は、発売までもうしばらくお待ちください。ぜひご検討ください。
商品ページ「F-RAMモジュール FM25W256」へ