概要

MSP430F2013では、ポート1 / ポート2の2つのポートがあり、合計10本のGPIOを持つ。

  • P1.0からP1.7までの8本のピンがポート1
  • P2.6とP2.7の2本のピンがポート2 (クリスタルオシレータ専用ピン)


各ポートピンは入力、出力、特殊機能のいずれかに設定できる。
特殊機能には、Timer_A、USI (SPI/I2C)、SD16_A (16ビットデルタシグマADC) 等がある。

各ポートには、それぞれ3つの8ビットレジスタがある。

  • PxDIR
    各ピンの入出力方向を設定
  • PxIN
    各ピンの入力値を読み取り
  • PxOUT
    各ピンの出力値を設定


また、割り込み機能をサポートしており、各ポートにはそれぞれ割り込み用のレジスタがある。

  • P1IE
  • P2IE
    割り込みを有効化
  • P1IES
  • P2IES
    割り込みエッジ選択
  • P1IFG
  • P2IFG
    割り込みフラグ


プルアップ / プルダウン抵抗を内蔵しており、各ポートのPxRENレジスタで有効化することができる。

MSP430F2013のポートピンは柔軟で多機能であり、センサーアプリケーションに適している。
各レジスタを適切に設定することにより、目的に合わせて各ポートピンを構成することができる。


2つの動作モード

MSP430F2013マイコンでは、各ポートピンには複数の機能を割り当てることができる。
これらの機能は、ピンの動作モードと呼ばれている。

MSP430F2013では、MSP430G2553シリーズとは異なり、PxSEL2レジスタは存在せず、PxSELレジスタのみを使用してピンの動作モードを選択する。

各ポートピンには、以下に示す2つの動作モードがある。

  • I/O機能 (デジタル入出力)
  • ペリフェラル機能


PxSELレジスタにより、これらの動作モードが選択される。

  • I/O機能 (デジタル入出力)
    PxSEL = 0
  • ペリフェラル機能
    PxSEL = 1


USI通信 (SPI / I2C) の場合、使用するピン (例 : P1.5、P1.6、P1.7) をペリフェラル機能に設定する必要がある。
以下の例では、P1SELに値を設定している。

 // USI SPIモードの設定例
 // P1.5: SCLK、P1.6: SDO、P1.7: SDI
 
 P1SEL |= BIT5 + BIT6 + BIT7;  // ペリフェラル機能を有効化
 
 USICTL0 = USIPE7 + USIPE6 + USIPE5 + USISWRST;   // USIポート有効化、リセット
 USICTL1 = USICKPH;                               // クロック位相設定
 USICKCTL = USIDIV_1 + USISSEL_2;                 // クロック設定
 USICTL0 &= ~USISWRST;                            // USIリセット解除


したがって、P1SELに適切な値を設定することにより、ピンの動作モードをペリフェラル機能に設定し、USI通信に必要なピン機能を有効にしている。


ペリフェラル機能の詳細

MSP430F2013のペリフェラル機能は、各ピンに割り当てられた複数の特殊機能を表している。
これらの機能は、ピンの動作モードと呼ばれ、PxSELレジスタを使用して選択される。

これらの機能を使い分けることにより、限られたピン数で多様な機能を実現することができる。
ピンの動作モードを適切に設定することにより、目的のペリフェラル機能を有効にして、マイコンを効率的に活用することができる。

MSP430F2013では、各ピンに複数の機能が割り当てられているため、マイコンのデータシートを参照して、各ピンに割り当てられている機能を確認する必要がある。
また、同じピンに複数の機能を同時に割り当てることはできないため、使用する機能に応じてピンの設定を適切に行う必要がある。

Timer_A機能

Timer_Aは16ビットのタイマ / カウンタで、キャプチャ / コンペア機能を持つ。
MSP430F2013では、Timer_A2 (2チャンネル) が搭載されている。

Timer_A関連のピン機能には、以下に示すものがある。

  • TACLK
    Timer_Aの外部クロック入力
  • TA0
    Timer_Aチャンネル0のキャプチャ入力 / コンペア出力
  • TA1
    Timer_Aチャンネル1のキャプチャ入力 / コンペア出力


これらの機能はPWM出力、パルス幅測定、イベントタイミング測定等に使用される。

PxSEL = 1 の設定で有効になる。

USI機能

USI (Universal Serial Interface) は、SPI通信とI2C通信をサポートする多機能シリアル通信モジュールである。

USI関連のピン機能には、以下に示すものがある。

  • SCLK
    SPIモードのクロック信号、I2Cモードでは未使用
  • SDO / SCL
    SPIモードのデータ出力、I2Cモードのクロックライン
  • SDI / SDA
    SPIモードのデータ入力、I2Cモードのデータライン


USI機能を使用する場合は、対応するピンのPxSELビットを1に設定して、さらにUSICTL0レジスタのUSIPExビットで各ピンを個別に有効化する必要がある。

PxSEL = 1 かつ USIPEx = 1 の設定で有効になる。

SD16_A アナログ入力機能

SD16_A (16ビットデルタシグマADC) は、高精度な差動アナログ入力機能を提供する。
MSP430F2013では、最大4チャンネルの差動入力 (A0-A3) が使用可能である。

各チャンネルは正入力 (+) と負入力 (-) のペアで構成される。

  • A0+ / A0- (チャンネル0)
    P1.0が正入力、P1.1が負入力
  • A1+ / A1- (チャンネル1)
    P1.2が正入力、P1.3が負入力
  • A2+ / A2- (チャンネル2)
    P1.4が正入力、P1.5が負入力
  • A3+ / A3- (チャンネル3)
    P1.6が正入力、P1.7が負入力


