がじぇるね(6)
    GR-KURUMIのSPIでSpi SRAMをアクセス


 GR-KURUMIののSPIでSpi SRAM 23A256 を読み書きしました。 
 Spi SRAM 23A256は、32KByteのSRAMでSPIでアクセスできます。
 ここでは、32byte/ページを5ページ分読み書きしました。データは、ほぼアドレスと同じ内容です。
 制御は容易だと思ってたのですが、先頭番地でつまずきました。今は、対症療法で対処しています。
 機会があれば、原因究明したいと思っています。

●GR-KURUMIのSPIでSpi SRAMをアクセスの動作確認

 GR-KURUMIのSPIでSpi SRAMをアクセスンした構成とパソコンでモニタした動作状況です。
 構成写真の左端は、FT232Rでプログラム書込とシリアル通信に使います。中央は、GR-KURUMIでSPIを制御します。右端は、Spi SRAMで、SPIで指令を受け、データを記憶します。

 



 プログラムの実行結果を示します。
 上の写真は、書込時のシリアル通信の表示です。 2行目が0番地に書込、3行目は0番地から読み出しの状況で、正常に動作しています。
 以下、1番地、2番地と続きます。
 下の写真は、書込モードから、読み出しモードのモニタ状況です。これも正常に動作しています。

 問題は、0番地に正しくデータを書き込めない状況が発生しました。0番地以外は正常です。
 対応方法は、上の写真の1行目です。0番地に、ダミーデータを書き込んでから、本番のデータを書くと正常になります。
 
 データーシートやアプリケーションノートに対応方法があるかなと思ったのですが、それらしい物はありません。
 今は、対症療法で置いときます。機会があれば対策を追求します。











●サンプルプログラム

  スイッチ入力のサンプルプログラムを次に示します。

//Kurumi_SpiSram

///KurumiボードにSRAMを接続して書き込みしてから読み出す

#include <RLduino78.h>
#include <SPI.h>

int led_green = 23; // LOW active
int rData;

// pin10をSPIのスレーブセレクト端子(SS)とする。
const int SpiSramCsPin = 9;

void setup(){


// SPIの初期化
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV16); // 最大クロックは1MHz(16MHz/16)
SPI.setBitOrder(MSBFIRST); // MSBファースト
SPI.setDataMode(SPI_MODE0); // SPIモード0 SMOD1:0 SMOD0:0
// SPI.setDataMode(SPI_MODE3); // SPIモード3 SMOD1:0 SMOD0:1

pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(10,HIGH); // Pin 10 をHIに
digitalWrite(SpiSramCsPin,HIGH); //SpiSramCsPin をHIに

pinMode(led_green, OUTPUT);

Serial.begin(38400); //

//********** SpiSram Write
digitalWrite( SpiSramCsPin,LOW); //SpiSramCsPin をLOWに

SPI.transfer(0x02); //WriteCmd 設定
SPI.transfer(0x00); //WriteAdd(MSB) 設定
SPI.transfer(0x00); //WriteAdd(LSB) 設定

rData = SPI.transfer(0xAA); //RegData 書き込み

digitalWrite(SpiSramCsPin,HIGH); //SpiSramCsPin をHIに



//********** SpiSram Read
digitalWrite( SpiSramCsPin,LOW); //SpiSramCsPin をLOWに

SPI.transfer(0x03); //ReadCmd 設定
SPI.transfer(0x00); //ReadAdd(MSB) 設定
SPI.transfer(0x00); //WriteAdd(LSB) 設定

rData = SPI.transfer(0x00); //RegData 読出し

digitalWrite(SpiSramCsPin,HIGH); //SpiSramCsPin をHIに

//**********Read data シリアル出力
Serial.print("Adrs = 00:");
Serial.print(" ,rData = :");
Serial.println(rData,HEX);

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

byte TempAdrs, rData;
for (int i=0; i<5; i++){ //5Page書き込み
for (int j=0; j<32; j++){

//********** SpiSram Write
digitalWrite( SpiSramCsPin,LOW); //SpiSramCsPin をLOWに

SPI.transfer(0x02); //WriteCmd 設定
SPI.transfer(0x00); //WriteAdd(MSB) 設定

TempAdrs = (((i << 5) & 0xE0) | (j & 0x1F)); //WriteAdd(LSB) 演算
SPI.transfer(TempAdrs); //WriteAdd(LSB) 設定

rData = SPI.transfer(TempAdrs); //RegData 書き込み

digitalWrite(SpiSramCsPin,HIGH); //SpiSramCsPin をHIに
//********** Write data シリアル出力
Serial.print("i = :");
Serial.print(i,HEX);
Serial.print(" ,j = :");
Serial.print(j,HEX);

Serial.print(" ,TempAdrs = :");
Serial.println(TempAdrs,HEX);

//********** SpiSram Read
digitalWrite( SpiSramCsPin,LOW); //SpiSramCsPin をLOWに

SPI.transfer(0x03); //ReadCmd 設定
SPI.transfer(0x00); //ReadAdd(MSB) 設定

TempAdrs = (((i << 5) & 0xE0) | (j & 0x1F)); //ReadAdd(LSB) 演算
SPI.transfer(TempAdrs); //ReadAdd(LSB) 設定

rData = SPI.transfer(TempAdrs); //RegData 読出し

digitalWrite(SpiSramCsPin,HIGH); //SpiSramCsPin をHIに

//**********Read data シリアル出力
Serial.print("TempAdrs = :");
Serial.print(TempAdrs,HEX);
Serial.print(" ,rData = :");
Serial.println(rData,HEX);


}
}
//********** SpiSram Write
digitalWrite( SpiSramCsPin,LOW); //SpiSramCsPin をLOWに

SPI.transfer(0x02); //WriteCmd 設定
SPI.transfer(0x00); //WriteAdd(MSB) 設定

SPI.transfer(TempAdrs); //WriteAdd(LSB) 設定

rData = SPI.transfer(TempAdrs + 0x05); //RegData 書き込み

digitalWrite(SpiSramCsPin,HIGH); //SpiSramCsPin をHIに


Serial.print(" ,TempAdrs = :");
Serial.println(TempAdrs,HEX);



digitalWrite(10,LOW); // Pin 10 をLOWに

}


void loop(){
digitalWrite(led_green, 1); //LED点灯

byte TempAdrs, rData;
for (int i=0; i<5; i++){ //5Page読出し
for (int j=0; j<32; j++){

//********** SpiSram Read
digitalWrite( SpiSramCsPin,LOW); //SpiSramCsPin をLOWに

SPI.transfer(0x03); //ReadCmd 設定
SPI.transfer(0x00); //ReadAdd(MSB) 設定

TempAdrs = (((i << 5) & 0xE0) | (j & 0x1F)); //ReadAdd(LSB) 演算
SPI.transfer(TempAdrs); //ReadAdd(LSB) 設定

rData = SPI.transfer(TempAdrs); //RegData 読出し

digitalWrite(SpiSramCsPin,HIGH); //SpiSramCsPin をHIに

//**********Read data シリアル出力
Serial.print("TempAdrs = :");
Serial.print(TempAdrs,HEX);
Serial.print(" ,rData = :");
Serial.println(rData,HEX);


digitalWrite(led_green, 0); //LED消灯

delay(100);
}
}
}





ホームへ戻る