MSP430F149 - USB
概要
MSP430F149は、USB機能を内蔵していないため、外付けのUSBコントローラIC (PDIUSBD12等) を使用してUSB通信を行うことができる。
PDIUSBD12は、USB 1.1規格に対応したペリフェラルコントローラICで、8ビットパラレルバスを介してMSP430F149と接続する。
主な接続構成は以下の通りである。
[MSP430F149] <--(8bit Data + Control)--> [PDIUSBD12] <--> [USB Connector]
ただし、PDIUSBD12は入手が困難となっており、新規設計では以下を推奨する。
- USB機能内蔵マイコン (MSP430F5xxx、MSP432シリーズ) への移行
- USB-UARTブリッジIC (FT232RL、CP2102N等) の使用
USB-UARTブリッジICを使用する方法は、実装が容易で、MSP430F149のUSART0/USART1を利用でき、ホスト側のドライバサポートも充実している。
使用可能なUSBコントローラ
MSP430F149はUSBコントローラを内蔵していないため、USB通信を実装するにはPDIUSBD12等の外付けのUSBコントローラチップが必要となる。
ただし、PDIUSBD12は現在入手が難しくなってきており、新規設計では推奨されない。
そのため、USBコントローラ機能が内蔵されているMSP430F5xxxシリーズやMSP432シリーズに移行、あるいは、USB-UARTブリッジIC (FT232RL等) を使用する。
特に、USB-UARTブリッジICを使用する方法は実装が容易であり、MSP430F149のUART機能 (USART0 / USART1) を利用できる。
また、USB-UARTブリッジICでは、ホスト側のドライバも広くサポートされている。
入手可能な主なUSBコントローラチップを以下に示す。
Microchip社
- MCP2200
- USB-UARTコントローラ
- MCP2221/A
- USB-UART/I2Cコントローラ
- USB2512B / USB2513B
- USBハブコントローラ
FTDI社
- FT232RL / FT232H
- USB-UARTコントローラ (産業標準的な製品)
- FT2232H
- デュアルUSB-UART/FIFO
- FT4232H
- クワッドUSB-UART/FIFO
WCH社
- CH340
- 低コストのUSB-UARTコントローラ
- CH375
- 汎用USBインターフェースコントローラ
Silicon Labs社
- CP2102N
- USB-UARTブリッジ
- CP2130
- USB-SPIブリッジ
※注意
- インターフェース要件
- UART接続が必要な場合は、FT232RLやCP2102Nがよく使用されている。MSP430F149はUSART0 / USART1を搭載しているため、容易に接続可能である。
- SPI / I2C接続が必要な場合は、MCP2221AやCP2130が適切である。MSP430F149はUSART1をSPIモードで使用できる。
- 価格帯
- CH340は低コスト
- FTDI、Microchipの製品は信頼性重視の中価格帯
- 入手性
- FTDI、Microchip、WCHの製品は世界的に流通が安定
- 開発サポート
- FTDI、Microchipの製品は豊富な開発ツールとドキュメントが利用可能であり、サポート体制が充実している。
MSP430F149の特徴
MSP430F149は、Texas Instrumentsの16ビットRISCマイコンで、以下に示す特徴を持つ。
- 60[KB] Flash ROM
- 2[KB] RAM
- 最大8[MHz]動作 (外部クロック使用時)
- USART0 / USART1 (UART、SPI、I2C対応)
- 12ビットADC
- タイマA/B
- 48ピン (LQFP、DIP)
- 低消費電力設計
※注意
MSP430F149は古い世代のマイコンであるため、新規設計ではMSP430F5xxxシリーズやMSP432シリーズへの移行を推奨する。
USBコントローラIC
PDIUSBD12
PDIUSBD12は、フィリップス社 (現NXPセミコンダクターズ) が開発したUSBペリフェラルコントローラICである。
このICは、特に、マイコンベースのシステムにUSB機能を追加する時のインターフェースコントローラとして使用されてきた。
ただし、このICは古い世代の製品であり、現在は新しい設計には一般的にUSB機能を内蔵したマイコンを使用することが多い。
- USB 1.1規格に準拠しており、フルスピード (12[Mbps]) をサポートしている。
- 8ビットパラレルインターフェースを介してマイコンと接続可能。
- 内蔵のUSBトランシーバ
- エンドポイント・バッファメモリを搭載 (Main Endpoint、Endpoint 1、Endpoint 2)
- 低消費電力設計
- サスペンド/レジューム機能
PDIUSBD12とMSP430F149の接続
PDIUSBD12とMSP430F149は、8ビットパラレルバスで接続する。
接続ピン
- D0-D7:
- データバス (MSP430F149のP1.0〜P1.7 または P2.0〜P2.7)
- A0
- アドレス選択 (MSP430F149の任意のGPIO 例: P3.0)
- RD#
- リード信号 (MSP430F149の任意のGPIO 例: P3.1)
- WR#
- ライト信号 (MSP430F149の任意のGPIO 例: P3.2)
- CS#
- チップセレクト (MSP430F149の任意のGPIO 例: P3.3)
- INT_N
- 割り込み信号 (MSP430F149のP1.2等の割り込み対応ピン)
PDIUSBD12のレジスタとコマンド
PDIUSBD12は、コマンドベースのインターフェースを持つ。
主要なコマンドを以下に示す。
- 0x00 : Set Address / Enable
- 0x01 : Endpoint Enable
- 0x02 : Set Mode
- 0x03 : Set DMA
- 0x0A : Read Interrupt Register
- 0x0F : Read Last Transaction Status
- 0x40 : Select Endpoint (Main Endpoint)
- 0x41: Select Endpoint (Endpoint 1)
- 0x42 : Select Endpoint (Endpoint 2)
- 0xF0 : Read Buffer
- 0xF1 : Write Buffer
読み出し / 書き込み手順を以下に示す。
- コマンドを送信
- A0=0、データバスにコマンドコード、WR#をパルス
- データを読み書き
- A0=1、RD#またはWR#をパルス
サンプルコード
ハードウェア接続
MSP430F149のP2ポート (P2.0〜P2.7) を8ビットデータバスとして使用して、P3ポートを制御信号として使用する。
| MSP430F149 | PDIUSBD12 | 機能 | 説明 |
|---|---|---|---|
| P2.0 | D0 | データバス | データビット0 |
| P2.1 | D1 | データバス | データビット1 |
| P2.2 | D2 | データバス | データビット2 |
| P2.3 | D3 | データバス | データビット3 |
| P2.4 | D4 | データバス | データビット4 |
| P2.5 | D5 | データバス | データビット5 |
| P2.6 | D6 | データバス | データビット6 |
| P2.7 | D7 | データバス | データビット7 |
| P3.0 | A0 | 制御信号 | アドレス選択 0 : コマンド 1 : データ |
| P3.1 | RD# | 制御信号 | リード信号 (アクティブLow) |
| P3.2 | WR# | 制御信号 | ライト信号 (アクティブLow) |
| P3.3 | CS# | 制御信号 | チップセレクト (アクティブLow) |
| P3.4 | RESET# | 制御信号 | リセット信号 (アクティブLow) |
| P1.2 | INT_N | 割り込み | 割り込み信号 (アクティブLow) |
メインプログラム
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマの停止
// DCO設定 (約8[MHz])
BCSCTL1 = RSEL0 | RSEL1 | RSEL2;
DCOCTL = DCO0 | DCO1 | DCO2;
pdiusbd12_init(); // PDIUSBD12初期化
__enable_interrupt(); // グローバル割り込み有効
while (1) {
__bis_SR_register(LPM0_bits + GIE); // 低消費電力モード
}
}
GPIO初期化
void pdiusbd12_gpio_init(void)
{
DATA_PORT_DIR = 0xFF; // P2を出力に設定
CTRL_PORT_DIR |= 0x1F; // P3.0〜P3.4を出力に設定
CS_HIGH(); RD_HIGH(); WR_HIGH(); // 制御信号を初期化
INT_PORT_DIR &= ~BIT2; // P1.2を入力に設定
INT_PORT_IE |= BIT2; // 割り込み有効化
}
PDIUSBD12デバイスの初期化
void pdiusbd12_init(void)
{
pdiusbd12_gpio_init(); // GPIO初期化
pdiusbd12_reset(); // ハードウェアリセット
// Set Modeコマンド (クロック有効、割り込み有効)
pdiusbd12_write_command(0x02); // CMD_SET_MODE
pdiusbd12_write_data(0x0E); // モード設定
pdiusbd12_write_data(0x00);
// Endpoint Enableコマンド
pdiusbd12_write_command(0x01); // CMD_ENDPOINT_ENABLE
pdiusbd12_write_data(0x01);
// ソフトコネクト有効化 (USBバスに接続)
pdiusbd12_write_command(0x02);
pdiusbd12_write_data(0x1E); // SoftConnect有効
pdiusbd12_write_data(0x00);
}
コマンド / データ読み書き
// コマンド送信
void pdiusbd12_write_command(uint8_t cmd)
{
CS_LOW(); A0_LOW(); // CS=Low, A0=0 (コマンド)
DATA_PORT_OUT = cmd; // コマンドを出力
WR_LOW(); WR_HIGH(); // WR#パルス
CS_HIGH(); // CS = High
}
// データ書き込み
void pdiusbd12_write_data(uint8_t data)
{
CS_LOW(); A0_HIGH(); // CS=Low, A0=1 (データ)
DATA_PORT_OUT = data; // データを出力
WR_LOW(); WR_HIGH(); // WR#パルス
CS_HIGH();
}
// データ読み込み
uint8_t pdiusbd12_read_data(void)
{
uint8_t data;
DATA_PORT_DIR = 0x00; // P2を入力に設定
CS_LOW(); A0_HIGH(); // CS=Low, A0=1 (データ)
RD_LOW(); // RD#=Low
data = DATA_PORT_IN; // データを読み取り
RD_HIGH();
CS_HIGH(); // CS = High
return data;
}
割り込み処理
// PORT1割り込みハンドラ
#pragma vector=PORT1_VECTOR
__interrupt void Port1_ISR(void)
{
if (INT_PORT_IFG & BIT2) {
INT_PORT_IFG &= ~BIT2; // フラグクリア
// 割り込みステータスを読み出し
pdiusbd12_write_command(0x0A); // CMD_READ_INTERRUPT_REG
uint8_t int_lo = pdiusbd12_read_data();
uint8_t int_hi = pdiusbd12_read_data();
// セットアップパケット受信処理
if (int_lo & 0x01) {
usb_handle_setup_packet();
}
}
}
USBセットアップパケット処理
void usb_handle_setup_packet(void)
{
uint8_t setup[8];
// セットアップパケットを読み出し
pdiusbd12_select_endpoint(0); // EP0選択
pdiusbd12_write_command(0xF0); // CMD_READ_BUFFER
pdiusbd12_read_data(); // 予約バイト
uint8_t len = pdiusbd12_read_data();
for (int i = 0; i < len; i++) {
setup[i] = pdiusbd12_read_data();
}
// リクエストに応じた処理
uint8_t request = setup[1];
if (request == 0x06) { // GET_DESCRIPTOR
usb_send_descriptor();
}
else if (request == 0x05) { // SET_ADDRESS
usb_set_address(setup[2]);
}
}
USBコントローラ搭載のMSP430マイコン
TIのMSP430シリーズには、USB機能を内蔵したマイコンがいくつか存在する。
- MSP430F5xxxシリーズ : MSP430F5527 / MSP430F5528 / MSP430F5529等
- USB 2.0フルスピード (12[Mbps]) 対応
- USBブートローダ機能搭載
- 内蔵LDO (USB用の3.3[V]電源回路)
- 豊富なペリフェラル (ADC、タイマ、UART等)
- 128[KB] フラッシュROM
- 8〜10[KB] RAM
VBUSラインの電源フィルタ
USBコネクタにおいて、VBUS端子にLCフィルタ等の電源フィルタを構成する場合がある。
これは、入力電源のリップル除去、負荷変動による電圧変動の抑制、デカップリング (高周波ノイズの除去) が目的である。

- USB 1.1 / 2.0の場合
- フルスピード (12[Mbps])、ハイスピード (480[Mbps]) では比較的低周波であり、電源ノイズの影響が比較的少ないため、数10[uH]程度。
- 一般的に47[uH]〜100[uH]のインダクタと、100[uF]程度のコンデンサを使用する。
- USB 3.x
- 電源の応答性確保および大きな電流 (900[mA]以上) に対応する必要があり、高速信号 (5[Gbps]以上) のため、より小さい値 (数十〜数百[nH]) を選択する。
- インダクタの自己共振周波数 (SRF) にも注意が必要となる。
インダクタ選定の注意
- シールドインダクタまたはフェライトコアを使用したインダクタを選定する。
- 定格電流は使用する電流の1.5倍以上を確保する。
- EMI規制への適合
- 寄生容量による影響