[MSP430] USCI-SPI


ここではMSP 430 G 2553 MCUに基づいて記述する.
詳細は製品シリーズによって異なる場合があります.

1.USCI-SPIとは?


シリアルエージェントインタフェース(SPI)は、UARTと同様に、チップ間でデータを交換するためのシリアル通信プロトコルである.3本または4本の回線を使用し、シフトレジスタを使用するのが特徴です.UARTやI 2 Cに比べて通信速度が速いという利点がある.
MSP 430 x 2 xxモデルでは、USCIモジュールのSPIモードを用いてSPI通信を行うことができる.
USCI AとUSCI Bは両方ともSPIをサポートしているので、どちらかのモードをSPIモードとして選択することができる.

2.USCI-SPI特性


USCI-SPIの特徴は以下の通りである.
  • 7- or 8-bit data length
  • LSB-first or MSB-first data transmit and receive
  • 3-pin and 4-pin SPI operation
  • Master or slave modes
  • Independent transmit and receive shift registers
  • Separate transmit and receive buffer registers
  • Continuous transmit and receive operation
  • Selectable clock polarity and phase control
  • Programmable clock frequency in master mode
  • Independent interrupt capability for receive and transmit
  • Slave operation in LPM4
  • いくつか見てみましょう.
  • 3-pin and 4-pin SPI operation
  • SPI通信回線は、3ピンまたは4ピンに設定することができる.3針は一般的なCLK、SIMO、SOMIを指し、4針は3針にSTE線を加えたものを指す.STEはSlave Transmit Enableの略で、1つのバスに複数のプライマリノードが存在するピンです.
  • Independent interrupt capability for receive and transmit
  • SPI TXとRXに対してそれぞれ独立してISRを記述できるそうです.
  • Slave operation in LPM4
  • LPM 4モードでSlaveモードで動作できるそうです.

    3.USCI-SPIチャート


    USCI-SPIのグラフは以下の通りです.

    USCI-UARTで説明した内容とほぼ似ています.(実際にも似ています).選択したクロックソースを乗算器または除算器、極性および位相制御することによってSPIクロックを生成し、出力およびTX、RXモジュールをCLKピンで挿入する.TXモジュールはクロックに従ってデータを伝送し、RXモジュールはクロックに従ってデータを受信する.

    4.相関レジスタ


    USCI-SPIに関するレジスタは以下のようになります.UCAとUCBの2つの共通の部分を合わせてUCXで表現します.
  • UCXxCTLy - USCI_Xx control register
  • UCXxBRy - USCI_Xx baud rate control register
  • UCXxSTAT - USCI_Xx status register
  • UCXxRXBUF - USCI_Xx receive buffer register
  • UCXxTXBUF - USCI_Xx transmit buffer register
  • IE2 - SFR interrupt enable register 2
  • IFG2 - SFR interrupt flag register 2
  • UC1IE - USCI_X1 interrupt enable register
  • UC1IFG - USCI_X1 interrupt flag register
  • 1. UCXxCTLy


    SPI通信を初期化するためのレジスタ.

    2. UCXxBRy


    SPIクロック周波数を設定するレジスタです.

    3. UCXxSTAT


    各種状態関連フラグを管理するレジスタ.

    4. UCXxRXBUF


    SPI RXバッファレジスタ.

    5. UCXxTXBUF


    SPI TXバッファレジスタ.

    6. IE2


    UCA 0、UCB 0のTX、RX割り込みをアクティブにするレジスタ.

    7. IFG2


    UCA 0,UCB 0のTX,RX割り込みフラグレジスタ.

    8. UC1IE


    UCA 1,UCB 1のTX,RXはアクティブレジスタを中断する.

    9. UC1IFG


    UCA 1,UCB 1のTX,RX割り込みフラグレジスタ.

    5.準備物


    SPIを使用する最も一般的な方法は、MCU制御を使用してSPIをサポートするアナログまたはデジタルセンサである.しかし、これは別個のセンサを必要とするので、本明細書の例では、MSP 430 G 2553の2つのUSCI−SPIをプライマリノードおよびスレーブノードとして使用する.
    2つのUSCI−SPIで使用されるGPIO対が異なるため、それらを接続するために1本のジャンプ線が必要である.ジャンプラインを3本用意しましょう(SIMO, SOMI, CLK)
    文章を書く考えですが、ジャケットの糸さえなかったらどうしますか?

    6.例


    2つの例を見てみましょう.例では、制御センサの例を除外します.
  • USCI A 0を用いた三線通信(Master)
  • USCI B 0を用いた三線通信(slave)
  • 1.USCI A 0による三線通信(Master)


    USCI A 0を使用してMasterモードでSPIを使用する例.全部で5本の線を使います.
  • P1.2 -> Data Out (UCA0SIMO)
  • P1.1 <- Data In (UCA0SOMI)
  • P1.4 -> Serial Clock Out (UCA0CLK)
  • P1.0 -> LED
  • P1.5 -> Slave reset
  • 以下に、1から1に数字を増やし、slaveにSPI通信を送信する例を示す.次のコードはマスターコードに使用され、従属コードは例2のコードを使用すればよい.
    #include <msp430.h>
    
    unsigned char MST_Data, SLV_Data;
    
    int main(void)
    {
        volatile unsigned int i;
    
        WDTCTL = WDTPW + WDTHOLD;                    // Stop watchdog timer
    
        P1OUT = 0x00;                                // P1 setup for LED & reset output
        P1DIR |= BIT0 + BIT5;
        P1SEL = BIT1 + BIT2 + BIT4;
        P1SEL2 = BIT1 + BIT2 + BIT4;
    
        UCA0CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC; // 3-pin, 8-bit SPI master
        UCA0CTL1 |= UCSSEL_2;                        // SMCLK
        UCA0BR0 |= 0x02;                             // /2
        UCA0BR1 = 0;                                 //
        UCA0MCTL = 0;                                // No modulation
        UCA0CTL1 &= ~UCSWRST;                        // **Initialize USCI state machine**
    
        IE2 |= UCA0RXIE;                             // Enable USCI0 RX interrupt
    
        P1OUT &= ~BIT5;                              // Now with SPI signals initialized,
        P1OUT |= BIT5;                               // reset slave
    
        __delay_cycles(75);                          // Wait for slave to initialize
    
        MST_Data = 0x01;                             // Initialize data values
        SLV_Data = 0x00;
    
        UCA0TXBUF = MST_Data;                        // Transmit first character
    
        __bis_SR_register(LPM0_bits + GIE);          // CPU off, enable interrupts
    }
    
    #pragma vector=USCIAB0RX_VECTOR                  // Test for valid RX and TX character
    __interrupt void USCIA0RX_ISR(void)
    {
        volatile unsigned int i;
    
        while (!(IFG2 & UCA0TXIFG));                 // USCI_A0 TX buffer ready?
    
        if (UCA0RXBUF == SLV_Data)                   // Test for correct character RX'd
        P1OUT |= BIT0;                               // If correct, light LED
        else
        P1OUT &= ~BIT0;                              // If incorrect, clear LED
    
        MST_Data++;                                  // Increment master value
        SLV_Data++;                                  // Increment expected slave value
        UCA0TXBUF = MST_Data;                        // Send next value
    
        __delay_cycles(50);                          // Add time between transmissions to
    }                                                // make sure slave can keep up
    MSP-EXT 430 G 2ボードのGPIOヘッダをジャンパを使用して下に接続し、コードを実行します.
  • P1.2とP 1です.7接続性(MOMI)
  • P1.1とP 1です.6接続性(MISO)
  • P1.4とP 1です.接続5(CLK)-そうですか?
  • コードを実行すると、プライマリ・ノードは1から1にデータを追加し、SPIプロトコルに従ってセカンダリ・ノードにデータを送信し、ノードから受信したデータをプライマリ・ノードに再送信します.動作を直接確認するには、オシロスコープまたは論理ロケータを使用する必要があります.そうしないと、追加のコードが必要です.

    2.USCI B 0による三線通信(slave)


    USCI B 0を使用してSlaveモードでSPIを使用する例.全部で3本の線を使います.
  • P1.7 <- Data In (UCB0SIMO)
  • P1.6 -> Data Out (UCB0SOMI)
  • P1.5 -> Serial Clock In (UCABCLK)
  • #include <msp430.h>
    
    int main(void)
    {
        WDTCTL = WDTPW + WDTHOLD;            // Stop watchdog timer
        while (!(P1IN & BIT4));              // If clock sig from mstr stays low,
                                             // it is not yet in SPI mode
    
        P1SEL = BIT7 + BIT6 + BIT5;
        P1SEL2 = BIT7 + BIT6 + BIT5;
        UCB0CTL1 = UCSWRST;                  // **Put state machine in reset**
        UCB0CTL0 |= UCCKPL + UCMSB + UCSYNC; // 3-pin, 8-bit SPI master
        UCABCTL1 &= ~UCSWRST;                // **Initialize USCI state machine**
        IE2 |= UCA0RXIE;                     // Enable USCI0 RX interrupt
    
        __bis_SR_register(LPM4_bits + GIE);  // Enter LPM4, enable interrupts
    }
    
    #pragma vector=USCIAB0RX_VECTOR          // Echo character
    __interrupt void USCI0RX_ISR (void)
    {
        while (!(IFG2 & UCB0TXIFG));         // USCI_B0 TX buffer ready?
        UCA0TXBUF = UCB0RXBUF;
    }
    コードを実行すると、プライマリノードから受け取ったデータがそのまま再送信されます.同様に、動作を直接チェックする場合は、オシロスコープまたは論理ロケータを使用する必要があります.そうしないと、追加のコードが必要になります.