Arduino FRAM SPIアクセス

ついに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

シェアする

  • このエントリーをはてなブックマークに追加

フォローする