MSP430G2553 - EEPROM

2024年6月4日 (火) 02:49時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == <br><br> == EEPROMの種類 == 一般的に、外付けのEEPROMとして使用されているデバイスには、以下のようなものがある。<br> <br> 以下に示すEEPROMは、MSP430マイコンのI2CまたはSPIインターフェースに直接接続して使用することができる。<br> 容量や速度、インターフェースの種類などの要件に応じて選択する。<br> <br> 特に、24LC256は、比較的大容量でI2…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

概要



EEPROMの種類

一般的に、外付けのEEPROMとして使用されているデバイスには、以下のようなものがある。

以下に示すEEPROMは、MSP430マイコンのI2CまたはSPIインターフェースに直接接続して使用することができる。
容量や速度、インターフェースの種類などの要件に応じて選択する。

特に、24LC256は、比較的大容量でI2Cインターフェースを備えているため、MSP430マイコンの組み合わせで広く使用されている人気の高いEEPROMの1つである。

24LC256 (256Kbit I2C EEPROM)

  • Microchip社製の不揮発性メモリ
  • I2Cインターフェースを使用
  • 32[KB] (256[Kbit]) の容量
  • 低消費電力で動作


25LC640A (64Kbit SPI EEPROM)

  • Microchip社製の不揮発性メモリ
  • SPIインターフェースを使用
  • 8[KB] (64[Kbit]) の容量
  • 高速動作が可能


AT24C32 (32Kbit I2C EEPROM)

  • Atmel (現Microchip) 社製の不揮発性メモリ
  • I2Cインターフェースを使用
  • 4[KB] (32[Kbit]) の容量
  • industryグレードの信頼性



サンプルコード

24LC256 (256Kbit I2C EEPROM)

以下の例では、I2C通信を使用してEEPROMとの通信を行っている。
I2C通信を初期化した後、i2c_write_byte関数を使用してEEPROMにデータを書き込み、i2c_read_byte関数を使用して書き込んだデータを読み出している。

  1. i2c_init関数でI2Cの初期化を行う。
    ピンの設定、I2Cの設定、クロック周波数の設定等を行う。
    MSP430G2553マイコンのP1.6をSCL、P1.7をSDAに指定している。
  2. i2c_write_byte関数を使用して、指定したアドレスにデータを書き込む。
    スタートコンディション、アドレスの送信、データの送信、ストップコンディションの順に処理を行う。
  3. i2c_read_byte関数を使用して、指定したアドレスからデータを読み出す。
    スタートコンディション、アドレスの送信、再スタートコンディション、データの受信、ストップコンディションの順に処理を行う。


実際に動作させる場合は、回路の接続や電源の供給等にも注意が必要である。

 #include <msp430.h>
 
 // 24LC256のI2Cアドレス
 // 24LC256のA0, A1, A2ピンがGNDに接続されている場合
 #define EEPROM_ADDRESS 0x50
 
 void i2c_init();
 void i2c_write_byte(unsigned char address, unsigned char data);
 unsigned char i2c_read_byte(unsigned char address);
 
 int main(void)
 {
    WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマを停止
 
    i2c_init(); // I2Cの初期化
 
    unsigned char data = 0xAA;      // 書き込むデータ
    unsigned char address = 0x10;   // EEPROMのメモリアドレス
 
    i2c_write_byte(address, data);  // EEPROMにデータを書き込み
 
    unsigned char read_data = i2c_read_byte(address);  // EEPROMからデータを読み出し
 
    while(1);
 }
 
 void i2c_init()
 {
    P1SEL |= BIT6 + BIT7;                  // I2Cピン(SCL, SDA)の設定
    P1SEL2|= BIT6 + BIT7;
 
    UCB0CTL1 |= UCSWRST;                   // I2Cの無効化(設定変更のため)
    UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;  // I2Cマスターモード, I2Cモード, 同期モード
    UCB0CTL1 = UCSSEL_2 + UCSWRST;         // SMCLK (1MHz) を選択, I2Cの無効化
    UCB0BR0 = 10;                          // SCLクロック周波数を100kHzに設定
    UCB0BR1 = 0;
    UCB0I2CSA = EEPROM_ADDRESS;            // スレーブアドレスの設定
    UCB0CTL1 &= ~UCSWRST;                  // I2Cの有効化
 }
 
 void i2c_write_byte(unsigned char address, unsigned char data)
 {
    while (UCB0CTL1 & UCTXSTP);         // 停止コンディションが送信されるまで待機
    UCB0CTL1 |= UCTR + UCTXSTT;         // 送信モード, スタートコンディション
 
    while (!(IFG2 & UCB0TXIFG));        // TXバッファが空になるまで待機
    UCB0TXBUF = (address >> 8) & 0xFF;  // 上位アドレスの送信
 
    while (!(IFG2 & UCB0TXIFG));
    UCB0TXBUF = address & 0xFF;         // 下位アドレスの送信
 
    while (!(IFG2 & UCB0TXIFG));
    UCB0TXBUF = data;                   // データの送信
 
    while (!(IFG2 & UCB0TXIFG));
    UCB0CTL1 |= UCTXSTP;                // ストップコンディションの送信
 }
 
 unsigned char i2c_read_byte(unsigned char address)
 {
    while (UCB0CTL1 & UCTXSTP);
    UCB0CTL1 |= UCTR + UCTXSTT;         // 送信モード, スタートコンディション
 
    while (!(IFG2 & UCB0TXIFG));
    UCB0TXBUF = (address >> 8) & 0xFF;  // 上位アドレスの送信
 
    while (!(IFG2 & UCB0TXIFG));
    UCB0TXBUF = address & 0xFF;         // 下位アドレスの送信
 
    while (UCB0CTL1 & UCTXSTT);
    UCB0CTL1 &= ~UCTR;                  // 受信モード
    UCB0CTL1 |= UCTXSTT;                // 再スタートコンディション
 
    while (UCB0CTL1 & UCTXSTT);
    UCB0CTL1 |= UCTXSTP;                // ストップコンディションの送信
 
    while (!(IFG2 & UCB0RXIFG));        // 受信完了まで待機
 
    return UCB0RXBUF;                   // 受信データの読み出し
 }