MSP430F2013 - ポートピン
概要
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 | 各ピンの入出力方向を設定する ビット = 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 (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をプルダウンに設定
もし、ポートを入力に設定して外部プルアップを使用する場合は、ポートを入力に設定、内部プルアップ / 内部プルダウンは無効にする。
- PxDIR = 0
- 入力方向に設定する。
- PxREN = 0
- 内部プルアップ / 内部プルダウンを無効化する。
- 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のアナログ入力を使用するには、以下に示す手順で設定する。
- SD16AEレジスタで使用するピンを有効化
SD16AEx = 1に設定すると、対応するピンのデジタル入力バッファとシュミットトリガが無効化される- これにより、アナログ信号印加時の寄生電流を防止する
- SD16INCTL0レジスタで入力チャンネルとゲインを設定
- SD16INCHxビットで入力チャンネル (0-7) を選択
- SD16GAINxビットでPGAゲイン (1、2、4、8、16、32) を選択
- 基準電圧の設定
- 内蔵1.2[V]基準を使用する場合 :
SD16REFON = 1 - 外部基準を使用する場合 :
SD16REFON = 0、SD16VMIDON = 0
- 内蔵1.2[V]基準を使用する場合 :
// 例 : 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レジスタ
| レジスタ名 | アドレス | 説明 | リセット値 |
|---|---|---|---|
| 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レジスタ
| レジスタ名 | アドレス | 説明 | リセット値 |
|---|---|---|---|
| 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レジスタ
| レジスタ名 | アドレス | 説明 | リセット値 |
|---|---|---|---|
| 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レジスタ
| レジスタ名 | アドレス | 説明 | リセット値 |
|---|---|---|---|
| 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サイトを参照すること。