文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{…
 
(同じ利用者による、間の4版が非表示)
1行目: 1行目:
== 概要 ==
== 概要 ==
 
FRAM / FeRAM (Ferroelectric Random Access Memory)は、強誘電体材料を使用して情報を記憶して、電界の向きによって分極状態を変化させてデータを保存するメモリである。<br>
多くのFRAM製品は、SPIやI2Cインターフェースを採用している。<br>
<br>
FRAMは、高速性、低消費電力、高い信頼性が求められる用途で特に有用である。<br>
ただし、大容量のストレージが必要な場合は他の選択肢も検討する必要がある。<br>
<br>
この技術は継続的に発展しており、将来的にはさらに広い分野での採用が期待されている。<br>
<br>
FRAMには、以下に示すような特徴がある。<br>
* 不揮発性
*: 電源を切ってもデータが保持される。
* 高速書き込み
*: EEPROMやフラッシュROMより大幅に高速である。
* 低消費電力
*: 書き込み時のエネルギー消費が少ない。
* 高い書き換え回数
*: 10^12〜10^15回 (1兆〜1000兆回) 程度の書き換えが可能である。
<br>
他のメモリとの比較して、FRAMは以下に示すようなメリットがある
* SRAMより低速であるが、不揮発性がある。
* EEPROMより高速で、書き換え回数が多い。
* フラッシュROMより高速で、バイト単位のアクセスが可能である。
<br>
FRAMが採用されている用途を、以下に示す。<br>
* 組み込みシステム
* スマートメーター
* 自動車用電子機器
* 産業用機器
<br>
FRAMのメリットを以下に示す。<br>
* 信頼性が高い。
* 放射線耐性がある。
* 広い動作温度範囲
<br>
FRAMのデメリットを以下に示す。<br>
* 容量あたりのコストが比較的高い。
* 大容量化が難しい。
<br><br>
<br><br>


7行目: 43行目:
<br>
<br>
MSP430G2553マイコンで使用できるFRAMについては、いくつかの選択肢がある。<br>
MSP430G2553マイコンで使用できるFRAMについては、いくつかの選択肢がある。<br>
* Cypress (現Infineon)  
* I2C対応のFRAMの例
*: FM24シリーズ
** Cypress (現Infineon)  
*: FM24CL04B, FM24CL16B, FM24CL64B
**: FM24シリーズ
* Fujitsu (現Lapis)  
**: FM24CL04B, FM24CL16B, FM24CL64B
*: MB85シリーズ
** Fujitsu (現Lapis)  
*: MB85RC256V, MB85RC512T
**: MB85RCシリーズ
**: MB85RC256V, MB85RC512T
*: <br>
* SPI対応のFRAMの例
** Cypress (現Infineon)
**: FM25シリーズ
**: FM25V05 (512Kbit, 64K x 8), FM25V10 (1Mbit, 128K x 8), FM25W256: 256Kbit (32K x 8)
** Fujitsu (現Lapis)
**: MB85RSシリーズ
**: MB85RS1MT (1Mbit, 128K x 8), MB85RS2MT (2Mbit, 256K x 8), MB85RS4MT (4Mbit, 512K x 8)
** Rohm
**: MR45V100A (1Mbit, 128K x 8), MR48V256A (256Kbit, 32K x 8)
<br>
<br>
これらのFRAMは、一般的に、I2CインターフェースでMSP430G2553マイコンに接続できる。<br>
これらのFRAMは、一般的に、I2CインターフェースまたはSPIインターフェースでMSP430G2553マイコンに接続できる。<br>
MSP430G2553マイコンはI2C通信をサポートしているため、これらのFRAMとの通信が可能である。<br>
MSP430G2553マイコンはI2C通信およびSPI通信をサポートしているため、これらのFRAMとの通信が可能である。<br>
<br>
<br>
F-RAMを選択する時の主な考慮点を、以下に示す。<br>
FRAMを選択する時の主な考慮点を、以下に示す。<br>
* 容量
* 容量
*: 必要なストレージ容量に応じて選択する。
*: 必要なストレージ容量に応じて選択する。
28行目: 75行目:
<br>
<br>
具体的な製品を選択する場合は、データシートを確認して、MSP430G2553マイコンとの互換性を確認することが重要である。<br>
具体的な製品を選択する場合は、データシートを確認して、MSP430G2553マイコンとの互換性を確認することが重要である。<br>
<br>
SPI通信が可能なFRAMの特徴を、以下に示す。<br>
* 高速通信
*: 多くのSPI通信が可能なFRAMは、20[MHz]以上のクロック周波数をサポートしている。
* 簡単な接続
*: 通常4本の信号線 (SCLK, MOSI, MISO, CS) で接続できる。
* フルデュプレックス通信
*: 同時に送受信が可能である。
* 複数デバイスの接続
*: チップセレクト (CS) 線を使用して、複数のデバイスを制御できる。
* 低消費電力
*: 特に待機時の消費電力が非常に低い。
* 高い信頼性
*: EEPROMやフラッシュROMと比較して、書き換え回数が非常に多い。
<br>
SPI通信が可能なFRAMを選択するメリットを、以下に示す。<br>
* I2Cと比較して高速な通信が可能。
* ノイズに強い。 (ただし、短距離通信の場合)
* プロトコルがシンプル。
* 多くのマイコンがハードウェアSPIをサポートしている。
<br>
SPI通信が可能なFRAMを使用する場合は、使用するマイコンのSPIインターフェースの仕様と、選択するFRAMのデータシートを確認して、適切な通信設定を行うことが重要である。<br>
また、SPIモードの設定 (クロックのポラリティとフェーズ) にも注意が必要である。<br>
MSP430G2553マイコンでSPI通信が可能なFRAMを使用する場合、USIモジュールを使用して、SPI通信を実装することができる。<br>
<br>
<br>
==== FM24CL04B, FM24CL16B, FM24CL64B (I2C FRAM) ====
==== FM24CL04B, FM24CL16B, FM24CL64B (I2C FRAM) ====
43行目: 114行目:


== サンプルコード ==
== サンプルコード ==
==== FM24CL04B, FM24CL16B, FM24CL64B ====
==== FM24CL04B, FM24CL16B, FM24CL64B (I2C) ====
以下の例では、MSP430G2553マイコンとFM24CL16BまたはFM24CL64B (FRAM) を使用してデータを読み書きしている。<br>
以下の例では、MSP430G2553マイコンとFM24CL16BまたはFM24CL64B (FRAM) を使用してデータを読み書きしている。<br>
<br>
<br>
162行目: 233行目:
* 実務で使用する場合は、エラー処理やタイムアウト処理を追加することを推奨する。
* 実務で使用する場合は、エラー処理やタイムアウト処理を追加することを推奨する。
* FRAMの容量に応じて、アドレス指定の方法を調整する必要がある。
* FRAMの容量に応じて、アドレス指定の方法を調整する必要がある。
<br>
==== MB85RC256V, MB85RC512T (I2C) ====
以下の例では、MSP430G2553マイコンとMB85RC256VまたはMB85RC512T (FRAM) を使用してデータを読み書きしている。<br>
このデバイスもI2Cインターフェースを使用するが、アドレス指定方法が少し異なる。<br>
<br>
* アドレス指定
*: MB85RC256V, MB85RC512Tは、16ビットのアドレス指定を使用する。
*: I2C_write関数およびI2C_read関数において、アドレスを2バイトに分けて送信している。
* デバイスアドレス
*: FRAM_ADDRを0x50としているが、実際のアドレスは製品とピン接続により異なる場合がある。
* 待機時間
*: FRAMは高速であるため、書き込み後の待機時間を1[mS]にしている。
*: 実際には、この待機も不要な場合がある。
* エラー処理
*: 以下の例では、エラー処理が記述されていない。
*: 実務では、通信エラーの検出と処理を追加することを推奨する。
* クロック周波数
*: I2C通信のクロック周波数は約100[kHz]に設定している。
*: FRAMはより高速な通信も可能であるが、MSP430G2553マイコンの制限を考慮している。
<br>
<syntaxhighlight lang="c">
#include <msp430g2553.h>
#define FRAM_ADDR 0x50  // FRAMのI2Cアドレス (下位3ビットは可変)
void initI2C(void);
void I2C_write(unsigned int addr, unsigned char *data, unsigned int len);
void I2C_read(unsigned int addr, unsigned char *data, unsigned int len);
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;  // ウォッチドッグタイマを停止
    initI2C();                // I2Cの初期化
    // 書き込むデータ
    unsigned char writeData[] = {0x12, 0x34, 0x56, 0x78};
    // 読み出し用バッファ
    unsigned char readData[4];
    // FRAMにデータを書き込む (アドレス0x0100から)
    I2C_write(0x0100, writeData, 4);
    // 1[mS]待機 (FRAMは高速であるため、長い待機時間は不要)
    __delay_cycles(1000);
    // FRAMからデータを読み出す (アドレス0x0100から)
    I2C_read(0x0100, readData, 4);
    while(1);
}
void initI2C(void)
{
    P1SEL    |= BIT6 + BIT7;                // P1.6 = SCL, P1.7 = SDA
    P1SEL2    |= BIT6 + BIT7;
    UCB0CTL1  |= UCSWRST;                    // UCB0をリセット状態に
    UCB0CTL0  = UCMST + UCMODE_3 + UCSYNC;  // I2Cマスターモード
    UCB0CTL1  = UCSSEL_2 + UCSWRST;        // SMCLKを選択
    UCB0BR0    = 12;                        // fSCL = SMCLK / 12 = ~100kHz (SMCLKが1[MHz]の場合)
    UCB0BR1    = 0;
    UCB0I2CSA  = FRAM_ADDR;                  // スレーブアドレスをセット
    UCB0CTL1  &= ~UCSWRST;                  // UCB0のリセットを解除
}
void I2C_write(unsigned int addr, unsigned char *data, unsigned int len)
{
    while (UCB0CTL1 & UCTXSTP);        // 前の通信が終了するまで待機
    UCB0CTL1  |= UCTR + UCTXSTT;      // 送信モード、スタートコンディション
    while (!(IFG2 & UCB0TXIFG));      // TXバッファが空になるまで待機
    UCB0TXBUF  = (addr >> 8) & 0xFF;  // アドレス上位バイトを送信
    while (!(IFG2 & UCB0TXIFG));
    UCB0TXBUF  = addr & 0xFF;          // アドレス下位バイトを送信
    while (!(IFG2 & UCB0TXIFG));
    while (len--) {
      UCB0TXBUF = *data++;            // データを送信
      while (!(IFG2 & UCB0TXIFG));
    }
    UCB0CTL1 |= UCTXSTP;              // ストップコンディション
    while (UCB0CTL1 & UCTXSTP);        // ストップコンディションが送信されるまで待機
}
void I2C_read(unsigned int addr, unsigned char *data, unsigned int len)
{
    while (UCB0CTL1 & UCTXSTP);      // 前の通信が終了するまで待機
    UCB0CTL1  |= UCTR + UCTXSTT;      // 送信モード, スタートコンディション
    while (!(IFG2 & UCB0TXIFG));
    UCB0TXBUF  = (addr >> 8) & 0xFF;  // アドレス上位バイトを送信
    while (!(IFG2 & UCB0TXIFG));
    UCB0TXBUF  = addr & 0xFF;        // アドレス下位バイトを送信
    while (!(IFG2 & UCB0TXIFG));
    UCB0CTL1 &= ~UCTR;                // 受信モードに切り替え
    UCB0CTL1 |= UCTXSTT;              // リスタートコンディション
    while (UCB0CTL1 & UCTXSTT);      // スタートコンディションが送信されるまで待機
    while (len--) {
      while (!(IFG2 & UCB0RXIFG));  // RXバッファにデータが来るまで待機
      *data++ = UCB0RXBUF;          // データを読み出し
      if (len == 0)
          UCB0CTL1 |= UCTXSTP;        // 最後のバイトを読み出す前にストップコンディションを送信
    }
    while (UCB0CTL1 & UCTXSTP);      // ストップコンディションが送信されるまで待機
}
</syntaxhighlight>
<br>
<u>※注意</u><br>
* 実際のデバイスアドレスを確認して、必要に応じてFRAM_ADDRマクロを調整すること。
* MB85RC256V, MB85RC512Tでは、最大アドレス範囲が異なるため、使用するデバイスの容量に注意する必要がある。
* 電源電圧やI2Cプルアップ抵抗等、ハードウェア設定も適切に行うこと。
<br><br>
<br><br>


{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:MSP430]]
[[カテゴリ:MSP430]]