📢 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> | ||