wvogel日記

自分用の技術備忘録が多めです.

CyPressのSRAMを使ってみる

お久しぶりです。
ここしばらく、ハードウェアの設計製作しかしておりません。
ときたまjavascriptでちまちまとなにやら開発しておる程度。

今回は完全に自分用の備忘録として。
CyPressの出してる1MbitのSRAM, 「CY14B101Q2A」の使い方。
データシートを読めば分かるんですけどね。

回路はデータシートにあるとおりに配線します。
AutoStoreモードは今回は使わなかったので、Vcap端子はOpenにしてあります。CS端子についても、本来はプルアップするようですが、面倒なのでしてません。

流れとしては以下のとおり。

①書き込み許可

CS = 0
WENに1をset (Write Enable bit)
CS = 1

(なお、WENは次の命令のCS立ち上がりでリセットされます。
 なので、書き込み処理の前には毎回必要)


②保護設定

CS = 0
RDSRを設定
CS = 1

(主に保護機能の設定。保護設定した領域はREAD onlyになります。)


③書き込み

①の処理
CS = 0
WRITE用ope code送信(0x02)
address(16bit目)
address(15~8bit目)
address(7~0bit目)
data(8bit*n)
CS = 1

書き込みの前に、リセットされているWENを再度設定してやります。
アドレスは17bit指定。
アドレスもデータも、常にMSBから送信します。
一度アドレスを指定すれば連番でデータを送信可能です。

④読み込み
CS = 0
READ用ope code送信(0x03)
address(16bit目)
address(15~8bit目)
address(7~0bit目)
dammy data(8bit*n)
CS = 1

読み込みは、アドレス指定まではWRITEと同じ流れです。
その後も、CSをhighにしない限りデータが連番で送られてきます。
下のサンプルでは、データを取得するためにダミーデータを出力しています。

サンプルで書いたmbedコード貼っておきます。

#include "mbed.h"

DigitalOut myled(LED1);
DigitalOut cs(p8);
SPI spi(p5,p6,p7); 
Serial pc(USBTX, USBRX); // tx, rx

#define SIZE 10

char buff[SIZE];
char test[SIZE] = {1,1,2,3,5,8,13,21,34,55};

void Blink(float s)
{
    myled = 1;
    wait(s);
    myled = 0;
    wait(s);
}

void EnableWriting()
{
    cs = 0;
    spi.write(0x06);    //set WEN
    cs = 1;
    wait_us(500);
}

void WriteRDSR()       //Status Register
{
    EnableWriting();
    
    cs = 0;
    spi.write(0x01);    //ope code for WRITE STATUS REGISTER
    spi.write(0x00);
    cs = 1;
}

void Write()
{
    EnableWriting();
    
    cs = 0;
    spi.write(0x02);    //WRITE mode
    spi.write(0x00);    //address 1
    spi.write(0x00);    //address 2
    spi.write(0x00);    //address 3
    for(char i = 0; i < SIZE; i++)
    {
        spi.write(test[i]);   
    } 
    cs = 1;
}

void Read()
{
    cs= 0;  
    spi.write(0x03);    //READ mode
    spi.write(0x00);    //address 1
    spi.write(0x00);    //address 2
    spi.write(0x00);    //address 3
    for(char i = 0; i < SIZE; i++)
    {
        buff[i] = spi.write(i);    //dummy data to receive data
    }
    cs = 1;
}

int main() {
    spi.format(8,3);

    WriteRDSR();
    wait_us(500);
    
    Write();    
    wait_us(500);
    Read();    
    
    for(char i = 0; i < SIZE; i++)
        pc.printf("%d,", buff[i]);
    pc.printf("\n");
}