ページの作成:「== 概要 == EEPROM (Electrically Erasable Programmable Read-Only Memory) は、電気的に消去、書き込み可能な不揮発性メモリの1種である。<br> <br> EEPROMは、マイコンのシステムで、不揮発性のデータ保存が必要な場合に広く使用されている。<br> フラッシュメモリと比較して書き換え回数が多く、バイト単位のアクセスが可能な点が特徴である。<br> <br> ただし、書き換…」
 
 
(同じ利用者による、間の6版が非表示)
86行目: 86行目:
MSP430F2013のUSIモジュールをI2Cモードで使用する場合、以下のピンを使用する。<br>
MSP430F2013のUSIモジュールをI2Cモードで使用する場合、以下のピンを使用する。<br>
* P1.7 - SDA (I2Cデータライン)
* P1.7 - SDA (I2Cデータライン)
* P1.5 - SCL (I2Cクロックライン)
* P1.6 - SCL (I2Cクロックライン)
<br>
<br>
I2C通信では、SDAとSCLの両方のラインに外部プルアップ抵抗 (通常4.7[kΩ]~10[kΩ]) が必要である。<br>
I2C通信では、SDAとSCLの両方のラインに外部プルアップ抵抗 (通常4.7[kΩ]~10[kΩ]) が必要である。<br>
複数のデバイスをI2Cバスに接続する場合は、それぞれのデバイスに異なるアドレスを設定する。<br>
複数のデバイスをI2Cバスに接続する場合は、それぞれのデバイスに異なるアドレスを設定する。<br>
<br>
<br>
USIモジュールのピン機能を有効化するには、USICTL0レジスタでUSIPE7とUSIPE5ビットをセットする。<br>
USIモジュールのピン機能を有効化するには、USICTL0レジスタでUSIPE7とUSIPE6ビットをセットする。<br>
また、USIPE5ビットはSPI等と共用している場合があるため、セットしてもよい。<br>
<br>
<br>
==== SPI接続 ====
==== SPI接続 ====
104行目: 105行目:
<br>
<br>
USIモジュールのピン機能を有効化するには、USICTL0レジスタでUSIPE7、USIPE6、USIPE5ビットをセットする。<br>
USIモジュールのピン機能を有効化するには、USICTL0レジスタでUSIPE7、USIPE6、USIPE5ビットをセットする。<br>
<br><br>
== USI (Universal Serial Interface) ==
MSP430F2013のUSI (Universal Serial Interface) をSPIマスタとして使用する。<br>
<br>
==== SPIモード ====
SPIには4種類の動作モードが存在しており、以下に示す2つのパラメータで定義される。<br>
<br>
* CPOL (Clock POLarity)
*: クロックのアイドル状態
* CPHA (Clock PHAse)
*: データのサンプリングタイミング
<br>
<center>
{| class="wikitable"
! SPI Mode !! CPOL !! CPHA !! クロック待機状態 !! データ取得エッジ
|-
| Mode 0 || 0 || 0 || Low || 立上り
|-
| Mode 1 || 0 || 1 || Low || 立下り
|-
| Mode 2 || 1 || 0 || High || 立下り
|-
| Mode 3 || 1 || 1 || High || 立上り
|}
</center>
<br>
==== USICKPH / USICKPL と SPIモードの対応 ====
MSP430F2013のUSIでは、SPIモードは以下に示す2ビットで決定される。<br>
<br>
<center>
{| class="wikitable"
! USIビット !! 意味
|-
| USICKPL || クロック極性 (CPOL)
|-
| USICKPH || クロック位相 (CPHA)
|}
</center>
<br>
<center>
{| class="wikitable"
|+ 対応表
! SPIモード !! USICKPL !! USICKPH
|-
| モード 0 || 0 || 0
|-
| モード 1 || 0 || 1
|-
| モード 2 || 1 || 0
|-
| モード 3 || 1 || 1
|}
</center>
<br>
==== USIOE (USI Output Enable) ====
USIOE (USI Output Enable)は、USIがピンを出力として駆動するかどうかを制御するビットである。<br>
<br>
SPIマスタ動作時では、以下に示す信号をMSP430F2013側が生成する必要がある。<br>
このため、SPIマスタでは <code>USIOE = 1</code> が必須となる。<br>
* SCLK (クロック)
*: 出力
* MOSI
*: 出力
* MISO
*: 入力
<br>
仮に、<code>USIOE = 0</code> の場合、以下に示すようにSPI通信は成立しない。<br>
* SCLKが出力されない。
* MOSIがハイインピーダンス (Hi-Z) となる。
<br>
==== MOSI / MISOが方向切替されない理由 ====
SPI通信はフルデュプレックス通信であり、データ線の方向は固定である。<br>
<br>
USIが内部的に入出力方向を固定管理するため、P1DIRレジスタを直接操作する必要はない。<br>
これは、1本の双方向データ線を使うI2C通信との大きな違いである。<br>
<br>
<center>
{| class="wikitable"
! 信号 !! 方向
|-
| MOSI || マスター --> スレーブ
|-
| MISO || スレーブ --> マスター
|}
</center>
<br><br>
<br><br>