さらに、P1.1とP1.2はA4チャンネルの差動入力 (A4+ / A4-) としても使用できる。

SD16_Aのアナログ入力を使用する場合は、SD16AEレジスタで対応するビットを1に設定する。
これにより、デジタル入力バッファとシュミットトリガが無効化され、寄生電流を防止する。

SD16AEx = 1 の設定で有効になる。

クロック出力機能

システムクロックを外部に出力する機能である。

クロック出力機能には、以下に示すものがある。

  • ACLK
    補助クロック出力 (通常32.768[kHz])
  • SMCLK
    サブシステムメインクロック出力 (通常DCO周波数)


これらは外部デバイスへのクロック供給やデバッグ時の動作確認に使用される。

PxSEL = 1 の設定で有効になる。

基準電圧機能

SD16_Aモジュールは、内部1.2[V]基準電圧を持ち、これを外部に出力することができる。

基準電圧機能には以下がある。

  • VREF
    内部基準電圧出力 / 外部基準電圧入力


P1.3がVREF端子として機能する。
内部基準電圧を外部に出力する場合は、SD16VMIDONビットを1に設定して、外部に0.1[uF]〜0.47[uF]のコンデンサを接続する。

PxSEL = 1 かつ SD16VMIDON = 1 の設定で出力される。

クリスタルオシレータ機能

MSP430F2013では、低周波クリスタルオシレータ (LFXT1) をサポートしており、P2.6 / P2.7ピンがクリスタル接続用として使用される。

クリスタルオシレータ機能には、以下に示すものがある。

  • XIN
    クリスタルオシレータ入力
  • XOUT
    クリスタルオシレータ出力


32.768[kHz]の時計用水晶振動子を接続して、低消費電力なACLKソースとして使用するのが一般的である。

PxSEL = 1 かつ 適切なBCSCTL3レジスタ設定で有効になる。

JTAG機能

JTAG (Joint Test Action Group) は、マイコンのデバッグとプログラミングに使用される標準インターフェースである。

JTAG関連のピン機能には以下がある。

  • TCK
    テストクロック
  • TMS
    テストモード選択
  • TDI
    テストデータ入力
  • TDO
    テストデータ出力


これらのピンはJTAGモード時に自動的に有効になり、内部プルアップ / プルダウン抵抗は無効化される。
通常のアプリケーション動作時は、これらのピンを通常のI/Oまたは他のペリフェラル機能として使用できる。

JTAGモードで自動的に有効になる。


ポート1のピン機能詳細

MSP430F2013のポート1は8本のピン (P1.0〜P1.7) から構成され、各ピンは複数の機能を持つ。
各ピンの詳細な機能を以下に示す。

P1.0 / TACLK / ACLK / A0+

  • P1.0
    汎用デジタル入出力
  • TACLK
    Timer_Aの外部クロック入力
  • ACLK
    補助クロック出力 (通常32.768[kHz])
  • A0+
    SD16_A チャンネル0の正入力


設定方法は以下の通りである。

  • デジタルI/O
    P1SEL.0 = 0
  • TACLK / ACLK
    P1SEL.0 = 1、P1DIR.0で入力 / 出力を選択
  • A0+
    SD16AE.0 = 1 (P1SELは任意)


P1.1 / TA0 / A0- / A4+

  • P1.1
    汎用デジタル入出力
  • TA0
    Timer_Aチャンネル0のキャプチャ入力 (CCI0A) / コンペア出力 (Out0)
  • A0-
    SD16_A チャンネル0の負入力
  • A4+
    SD16_A チャンネル4の正入力


設定方法

  • デジタルI/O
    P1SEL.1 = 0
  • TA0
    P1SEL.1 = 1、P1DIR.1で入力/出力を選択
  • A0-/A4+
    SD16AE.1 = 1 (P1SELは任意)


P1.2 / TA1 / A1+ / A4-

  • P1.2
    汎用デジタル入出力
  • TA1
    Timer_Aチャンネル1のキャプチャ入力 (CCI1A) / コンペア出力 (Out1)
  • A1+
    SD16_A チャンネル1の正入力
  • A4-
    SD16_A チャンネル4の負入力


設定方法

  • デジタルI/O
    P1SEL.2 = 0
  • TA1
    P1SEL.2 = 1、P1DIR.2で入力/出力を選択
  • A1+/A4-
    SD16AE.2 = 1 (P1SELは任意)


P1.3 / VREF / A1-

  • P1.3
    汎用デジタル入出力
  • VREF
    外部基準電圧入力/内部基準電圧出力
  • A1-
    SD16_A チャンネル1の負入力


設定方法

  • デジタルI/O
    P1SEL.3 = 0
  • VREF
    SD16VMIDON = 1で出力、SD16REFON = 0かつSD16VMIDON = 0で外部基準入力
  • A1-
    SD16AE.3 = 1 (P1SELは任意)


P1.4 / SMCLK / A2+ / TCK

  • P1.4
    汎用デジタル入出力
  • SMCLK
    サブシステムメインクロック出力
  • A2+
    SD16_A チャンネル2の正入力
  • TCK
    JTAGテストクロック入力


設定方法

  • デジタルI/O
    P1SEL.4 = 0 (JTAGモードでない場合)
  • SMCLK
    P1SEL.4 = 1、P1DIR.4 = 1
  • A2+
    SD16AE.4 = 1 (P1SELは任意)
  • TCK
    JTAGモードで自動設定


