This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430: SPI通信

Other Parts Discussed in Thread: ADS8866, MSP430F47163

MSP430F47163を使用して、msp430x471x7_uscib0_spi_01.cサンプルコードを改造し、ADS8866と通信させようとしています。

その際にクロック信号が確認できずに困っていますが、何か問題になりそうなものはありますか?

プログラムの一部ですが、

 P3DIR |= BIT0;                 // P3.0 output direction (CS)
  P3DIR |= BIT3;                // P3.3 output direction (CLK)
 
  P3SEL |= BIT0;              // P3.0 option select (CS)
  P3SEL |= BIT3;            // P3.3 option select (CLK)
  P3SEL |= BIT2;           // P3.2 option select (SOMI)

とポート宣言し、

 P3OUT &= ~BIT0;                             // CS reset
   UCB0TXBUF = 0x0000;                       // Dummy write to start SPI
   while (!(IFG2 & UCB0RXIFG));            // USCI_B0 RX buffer ready?
   dat = UCB0RXBUF;             

としています。 

  • SPIのmasterは、slaveとハンドシェイクなしで出力しますので、
    本来は、TXBUFに書き込むとクロックが出て、RXと無関係に出力します。
    その意味では、masterのSIMOとCLKの確認は簡単です。

    ただ、このexample:471x7_uscib0_spi_01.c は、
    下記で判定しているので、入力が来ないと動作しません。
     while (!(IFG2 & UCB0RXIFG));


    最初に CLK が出ることだけ確認するには(受信は無視)、下記で試してください。
    RXIFG -> TXIFG

    このexampleベースでADS8866に対応させるには、
    PortはP3.1~P3.3をSPIに設定します。
    P3.0はUCB0STEではなく、PIO出力に設定します。
    (STEはCSと仕様がちょっと異なります)

    ADS8866のSBAS614Aの下記例では
    Figure 1. 3-Wire Operation: CONVST Functions as Chip Select

    P3.0をCONVSTに使用して、CONVST:on CONVST:off(立下り)のあとで
    SPI 2バイト通信すれば入力できるはずです。(P3.0のon/offがTLC549と相違があります。)
    また、ADS8866の担当者に確認しましたが、CONVST:onの時は、SMCLKは不要
    とのことです。 つまりCONVST:off の後で SPI通信(reset解除) でOKのはずです。


    解決した場合は、下記の 「はい」 をクリックお願いします。 ここで解決したか否かの確認をしています。
    不明点が有りましたら、このスレッドに返信お願いします。 

  • ご回答ありがとうございます。

    RXIFGをTXIFGに変えて、P3.0もPIOに設定しました。

    初期値 P3OUT |= 0x01; で バッファに書き込む前に P3OUT &= ~0x01; でリセットをかけてますが、

    うまくいきません。

    初期設定に問題はありそうですか?

    UCB0CTL0 |= UCMST+UCSYNC+UCMSB;           // 3-pin, 8-bit SPI mstr, MSb 1st
      UCB0CTL1 |= UCSSEL_2;                     // SMCLK
      UCB0BR0 = 0x02;
      UCB0BR1 = 0;
      UCB0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**

      CCTL0 = CCIE;                             // CCR0 interrupt enabled
      CCR0 = 20000;
      TBCTL = TBSSEL_2 + MC_1;                  // SMCLK, up mode
      _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt

    よろしくお願いします。

  • 質問者です。

    失礼いたしました。別に使用していた割り込みが邪魔でした。解決いたしました。

    ご協力に感謝したします。