118行目: 206行目:
<br>
<br>
実際に動作させる場合は、回路の接続や電源の供給等にも注意が必要である。<br>
実際に動作させる場合は、回路の接続や電源の供給等にも注意が必要である。<br>
特に、I2C通信では、SDAとSCLのラインに4.7[kΩ]~10[kΩ]のプルアップ抵抗を接続する必要がある。<br>
特に、I2C通信では、SDAとSCLのラインに2.2[kΩ]~10[kΩ]のプルアップ抵抗を接続する必要がある。<br>
<br>
MSP430F2013では、USIのI2C機能はPort 1の以下に示すピンに固定されている。<br>
* P1.6
*: USI SCL
* P1.7
*: USI SDA
<br>
<br>
下図に、MSP430F2013と24LC256のシーケンス図を示す。<br>
下図に、MSP430F2013と24LC256のシーケンス図を示す。<br>
164行目: 258行目:
  {
  {
     USICTL0 = USIPE7 + USIPE6 + USIPE5 + USIMST + USISWRST;  // ポート有効、マスタ、SW Reset
     USICTL0 = USIPE7 + USIPE6 + USIPE5 + USIMST + USISWRST;  // ポート有効、マスタ、SW Reset
     USICTL1 = USII2C + USIIE;                                 // I2Cモード、割り込み有効
                                                            // USIPE7 : P1.7をUSI機能 (SDA) として有効
                                                            // USIPE6 : P1.6をUSI機能 (SCL) として有効
                                                            // USIPE5 : I2Cでは通常未使用であるが、SPI等との共用ビットのため含まれていることがある
                                                            // USIMST : マスターモード
                                                            // USISWRST : USIソフトウェアリセット
     USICTL1 = USII2C + USIIE;                               // I2Cモード、割り込み有効
     USICKCTL = USIDIV_7 + USISSEL_2 + USICKPL;              // SMCLK/128、クロック極性
     USICKCTL = USIDIV_7 + USISSEL_2 + USICKPL;              // SMCLK/128、クロック極性
     USICNT |= USIIFGCC;                                      // USICNTで自動クリア無効
     USICNT |= USIIFGCC;                                      // USICNTで自動クリア無効
276行目: 375行目:


==== 25LC640A (64Kbit SPI EEPROM) ====
==== 25LC640A (64Kbit SPI EEPROM) ====
<u>25LC640Aが対応するSPIモードは、SPIモード 0 / 3 である。</u><br>
25LC640Aでは、SPIモード 1 / 2 は仕様外のため注意すること。<br>
<br>
一般的で扱いやすいモードは、SPIモード 0である。<br>
ただし、ノイズ耐性を考慮する場合は、SPIモード 3も選択可能である。<br>
<br>
<center>
{| class="wikitable"
|+ 25LC640AのSPIモード対応表
! SPIモード !! 対応可否
|-
| Mode 0 || ○
|-
| Mode 1 || -
|-
| Mode 2 || -
|-
| Mode 3 || ○
|}
</center>
<br>
以下の例では、SPI通信を使用してEEPROMとの通信を行っている。<br>
以下の例では、SPI通信を使用してEEPROMとの通信を行っている。<br>
SPIの初期化後、eeprom_write_byte関数を使用してEEPROMにデータを書き込み、eeprom_read_byte関数を使用して書き込んだデータを読み出している。<br>
SPIの初期化後、eeprom_write_byte関数を使用してEEPROMにデータを書き込み、eeprom_read_byte関数を使用して書き込んだデータを読み出している。<br>
339行目: 459行目:
     // USIをSPIマスターモードで初期化
     // USIをSPIマスターモードで初期化
     USICTL0 = USIPE7 + USIPE6 + USIPE5 + USIMST + USIOE + USISWRST; // ピン有効、マスタ、出力有効
     USICTL0 = USIPE7 + USIPE6 + USIPE5 + USIMST + USIOE + USISWRST; // ピン有効、マスタ、出力有効
     USICTL1 = USICKPH;             // クロック位相: データはSCLK立下りでキャプチャ、立上りで変化
     USICKCTL = USIDIV_1 + USISSEL_2; // SMCLK/2を使用 (約500kHz)
    // SPIモード 0を使用する場合
     USICNT |= USIIFGCC;             // USICNTで自動クリア無効
     USICTL1 = 0;                     // クロック位相 : データはSCLK立上りでキャプチャ、立下りで変化
     USICTL0 &= ~USISWRST;           // SW Resetを解除
     USICKCTL = USIDIV_1 + USISSEL_2; // SMCLK / 2を使用 (約500[kHz])
    // SPIモード 3を使用する場合
    // USICTL1 = USICKPH;                        // クロック位相 : データはSCLK立下りでキャプチャ、立下りで変化
    // USICKCTL = USIDIV_1 + USISSEL_2 + USICKPL; // Mode 1,1用にクロック極性を反転
     USICNT |= USIIFGCC;               // USICNTで自動クリア無効
     USICTL0 &= ~USISWRST;             // SW Resetを解除
  }
  }