P1.5 / TA0 / SCLK / A2- / TMS

  • P1.5
    汎用デジタル入出力
  • TA0
    Timer_Aチャンネル0のコンペア出力 (Out0)
  • SCLK
    USI SPIクロック (SPIマスタモードで出力、スレーブモードで入力)
  • A2-
    SD16_A チャンネル2の負入力
  • TMS
    JTAGテストモード選択入力


設定方法

  • デジタルI/O
    P1SEL.5 = 0 (JTAGモードでない場合)
  • TA0
    P1SEL.5 = 1、P1DIR.5 = 1、USIPE5 = 0
  • SCLK
    P1SEL.5 = 1、USIPE5 = 1
  • A2-
    SD16AE.5 = 1 (P1SELは任意)
  • TMS
    JTAGモードで自動設定


P1.6 / TA1 / SDO / SCL / A3+ / TDI

  • P1.6
    汎用デジタル入出力
  • TA1
    Timer_Aチャンネル1のキャプチャ入力 (CCI1B) /コンペア出力 (Out1)
  • SDO/SCL
    USI SPIデータ出力 (SPIモード) / I2Cクロック (I2Cモード)
  • A3+
    SD16_A チャンネル3の正入力
  • TDI
    JTAGテストデータ入力またはテストクロック入力


設定方法

  • デジタルI/O
    P1SEL.6 = 0 (JTAGモードでない場合)
  • TA1
    P1SEL.6 = 1、P1DIR.6で入力/出力を選択、USIPE6 = 0
  • SDO/SCL
    P1SEL.6 = 1、USIPE6 = 1
  • A3+
    SD16AE.6 = 1 (P1SELは任意)
  • TDI
    JTAGモードで自動設定


P1.7 / SDI / SDA / A3- / TDO / TDI

  • P1.7
    汎用デジタル入出力
  • SDI/SDA
    USI SPIデータ入力 (SPIモード) / I2Cデータ (I2Cモード)
  • A3-
    SD16_A チャンネル3の負入力
  • TDO/TDI
    JTAGテストデータ出力またはテストデータ入力


設定方法

  • デジタルI/O
    P1SEL.7 = 0 (JTAGモードでない場合)
  • SDI/SDA
    P1SEL.7 = 1、USIPE7 = 1
  • A3-
    SD16AE.7 = 1 (P1SELは任意)
  • TDO/TDI
    JTAGモードで自動設定



ポート2のピン機能詳細

MSP430F2013のポート2は2本のピン P2.6 / P2.7 から構成される。
これらのピンは、クリスタルオシレータ用として設計されている。

P2.6/XIN/TA1

  • P2.6
    汎用デジタル入出力
  • XIN
    低周波クリスタルオシレータ (LFXT1) の入力端子
  • TA1
    Timer_Aチャンネル1のコンペア出力 (Out1)


設定方法

  • デジタルI/O
    P2SEL.6 = 0
  • XIN
    P2SEL.6 = 1、BCSCTL3.LFXT1Sx = 00 / 01 / 10でクリスタルモード
  • XIN (デジタルクロック入力)
    P2SEL.6 = 1、BCSCTL3.LFXT1Sx = 11
  • TA1
    P2SEL.6 = 1、P2DIR.6 = 1、BCSCTL3でLFXT1オフ


※注意

  • 32.768[kHz]の水晶発振器を接続する場合は、P2SEL.6とP2SEL.7の両方を1に設定する。
  • クリスタルを使用しない場合でも、P2.6とP2.7を適切に初期化することを推奨する。


P2.7 / XOUT

  • P2.7
    汎用デジタル入出力
  • XOUT
    低周波クリスタルオシレータ (LFXT1) の出力端子


設定方法

  • デジタルI/O
    P2SEL.7 = 0
  • XOUT
    P2SEL.7 = 1、BCSCTL3.LFXT1Sx = 00/01/10でクリスタルモード


※注意

  • リセット後、P2.7 / XOUTをデジタル入力として使用する場合、P2SEL.7をクリアするまで余分な電流が流れる可能性がある。
  • これは、リセット後にオシレータ出力ドライバがこのピンに接続されているためである。
  • そのため、リセット後できるだけ早くP2SEL.7を適切に設定することを推奨する。



ポートの入出力

ポートの入出力方向はPxDIR (Port x Direction) レジスタで設定する。
入力ポートとして使用する場合でも、プルアップ抵抗を使用するためにPxOUTを設定することができる。

PxDIRレジスタ / PxOUTレジスタの役割
レジスタ名 説明
PxDIR 各ピンの入出力方向を設定する

ビット = 1 : 出力方向
ビット = 0 : 入力方向
PxOUT ピンが出力時 : 出力値 (High / Low) の設定
ピンが入力時: プルアップ / プルダウン抵抗の選択


 // 例 : スイッチ入力の場合の一般的な設定
 
 // P1.3を入力ポートに設定
 // 内部プルアップ抵抗を有効
 // スイッチOFF時はHighとなる
 // スイッチON時 (GND接続時) はLowとなる
 
 P1DIR &= ~BIT3;  // P1.3を入力に設定
 P1REN |= BIT3;   // P1.3の内部抵抗を有効化
 P1OUT |= BIT3;   // P1.3をプルアップに設定


 // 例 : LED出力の場合の一般的な設定
 
 // P1.0を出力ポートに設定
 // 初期状態でLEDを消灯 (Low)
 
 P1DIR |= BIT0;   // P1.0を出力に設定
 P1OUT &= ~BIT0;  // P1.0をLowに設定 (LED消灯)
 
 // LEDを点灯させる場合
 P1OUT |= BIT0;   // P1.0をHighに設定 (LED点灯)



プルアップ / プルダウンの設定

PxREN (Port x Resistor Enable) レジスタ と PxOUTレジスタを組み合わせて使用することにより、プルアップ / プルダウンを設定できる。
この設定により、内部プルアップ抵抗または内部プルダウン抵抗が有効になる。

MSP430F2013の内部プルアップ / プルダウン抵抗の抵抗値は、標準的に20[kΩ]〜50[kΩ]の範囲である。

PxREN / PxOUTレジスタ
レジスタ名 説明
PxREN
(Port x Resistor Enable)
内部抵抗の有効 / 無効を設定する

ビット = 0: 内部抵抗が無効
ビット = 1: 内部抵抗が有効
PxOUT
(Port x Output)
プルアップ / プルダウンを設定する

PxREN = 1、PxOUT = 1の場合: プルアップ
PxREN = 1、PxOUT = 0の場合: プルダウン


 // 例: P1.3をプルアップする場合
 
 P1DIR &= ~BIT3; // P1.3を入力に設定
 P1REN |= BIT3;  // P1.3の内部抵抗を有効化
 P1OUT |= BIT3;  // P1.3をプルアップに設定


 // 例: P1.4をプルダウンする場合
 
 P1DIR &= ~BIT4; // P1.4を入力に設定
 P1REN |= BIT4;  // P1.4の内部抵抗を有効化
 P1OUT &= ~BIT4; // P1.4をプルダウンに設定


もし、ポートを入力に設定して外部プルアップを使用する場合は、ポートを入力に設定、内部プルアップ / 内部プルダウンは無効にする。

  1. PxDIR = 0
    入力方向に設定する。
  2. PxREN = 0
    内部プルアップ / 内部プルダウンを無効化する。
  3. PxOUT = 0
    PxOUTは、PxRENが0 (プルアップ / プルダウン無効) の場合でも、入力ポートの読み取り値に影響を与える可能性がある。
    PxOUTを0に設定することにより、意図しない動作を防ぐことができる。


なお、PxSELは、デジタルI/Oとして使用する場合は、0に設定する必要がある。

※注意
内部プルアップと外部プルアップを同時に使用することは推奨されない。

  • 並列抵抗となるため、実効的なプルアップ抵抗値が下がる。
  • 無駄な電流消費につながる。
  • 内部プルアップと外部プルアップで異なる電圧レベルに引っ張られる可能性がある。
  • 高精度や特定の抵抗値が必要な場合は、外部プルアップのみを使用する。
  • それ以外の場合は内部プルアップのみを使用する。


また、ペリフェラル機能選択時 (PxSEL = 1) にPxRENを有効にすることは推奨されない。

  • 一部のデバイスでは、ペリフェラル機能選択中にプルアップ / プルダウン抵抗を有効にすると、論理出力ドライバが無効にならない場合がある。
  • これにより、内部抵抗を通じて不要な電流が流れる可能性がある。



割り込み機能

ポート1とポート2は、ピン状態の変化を検出する割り込み機能を持つ。
各ピンは個別に割り込みを有効化でき、立ち上がりエッジまたは立ち下がりエッジを選択できる。

ポート1の全てのI/Oラインは単一の割り込みベクタを共有し、ポート2の全てのI/Oラインは別の単一の割り込みベクタを共有する。

割り込みレジスタ

各ポートには、割り込み制御用の3つのレジスタがある。

割り込みレジスタ
レジスタ名 説明
PxIE
(Port x Interrupt Enable)
各ピンの割り込みを個別に有効化する

ビット = 0: 割り込み無効
ビット = 1: 割り込み有効
PxIES
(Port x Interrupt Edge Select)
割り込みをトリガするエッジを選択する

ビット = 0: 立ち上がりエッジ (Low -> High) で割り込み
ビット = 1: 立ち下がりエッジ (High -> Low) で割り込み
PxIFG
(Port x Interrupt Flag)
各ピンの割り込みフラグ
選択したエッジが検出されると自動的にセットされる

ビット = 0: 割り込み保留なし
ビット = 1: 割り込み保留中

ソフトウェアでクリアする必要がある
ソフトウェアでセットすることも可能 (ソフトウェア割り込み)


割り込みの動作

各PxIFGフラグは、対応するPxIEビットとGIE (Global Interrupt Enable) ビットが両方ともセットされている場合に割り込み要求を発生させる。

静的なレベルではなく、遷移のみが割り込みを引き起こす。
したがって、ピンが既にHighまたはLowの状態で割り込みを有効にしても、割り込みは発生しない。

割り込みを発生させるには、ピンの状態が変化する必要がある。

割り込み使用時の注意事項

ペリフェラル機能選択時 (PxSEL = 1) は、対応するピンの割り込み機能は無効になる。
したがって、これらのピンの信号は、対応するPxIEビットの状態に関係なく、P1またはP2の割り込みを生成しない。

ピンがペリフェラル機能の入力として選択されている場合、ペリフェラルへの入力信号はデバイスピンの信号をラッチした表現である。
PxSEL = 1の間、内部入力信号はピンの信号に従う。

ただし、PxSEL = 0にリセットされると、ペリフェラルへの入力は、PxSELビットがリセットされる前のデバイスピンの入力信号の値を保持する。

 // 例: P1.3の立ち下がりエッジ割り込み設定
 
 P1DIR &= ~BIT3;  // P1.3を入力に設定
 P1REN |= BIT3;   // P1.3の内部抵抗を有効化
 P1OUT |= BIT3;   // P1.3をプルアップに設定
 
 P1IES |= BIT3;   // P1.3の割り込みを立ち下がりエッジに設定
 P1IFG &= ~BIT3;  // P1.3の割り込みフラグをクリア
 P1IE |= BIT3;    // P1.3の割り込みを有効化
 
 __enable_interrupt(); // グローバル割り込み有効化 (GIE = 1)


 // 例: ポート1割り込みサービスルーチン
 
 #pragma vector=PORT1_VECTOR
 __interrupt void Port_1(void)
 {
    if (P1IFG & BIT3)
    {
       // P1.3の割り込み処理
       // 何らかの処理を実行
 
       P1IFG &= ~BIT3;  // P1.3の割り込みフラグをクリア
    }
 }


