MSP430F149 - USB

提供: MochiuWiki : SUSE, EC, PCB

概要

MSP430F149は、USB機能を内蔵していないため、外付けのUSBコントローラIC (PDIUSBD12等) を使用してUSB通信を行うことができる。
PDIUSBD12は、USB 1.1規格に対応したペリフェラルコントローラICで、8ビットパラレルバスを介してMSP430F149と接続する。

主な接続構成は以下の通りである。


ただし、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


読み出し / 書き込み手順を以下に示す。

  1. コマンドを送信
    A0=0、データバスにコマンドコード、WR#をパルス
  2. データを読み書き
    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規制への適合
  • 寄生容量による影響