| (同じ利用者による、間の5版が非表示) | |||
| 86行目: | 86行目: | ||
MSP430F2013のUSIモジュールをI2Cモードで使用する場合、以下のピンを使用する。<br> | MSP430F2013のUSIモジュールをI2Cモードで使用する場合、以下のピンを使用する。<br> | ||
* P1.7 - SDA (I2Cデータライン) | * P1.7 - SDA (I2Cデータライン) | ||
* P1. | * 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と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> | ||
| 119行目: | 207行目: | ||
実際に動作させる場合は、回路の接続や電源の供給等にも注意が必要である。<br> | 実際に動作させる場合は、回路の接続や電源の供給等にも注意が必要である。<br> | ||
特に、I2C通信では、SDAとSCLのラインに2.2[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; | // 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 = | |||
USICKCTL = USIDIV_1 + USISSEL_2; // SMCLK/2を使用 ( | // SPIモード 0を使用する場合 | ||
USICNT |= USIIFGCC; | USICTL1 = 0; // クロック位相 : データはSCLK立上りでキャプチャ、立下りで変化 | ||
USICTL0 &= ~USISWRST; | 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を解除 | |||
} | } | ||