外部信号が割り込みフラグをセットするための最小パルス幅は、データシートに記載されている。
MSP430F2013では、20[ns]以上のパルス幅が必要である。

最小割り込みパルス幅が満たされると、外部信号は毎回割り込みフラグをセットする。

また、割り込みパルス幅より短いトリガ信号でもフラグがセットされる可能性がある。


SD16_Aアナログ入力の使用

MSP430F2013では、高精度な16ビットシグマデルタADC (SD16_A) が搭載されており、差動アナログ入力をサポートしている。

SD16_Aの主な特徴

  • 16ビット分解能のデルタシグマADC
  • 最大4チャンネルの差動入力 (A0-A3)
  • プログラマブルゲインアンプ (PGA)
    ゲイン1、2、4、8、16、32
  • 内蔵1.2[V]基準電圧
  • 外部基準電圧入力対応
  • 最大1.1[MHz]のモジュレータ周波数
  • 低消費電力モード対応


アナログ入力チャンネル

MSP430F2013では、差動入力チャンネルが使用可能である。

  • チャンネル0 (A0+/A0-)
    P1.0 (正入力)、P1.1 (負入力)
  • チャンネル1 (A1+/A1-)
    P1.2 (正入力)、P1.3 (負入力)
  • チャンネル2 (A2+/A2-)
    P1.4 (正入力)、P1.5 (負入力)
  • チャンネル3 (A3+/A3-)
    P1.6 (正入力)、P1.7 (負入力)
  • チャンネル4 (A4+/A4-)
    P1.1 (正入力)、P1.2 (負入力)


さらに、内部チャンネルとして以下が利用可能である。

  • チャンネル5 (A5)
    電源電圧測定用の抵抗分圧回路
  • チャンネル6 (A6)
    内部温度センサ
  • チャンネル7 (A7)
    ショート接続 (オフセット較正用)


アナログ入力の設定方法

SD16_Aのアナログ入力を使用するには、以下に示す手順で設定する。

  1. SD16AEレジスタで使用するピンを有効化
    SD16AEx = 1 に設定すると、対応するピンのデジタル入力バッファとシュミットトリガが無効化される
    これにより、アナログ信号印加時の寄生電流を防止する
  2. SD16INCTL0レジスタで入力チャンネルとゲインを設定
    SD16INCHxビットで入力チャンネル (0-7) を選択
    SD16GAINxビットでPGAゲイン (1、2、4、8、16、32) を選択
  3. 基準電圧の設定
    内蔵1.2[V]基準を使用する場合 : SD16REFON = 1
    外部基準を使用する場合 : SD16REFON = 0SD16VMIDON = 0


 // 例 : SD16_A チャンネル0 (P1.0 / P1.1) の設定
 
 // アナログ入力ピンの有効化
 SD16AE = SD16AE0 + SD16AE1;        // P1.0とP1.1をアナログ入力として有効化
 
 // SD16_Aの設定
 SD16CTL = SD16REFON + SD16SSEL_1;  // 内蔵1.2V基準ON、ACLKを選択
 
 // チャンネル0の設定
 SD16INCTL0 = SD16INCH_0;           // チャンネル0を選択 (A0+ / A0-)
 SD16CCTL0 = SD16IE;                // 変換完了割り込み有効
 
 // 変換開始
 SD16CCTL0 |= SD16SC;                // 変換開始


フルスケール入力電圧範囲

各チャンネルのフルスケール入力電圧範囲は、PGAゲイン設定によって決まる。
最大フルスケール範囲は ±VFSR であり、VFSRは以下の式で定義される。

 

# 計算例 :
内蔵1.2[V]基準を使用し、ゲイン = 1の場合、最大フルスケール入力範囲を計算する。

 


各ゲイン設定に対するフルスケール範囲 (バイポーラモード) は以下の通りである。

  • ゲイン1
    ±600[mV]
  • ゲイン2
    ±300[mV]
  • ゲイン4
    ±150[mV]
  • ゲイン8
    ±75[mV]
  • ゲイン16
    ±37.5[mV]
  • ゲイン32
    ±18.75[mV]


アナログ入力範囲は、フルスケール範囲の80[%]以下に収めることが推奨されている。

基準電圧

SD16_Aモジュールは内蔵1.2[V]基準電圧を持ち、SD16REFONビットで有効化される。

内蔵基準を使用する場合、ノイズ低減のためにVREF端子 (P1.3) に0.1[uF]のコンデンサを接続することが推奨される。

内蔵基準電圧を外部に出力する場合は、SD16VMIDON = 1に設定する。
このとき、バッファ出力は最大1[mA]まで駆動できる。
外部に出力する場合は、VREF端子に0.47[nF]のコンデンサを接続する必要がある。

外部基準電圧を使用する場合は、SD16REFONとSD16VMIDONの両方を0に設定し、VREF端子に外部基準電圧を印加する。

変換データの読み取り

変換が完了すると、SD16MEM0レジスタに16ビットの変換結果が格納される。
データフォーマットは、SD16UNIビットによって選択される。

  • バイポーラモード (SD16UNI = 0)
    2の補数形式
    範囲
    -32768 (-VFSR) 〜 +32767 (+VFSR)
  • ユニポーラモード (SD16UNI = 1)
    オフセットバイナリ形式
    範囲
    0 (0V) 〜 65535 (+VFSR)


 // 例: SD16_A変換結果の読み取り (バイポーラモード)
 
 int16_t adc_result;
 float voltage;
 
 // 変換完了を待つ (割り込みまたはポーリング)
 while (!(SD16CCTL0 & SD16IFG));
 
 // 変換結果を読み取る
 adc_result = SD16MEM0;
 
 // 電圧に変換 (ゲイン1、VREF=1.2Vの場合)
 voltage = (adc_result / 32768.0) * 0.6;  // ±0.6V範囲



USI通信機能の使用

MSP430F2013では、USI (Universal Serial Interface) モジュールが搭載されており、SPI通信とI2C通信をサポートしている。

USIの主な特徴

  • 3線式SPI通信対応
  • I2C通信対応
  • 可変データ長 (1〜16ビット)
  • LPM4でのスレーブ動作可能 (内部クロック不要)
  • MSBファーストまたはLSBファーストのデータ順選択可能
  • I2Cモード用のSTARTおよびSTOP検出機能
  • 自動SCL制御機能
  • マスタモードでの調停喪失検出機能
  • プログラマブルクロック生成
  • クロック極性と位相の選択可能


USI関連ピン

MSP430F2013のUSIは、以下の3本のピンを使用する。

  • P1.5 / SCLK
    SPIクロック (マスタモードで出力、スレーブモードで入力)、I2Cモードでは未使用
  • P1.6 / SDO / SCL
    SPIデータ出力 (SPIモード)、I2Cクロック (I2Cモード)
  • P1.7 / SDI / SDA
    SPIデータ入力 (SPIモード)、I2Cデータ (I2Cモード)


USI SPIモードの設定

USIをSPIモードで使用する場合、USII2Cビットを0に設定する。
USICKPLビットでクロックの非アクティブレベルを選択し、USICKPHビットでSDOの更新とSDIのサンプリングが行われるクロックエッジを選択する。

USIピンを有効化するには、USIPE5、USIPE6、USIPE7ビットを設定する必要がある。

 // 例: USI SPIマスタモードの初期化
 
 // ピンの設定
 P1SEL |= BIT5 + BIT6 + BIT7;  // P1.5、P1.6、P1.7をUSI機能に設定
 
 // USIの設定
 USICTL0 = USIPE7 + USIPE6 + USIPE5 + USIMST + USISWRST;
 // USIPE7: SDI / SDA有効
 // USIPE6: SDO / SCL有効
 // USIPE5: SCLK有効
 // USIMST: マスタモード
 // USISWRST: USIリセット状態
 
 USICTL1 = USICKPH;  // データは最初のSCLKエッジでキャプチャされ、次のエッジで変更される
 
 USICKCTL = USIDIV_1 + USISSEL_2 + USISWCLK;
 // USIDIV_1: クロック分周比 1/2
 // USISSEL_2: SMCLK選択
 // USISWCLK: ソフトウェアクロック無効
 
 USICTL0 &= ~USISWRST;  // USIリセット解除


 // 例: USI SPIデータ送受信
 
 unsigned char SPITransfer(unsigned char data)
 {
    USISRL = data;         // 送信データをシフトレジスタに書き込む
    USICNT = 8;            // 8ビット転送を開始
 
    while (!(USICTL1 & USIIFG));  // 転送完了を待つ
 
    return USISRL;         // 受信データを読み取る
 }


USI I2Cモードの設定

USIをI2Cモードで使用する場合、USII2Cビットを1に設定する。
I2Cモードでは、自動的にUSICKPL = 1、USICKPH = 0、USILSB = 0、USI16B = 0に設定される。

I2Cモードでは、START条件とSTOP条件の自動検出、SCLの自動ホールド制御、調停喪失検出などの機能が利用できる。

 // 例 : USI I2Cマスタモードの初期化
 
 // ピンの設定
 P1SEL |= BIT6 + BIT7;  // P1.6とP1.7をUSI機能に設定
 P1DIR |= BIT6;         // P1.6 (SCL) を出力に設定
 
 // USIの設定
 USICTL0 = USIPE7 + USIPE6 + USIMST + USISWRST;
 // USIPE7: SDA有効
 // USIPE6: SCL有効
 // USIMST: マスタモード
 // USISWRST: USIリセット状態
 
 USICTL1 = USII2C + USIIE + USISTTIE;
 // USII2C: I2Cモード有効
 // USIIE: USIカウンタ割り込み有効
 // USISTTIE: START条件割り込み有効
 
 USICKCTL = USIDIV_3 + USISSEL_2 + USISWCLK;
 // USIDIV_3: クロック分周比 1/8
 // USISSEL_2: SMCLK選択
 
 USICTL0 &= ~USISWRST;  // USIリセット解除


USIクロック設定

USIのクロックソースは、USISSELxビットで選択される。

  • 000
    SCLK (外部クロック)
  • 001
    ACLK
  • 010
    SMCLK
  • 011
    SMCLK
  • 100
    USISWCLK (ソフトウェアクロック)
  • 101
    Timer_A0 (TA0)
  • 110
    Timer_A1 (TA1)
  • 111
    Timer_A2 (TA2)


選択したクロックは、USIDIVxビットで1、2、4、8、16、32、64、128のいずれかに分周できる。

生成されたクロックUSICLKは、USIIFG = 1の場合、またはスレーブモードで動作している場合に停止する。

USI割り込み

