MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
MSP430G2553 - EEPROMのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
MSP430G2553 - EEPROM
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == <br><br> == EEPROMの種類 == 一般的に、外付けのEEPROMとして使用されているデバイスには、以下のようなものがある。<br> <br> 以下に示すEEPROMは、MSP430マイコンのI2CまたはSPIインターフェースに直接接続して使用することができる。<br> 容量や速度、インターフェースの種類などの要件に応じて選択する。<br> <br> 特に、24LC256は、比較的大容量でI2Cインターフェースを備えているため、MSP430マイコンの組み合わせで広く使用されている人気の高いEEPROMの1つである。<br> <br> ==== 24LC256 (256Kbit I2C EEPROM) ==== * Microchip社製の不揮発性メモリ * I2Cインターフェースを使用 * 32[KB] (256[Kbit]) の容量 * 低消費電力で動作 <br> ==== 25LC640A (64Kbit SPI EEPROM) ==== * Microchip社製の不揮発性メモリ * SPIインターフェースを使用 * 8[KB] (64[Kbit]) の容量 * 高速動作が可能 <br> ==== AT24C32 (32Kbit I2C EEPROM) ==== * Atmel (現Microchip) 社製の不揮発性メモリ * I2Cインターフェースを使用 * 4[KB] (32[Kbit]) の容量 * industryグレードの信頼性 <br><br> == サンプルコード == ==== 24LC256 (256Kbit I2C EEPROM) ==== 以下の例では、I2C通信を使用してEEPROMとの通信を行っている。<br> I2C通信を初期化した後、i2c_write_byte関数を使用してEEPROMにデータを書き込み、i2c_read_byte関数を使用して書き込んだデータを読み出している。<br> <br> # i2c_init関数でI2Cの初期化を行う。<br>ピンの設定、I2Cの設定、クロック周波数の設定等を行う。<br><br>MSP430G2553マイコンのP1.6をSCL、P1.7をSDAに指定している。 #: <br> # i2c_write_byte関数を使用して、指定したアドレスにデータを書き込む。<br>スタートコンディション、アドレスの送信、データの送信、ストップコンディションの順に処理を行う。 #: <br> # i2c_read_byte関数を使用して、指定したアドレスからデータを読み出す。<br>スタートコンディション、アドレスの送信、再スタートコンディション、データの受信、ストップコンディションの順に処理を行う。 <br> 実際に動作させる場合は、回路の接続や電源の供給等にも注意が必要である。<br> <br> <syntaxhighlight lang="c"> #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; // 受信データの読み出し } </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> <br><br> __FORCETOC__ [[カテゴリ:MSP430]]
MSP430G2553 - EEPROM
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse