趣味の電子工作と釣りについて。電子工作は、おもに変換器作成。釣りはおもにトラウトの管釣り。
2年前からいろいろいじっている車載マイコンであるが、何かときどき再起動している気がする。再起動したときのために変数をChip内蔵のEEPROMに記憶するようにしていたが、秒に数十回書き換えているとEEPROMの書換回数が許容をあっという間に超えそうなので、そこで値をSUNのワークステーションのようにNVRAMに書き込もうと思った。
NVRAM高いだろうなぁ、、と思って調べたら、やっぱり高い。と、いろいろ探していると、FRAM(FeRAMともいうらしい)というデバイスを見つけた。どうやら昔ながらのNVRAMは、もう時代遅れらしい。小容量でいいなら、EEPROMもフラッシュメモリーも、今後はこのFRAMに置き換えられていくのだろう。きっと。
で、このFRAMは国内では富士通が作っているようだ。富士通が作る書換可能な不揮発性メモリーということで、あの銘機BUBCOM80やバブルシステムを生み出す原動力となったバブルメモリーの末裔といえるだろう。で、この富士通のFRAMを最初は使おうと思ったが、車載で使える温度帯のものがなくて、仕方なくRamtron(Cypress)のFRAMにした。RamtronのやつはI2Cインターフェースがないので、仕方なくSPIインターフェースのやつを選んだ。それが、FM25040B、である。まあ富士通じゃないけど頭にFMが付いているし、まあいいか。
で、まず結線から。左がFRAM、右がPIC16F1827。
/CS ---- デジタル出力ポート
/WP ---- 5V
/HOLD ---- 5V
SCK ---- SCK1
SI ---- SDO1
SO ---- SDI1
VSS --- GND
VDD ---- 5V
AVRと違って、PICはINとOUTがクロスするので、ちょっと注意が必要。
で、コーディングであるが、主要なところだけ抽出すると、
前処理。ファイルの先頭やmainの前や頭に書く。
#define FRAM_CS PORTA.f2
// CS :RA2
// SCK:RB4
// SDI:RB1
// SDO:RB2
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
APFCON0=0b10000001;
APFCON1=0b00000001;
OSCCON=0b11110000; // 8MHz x 4
OPTION_REG=0b00000011; // 1:16 , RB pullup enabled
ANSELA = 0b00000011;
ANSELB = 0b11000000;
PORTA = 0;
TRISA = 0b11110011; // 1 ... input
PORTB = 0;
TRISB = 0b11000010;
PIR1=0;
unsigned short dummy;
unsigned char iscv_cnt;
unsigned char iscv_sts=1;
SPIの初期化は
FRAM_CS=1;
SPI1_Init();
メモリー読み出しは
FRAM_CS=0;
SPI1_Write(0b00000011); // Memory Read
SPI1_Write(0x00); // Address
iscv_cnt=SPI1_Read(dummy);
iscv_sts=SPI1_Read(dummy);
FRAM_CS=1;
メモリー書き込みは
FRAM_CS=0;
SPI1_Write(0b00000110); // Write Enable
FRAM_CS=1;
FRAM_CS=0;
SPI1_Write(0b00000010); // Memory Write
SPI1_Write(0x00); // Address
SPI1_Write(iscv_cnt);
SPI1_Write(iscv_sts);
FRAM_CS=1;
とりあえず、これで動いた。
SPI1_Initは初めに1回実行すればいいみたい。
SPI1_Write(0b00000110)は書き込み毎に毎回実行しなければいけないみたい。
次に書き込みにいくとオートロックされちゃってるみたいな感じ。
NVRAM高いだろうなぁ、、と思って調べたら、やっぱり高い。と、いろいろ探していると、FRAM(FeRAMともいうらしい)というデバイスを見つけた。どうやら昔ながらのNVRAMは、もう時代遅れらしい。小容量でいいなら、EEPROMもフラッシュメモリーも、今後はこのFRAMに置き換えられていくのだろう。きっと。
で、このFRAMは国内では富士通が作っているようだ。富士通が作る書換可能な不揮発性メモリーということで、あの銘機BUBCOM80やバブルシステムを生み出す原動力となったバブルメモリーの末裔といえるだろう。で、この富士通のFRAMを最初は使おうと思ったが、車載で使える温度帯のものがなくて、仕方なくRamtron(Cypress)のFRAMにした。RamtronのやつはI2Cインターフェースがないので、仕方なくSPIインターフェースのやつを選んだ。それが、FM25040B、である。まあ富士通じゃないけど頭にFMが付いているし、まあいいか。
で、まず結線から。左がFRAM、右がPIC16F1827。
/CS ---- デジタル出力ポート
/WP ---- 5V
/HOLD ---- 5V
SCK ---- SCK1
SI ---- SDO1
SO ---- SDI1
VSS --- GND
VDD ---- 5V
AVRと違って、PICはINとOUTがクロスするので、ちょっと注意が必要。
で、コーディングであるが、主要なところだけ抽出すると、
前処理。ファイルの先頭やmainの前や頭に書く。
#define FRAM_CS PORTA.f2
// CS :RA2
// SCK:RB4
// SDI:RB1
// SDO:RB2
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
APFCON0=0b10000001;
APFCON1=0b00000001;
OSCCON=0b11110000; // 8MHz x 4
OPTION_REG=0b00000011; // 1:16 , RB pullup enabled
ANSELA = 0b00000011;
ANSELB = 0b11000000;
PORTA = 0;
TRISA = 0b11110011; // 1 ... input
PORTB = 0;
TRISB = 0b11000010;
PIR1=0;
unsigned short dummy;
unsigned char iscv_cnt;
unsigned char iscv_sts=1;
SPIの初期化は
FRAM_CS=1;
SPI1_Init();
メモリー読み出しは
FRAM_CS=0;
SPI1_Write(0b00000011); // Memory Read
SPI1_Write(0x00); // Address
iscv_cnt=SPI1_Read(dummy);
iscv_sts=SPI1_Read(dummy);
FRAM_CS=1;
メモリー書き込みは
FRAM_CS=0;
SPI1_Write(0b00000110); // Write Enable
FRAM_CS=1;
FRAM_CS=0;
SPI1_Write(0b00000010); // Memory Write
SPI1_Write(0x00); // Address
SPI1_Write(iscv_cnt);
SPI1_Write(iscv_sts);
FRAM_CS=1;
とりあえず、これで動いた。
SPI1_Initは初めに1回実行すればいいみたい。
SPI1_Write(0b00000110)は書き込み毎に毎回実行しなければいけないみたい。
次に書き込みにいくとオートロックされちゃってるみたいな感じ。
PR
この記事にコメントする