USIモジュールには、2つの割り込みフラグがある。

  • USIIFG
    USICNTxが0になると自動的にセットされる
    USIIFGCC = 0の場合、USICNTxに0より大きい値を書き込むと自動的にクリアされる
  • USISTTIFG (I2Cモードのみ)
    START条件が検出されるとセットされる
    ソフトウェアでクリアする必要がある


各割り込みフラグには、対応する割り込み有効ビット (USIIEとUSISTTIE) がある。


レジスタ一覧

下表に、MSP430F2013のポート関連レジスタとそのアドレスを示す。

ポート1レジスタ

ポート1レジスタ
レジスタ名 アドレス 説明 リセット値
P1IN 020h ポート1入力レジスタ -
P1OUT 021h ポート1出力レジスタ 不定
P1DIR 022h ポート1方向レジスタ 00h
P1IFG 023h ポート1割り込みフラグレジスタ 00h
P1IES 024h ポート1割り込みエッジ選択レジスタ 00h
P1IE 025h ポート1割り込み有効レジスタ 00h
P1SEL 026h ポート1機能選択レジスタ 00h
P1REN 027h ポート1抵抗有効レジスタ 00h


ポート2レジスタ

ポート2レジスタ
レジスタ名 アドレス 説明 リセット値
P2IN 028h ポート2入力レジスタ -
P2OUT 029h ポート2出力レジスタ 不定
P2DIR 02Ah ポート2方向レジスタ 00h
P2IFG 02Bh ポート2割り込みフラグレジスタ 00h
P2IES 02Ch ポート2割り込みエッジ選択レジスタ 00h
P2IE 02Dh ポート2割り込み有効レジスタ 00h
P2SEL 02Eh ポート2機能選択レジスタ 00h
P2REN 02Fh ポート2抵抗有効レジスタ 00h


USIレジスタ

USIレジスタ
レジスタ名 アドレス 説明 リセット値
USICTL0 078h USI制御レジスタ0 01h
USICTL1 079h USI制御レジスタ1 01h
USICKCTL 07Ah USIクロック制御レジスタ 00h
USICNT 07Bh USIビットカウンタレジスタ 00h
USISRL 07Ch USI下位バイトシフトレジスタ 不定
USISRH 07Dh USI上位バイトシフトレジスタ 不定


SD16_Aレジスタ

SD16_Aレジスタ
レジスタ名 アドレス 説明 リセット値
SD16INCTL0 0B0h SD16_Aチャンネル0入力制御レジスタ 00h
SD16AE 0B7h SD16_Aアナログ入力有効レジスタ 00h
SD16CTL 100h SD16_A制御レジスタ 0020h
SD16CCTL0 102h SD16_Aチャンネル0制御レジスタ 0000h
SD16MEM0 110h SD16_Aチャンネル0変換メモリレジスタ 不定



リセット後のデフォルト状態

MSP430F2013のリセット後、ポートピンはデフォルト状態になる。

ポート1のデフォルト状態

  • P1DIR = 00h
    全てのピンが入力方向に設定
  • P1SEL = 00h
    全てのピンがデジタルI/O機能に設定
  • P1REN = 00h
    全てのピンでプルアップ / プルダウン抵抗が無効
  • P1IE = 00h
    全てのピンで割り込みが無効
  • P1IES = 00h
    全てのピンで立ち上がりエッジ割り込みに設定 (有効化されていない)
  • P1IFG = 00h
    全てのピンの割り込みフラグがクリア
  • P1OUT = 不定
    出力値は不定 (入力方向のため影響なし)


ポート2のデフォルト状態

  • P2DIR = 00h
    全てのピンが入力方向に設定
  • P2SEL = 00h
    P2.6とP2.7がデジタルI/O機能に設定
    ※注意
    リセット後のデフォルトは00hだが、クリスタルオシレータが有効な場合は適切に設定する必要がある。
  • P2REN = 00h
    全てのピンでプルアップ / プルダウン抵抗が無効
  • P2IE = 00h
    全てのピンで割り込みが無効
  • P2IES = 00h
    全てのピンで立ち上がりエッジ割り込みに設定 (有効化されていない)
  • P2IFG = 00h
    全てのピンの割り込みフラグがクリア
  • P2OUT = 不定
    出力値は不定 (入力方向のため影響なし)


その他

リセット後、P2.7 / XOUT端子は特別な注意が必要である。

リセット直後、オシレータ出力ドライバがP2.7ピンに接続されているため、P2.7をデジタル入力として使用する場合、P2SEL.7をクリアするまで余分な電流が流れる可能性がある。
そのため、クリスタルオシレータを使用しない場合は、初期化コードでできるだけ早くP2SEL.7を0にクリアすることを推奨する。

 // 例: クリスタルオシレータを使用しない場合の初期化
 
 void Port_Init(void)
 {
    // ポート1の初期化
    P1DIR = 0x00;   // 全て入力
    P1SEL = 0x00;   // 全てデジタルI/O
    P1REN = 0x00;   // プルアップ / プルダウン無効
    P1OUT = 0x00;   // 出力値をクリア
 
    // ポート2の初期化 (クリスタルオシレータ未使用)
    P2DIR = 0x00;   // 全て入力
    P2SEL = 0x00;   // 全てデジタルI/O (重要: P2.7の余分な電流を防ぐ)
    P2REN = 0x00;   // プルアップ / プルダウン無効
    P2OUT = 0x00;   // 出力値をクリア
 }



サンプルコード

例1 : LED点滅

 #include <msp430f2013.h>
 
 int main(void)
 {
    WDTCTL = WDTPW + WDTHOLD;  // ウォッチドッグタイマ停止
 
    // P1.0をLED出力として設定
    P1DIR |= BIT0;   // P1.0を出力に設定
    P1OUT &= ~BIT0;  // 初期状態でLEDを消灯
 
    while (1)
    {
       P1OUT ^= BIT0;  // P1.0をトグル (LEDの点滅)
 
       // 簡易ディレイ
       __delay_cycles(100000);
    }
 }


