ついにFRAMが届きました!
今回購入したFRAMは、東芝のMB85RS64Vです。
入力が5VもOKなので、Arduinoに接続する為にレベルシフターが要りません。
それと、SOPなのでDIPに変換する基板も一緒に購入しました。
SPI接続なので、接続する本数が少なくて助かります。
信号線は
Arduino - FRAM
D10 - CSn
D11 - SI(MOSI)
D12 - SO(MISO)
D13 - CK(CLK)
FRAM側のWPnとHOLDnは今回使用しませんので、5Vに接続します。
本来なら抵抗でプルアップするのですが、実験なので大目に電流が流れても問題ないので直結ですw
ブレッドボードはこんな感じで配線してます。
実際の配線はこちら
上の小さいのがFRAMです。
拡大
SOPなので小さいです。
では早速、確認していきましょう。
今回、アクセスにSPIを使用しますので、SPIライブラリを使う必要があります。
先頭で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[50]; 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() { }
実行した結果は、こんな感じで最初は何も書かれてないので0x00しか表示されません。
ただ、これって本当に読めてるのかオシロを見ても判らないので、今度は変化するデータを書き込み、それを読みだしてみます。
#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(i); digitalWrite(FRAM_CS, HIGH); // /CSをHighに } void loop() { }
0番地から0,1,2・・・と書き込みます。
実行後に、最初のプログラムを実行させた結果です。
想定通りの結果が確認出来ました!
ちなみに、FRAMなのでSRAMと違い電源が切れても残っている不揮発性メモリ。
ここで一度USBケーブルを抜いて、再度最初の読み出しを実行してみます。
SRAMなら消えてしまいますが、
しっかり残っています。良かった、良かったw
しかし、すごく簡単に書き込み出来て便利ですなー。
激安互換品 な、なんと送料込みで500円以内!www