📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

ページの作成:「== 概要 == <br><br> == EEPROMの種類 == 一般的に、外付けのEEPROMとして使用されているデバイスには、以下のようなものがある。<br> <br> 以下に示すEEPROMは、MSP430マイコンのI2CまたはSPIインターフェースに直接接続して使用することができる。<br> 容量や速度、インターフェースの種類などの要件に応じて選択する。<br> <br> 特に、24LC256は、比較的大容量でI2…」
 
121行目: 121行目:
   
   
     return UCB0RXBUF;                  // 受信データの読み出し
     return UCB0RXBUF;                  // 受信データの読み出し
}
</syntaxhighlight>
<br>
==== 25LC640A (64Kbit SPI EEPROM) ====
以下の例では、SPI通信を使用してEEPROMとの通信を行っている。<br>
SPIの初期化後、eeprom_write_byte関数を使用してEEPROMにデータを書き込み、eeprom_read_byte関数を使用して書き込んだデータを読み出している。<br>
<br>
# spi_init関数でSPIの初期化を行う。<br>ピンの設定、SPIの設定、クロック周波数の設定等を行う。
#: <br>
# eeprom_write_byte関数を使用して、指定したアドレスにデータを書き込む。<br><code>WREN</code>コマンドで書き込み有効化して、<code>WRITE</code>コマンドでアドレスとデータを送信する。
#: <br>
# eeprom_read_byte関数を使用して、指定したアドレスからデータを読み出す。<br><code>READ</code>コマンドでアドレスを送信して、データを受信する。
<br>
実際に動作させる場合は、回路の接続や電源の供給等にも注意が必要である。<br>
特に、25LC640AのCS (チップセレクト) ピンは、適切なポートピンに接続して、ソースコード内で設定する必要がある。<br>
<br>
<syntaxhighlight lang="c">
#include <msp430.h>
// CSピンの設定 (例: P1.4)
#define EEPROM_CS_PIN BIT4
void spi_init();
void spi_send(unsigned char data);
unsigned char spi_receive();
void eeprom_write_byte(unsigned int address, unsigned char data);
unsigned char eeprom_read_byte(unsigned int address);
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;      // ウォッチドッグタイマーを停止
    P1DIR |= EEPROM_CS_PIN;        // CSピンを出力に設定
    P1OUT |= EEPROM_CS_PIN;        // CSピンをハイに設定
    spi_init();                    // SPIの初期化
    unsigned char data  = 0xAA;    // 書き込むデータ
    unsigned int address = 0x1000;  // EEPROMのメモリアドレス
    eeprom_write_byte(address, data);                    // EEPROMにデータを書き込み
    unsigned char read_data = eeprom_read_byte(address); // EEPROMからデータを読み出し
    while(1); // 無限ループ
}
void spi_init()
{
    P1SEL  |= BIT5 | BIT6 | BIT7;                            // SPI用のピン設定(SCLK, MOSI, MISO)
    P1SEL2 |= BIT5 | BIT6 | BIT7;
    UCB0CTL1 |= UCSWRST;                                    // SPIの無効化(設定変更のため)
    UCB0CTL0 |= UCCKPL | UCMSB | UCMST | UCMODE_0 | UCSYNC;  // SPIマスターモード, 8ビット, MSBファースト, アイドル時クロック高, 同期モード
    UCB0CTL1 |= UCSSEL_2;                                    // SMCLK (1MHz) を選択
    UCB0BR0  |= 0x02;                                        // SPIクロック周波数を1[MHz] / 2 = 500[kHz]に設定
    UCB0BR1  = 0;
    UCB0CTL1 &= ~UCSWRST;                                    // SPIの有効化
}
void spi_send(unsigned char data)
{
    while (!(IFG2 & UCB0TXIFG));  // 送信バッファが空になるまで待機
    UCB0TXBUF = data;            // データを送信バッファに書き込み
}
unsigned char spi_receive()
{
    while (!(IFG2 & UCB0RXIFG));  // 受信バッファにデータが入るまで待機
    return UCB0RXBUF;            // 受信データを返す
}
void eeprom_write_byte(unsigned int address, unsigned char data)
{
    P1OUT &= ~EEPROM_CS_PIN;          // CSピンをLowに設定
    spi_send(0x06);                  // WREN (書き込み有効化) コマンド
    P1OUT |= EEPROM_CS_PIN;          // CSピンをハイに設定
    __delay_cycles(100);              // 100[uS]
    P1OUT &= ~EEPROM_CS_PIN;          // CSピンをロウに設定
    spi_send(0x02);                  // WRITE (書き込み) コマンド
    spi_send((address >> 8) & 0xFF);  // アドレス上位バイト
    spi_send(address & 0xFF);        // アドレス下位バイト
    spi_send(data);                  // データ
    P1OUT |= EEPROM_CS_PIN;          // CSピンをHighに設定
    __delay_cycles(5000);            // 書き込み時間分待機
}
unsigned char eeprom_read_byte(unsigned int address)
{
    unsigned char data;
    P1OUT &= ~EEPROM_CS_PIN;          // CSピンをLowに設定
    spi_send(0x03);                  // READ (読み出し) コマンド
    spi_send((address >> 8) & 0xFF);  // アドレス上位バイト
    spi_send(address & 0xFF);        // アドレス下位バイト
    data = spi_receive();            // データ受信
    P1OUT |= EEPROM_CS_PIN;          // CSピンをHighに設定
    return data;
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>