例2 : スイッチ入力とLED制御

 #include <msp430f2013.h>
 
 int main(void)
 {
    WDTCTL = WDTPW + WDTHOLD;  // ウォッチドッグタイマ停止
 
    // P1.0をLED出力として設定
    P1DIR |= BIT0;
    P1OUT &= ~BIT0;
 
    // P1.3をスイッチ入力として設定 (プルアップ有効)
    P1DIR &= ~BIT3;
    P1REN |= BIT3;
    P1OUT |= BIT3;
 
    while (1)
    {
       if (!(P1IN & BIT3))  // スイッチが押された (Low)
       {
          P1OUT |= BIT0;    // LEDを点灯
       }
       else
       {
          P1OUT &= ~BIT0;   // LEDを消灯
       }
    }
 }


例3 : ポート1割り込みによるLED制御

 #include <msp430f2013.h>
 
 int main(void)
 {
    WDTCTL = WDTPW + WDTHOLD;  // ウォッチドッグタイマ停止
 
    // P1.0をLED出力として設定
    P1DIR |= BIT0;
    P1OUT &= ~BIT0;
 
    // P1.3をスイッチ入力として設定 (プルアップ有効、割り込み有効)
    P1DIR &= ~BIT3;
    P1REN |= BIT3;
    P1OUT |= BIT3;
    P1IES |= BIT3;   // 立ち下がりエッジで割り込み
    P1IFG &= ~BIT3;  // 割り込みフラグをクリア
    P1IE |= BIT3;    // 割り込みを有効化
 
    __enable_interrupt();     // グローバル割り込み有効化
 
    while (1)
    {
       __low_power_mode_3();  // LPM3に入る (割り込みで復帰)
    }
 }
 
 // ポート1割り込みサービスルーチン
 #pragma vector=PORT1_VECTOR
 __interrupt void Port_1(void)
 {
    if (P1IFG & BIT3)
    {
       P1OUT ^= BIT0;   // LEDをトグル
       P1IFG &= ~BIT3;  // 割り込みフラグをクリア
    }
 }


例4 : SD16_A ADC測定

 #include <msp430f2013.h>
 
 volatile int16_t adc_result;
 
 int main(void)
 {
    WDTCTL = WDTPW + WDTHOLD;  // ウォッチドッグタイマ停止
 
    // SD16_Aアナログ入力の設定 (チャンネル0 : P1.0 / P1.1)
    SD16AE = SD16AE0 + SD16AE1;  // P1.0とP1.1をアナログ入力として有効化
 
    // SD16_Aの設定
    SD16CTL = SD16REFON + SD16SSEL_1;  // 内蔵1.2[V]基準ON、ACLKを選択
 
    // チャンネル0の設定
    SD16INCTL0 = SD16INCH_0;  // チャンネル0 (A0+ / A0-) を選択
    SD16CCTL0 = SD16IE;       // 変換完了割り込み有効
 
    __enable_interrupt();  // グローバル割り込み有効化
 
    while (1)
    {
       SD16CCTL0 |= SD16SC;  // 変換開始
 
       __low_power_mode_0();  // LPM0に入る (割り込みで復帰)
 
       // adc_resultに変換結果が格納されている
       // ここで変換結果を処理
       // ...略
    }
 }
 
 // SD16_A割り込みサービスルーチン
 #pragma vector=SD16_VECTOR
 __interrupt void SD16ISR(void)
 {
    adc_result = SD16MEM0;           // 変換結果を読み取る
    __low_power_mode_off_on_exit();  // LPMから復帰
 }


例5 : USI SPI通信

 #include <msp430f2013.h>
 
 void USI_SPI_Init(void);
 unsigned char SPI_Transfer(unsigned char data);
 
 int main(void)
 {
    WDTCTL = WDTPW + WDTHOLD;  // ウォッチドッグタイマ停止
 
    USI_SPI_Init();  // USI SPIモード初期化
 
    while (1)
    {
       unsigned char tx_data = 0xA5;
       unsigned char rx_data;
 
       rx_data = SPI_Transfer(tx_data);  // データ送受信
 
       __delay_cycles(100000);
    }
 }
 
 void USI_SPI_Init(void)
 {
    // ピンの設定
    P1SEL |= BIT5 + BIT6 + BIT7;  // P1.5、P1.6、P1.7をUSI機能に設定
 
    // USIの設定
    USICTL0 = USIPE7 + USIPE6 + USIPE5 + USIMST + USISWRST;
    USICTL1 = USICKPH;
    USICKCTL = USIDIV_1 + USISSEL_2;
 
    USICTL0 &= ~USISWRST;  // USIリセット解除
 }
 
 unsigned char SPI_Transfer(unsigned char data)
 {
    USISRL = data;         // 送信データをシフトレジスタに書き込む
    USICNT = 8;            // 8ビット転送を開始
 
    while (!(USICTL1 & USIIFG));  // 転送完了を待つ
 
    return USISRL;         // 受信データを読み取る
 }



参考情報

  • MSP430F20x1、MSP430F20x2、MSP430F20x3データシート (SLAS491)
    ピン配置、電気的特性、機能仕様
  • MSP430x2xx Family User's Guide (SLAU144)
    デジタルI/O、USI、SD16_A、Timer_Aの詳細仕様
  • MSP430F2013 Errata (SLAZ156)
    既知の問題と回避策


最新の情報については、Texas Instruments社の公式Webサイトを参照すること。