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"); }