在线情况
楼主
  • 头像
  • 级别
    • 积分23
    • 经验1506
    • 文章25
    • 注册2010-12-22
    SPI的接收问题
    //******************************************************************************
    //   MSP430F54x Demo - USCI_A0, SPI 3-Wire Master Incremented Data
    //
    //   Description: SPI master talks to SPI slave using 3-wire mode. Incrementing
    //   data is sent by the master starting at 0x01. Received data is expected to
    //   be same as the previous transmission.  USCI RX ISR is used to handle
    //   communication with the CPU, normally in LPM0. If high, P1.0 indicates
    //   valid data reception.  Because all execution after LPM0 is in ISRs,
    //   initialization waits for DCO to stabilize against ACLK.
    //   ACLK = ~32.768kHz, MCLK = SMCLK = DCO ~ 1048kHz.  BRCLK = SMCLK/2
    //
    //   Use with SPI Slave Data Echo code example.  If slave is in debug mode, P1.1
    //   slave reset signal conflicts with slave's JTAG; to work around, use IAR's
    //   "Release JTAG on Go" on slave device.  If breakpoints are set in
    //   slave RX ISR, master must stopped also to avoid overrunning slave
    //   RXBUF.
    //
    //                   MSP430F5438
    //                 -----------------
    //             /|\|                 |
    //              | |                 |
    //              --|RST          P1.0|-> LED
    //                |                 |
    //                |             P3.4|-> Data Out (UCA0SIMO)
    //                |                 |
    //                |             P3.5|<- Data In (UCA0SOMI)
    //                |                 |
    //  Slave reset <-|P1.1         P3.0|-> Serial Clock Out (UCA0CLK)
    //
    //
    //   W. Goh
    //   Texas Instruments Inc.
    //   October 2008
    //   Built with CCE Version: 3.2.2 and IAR Embedded Workbench Version: 4.11B
    //******************************************************************************

    #include "msp430x54x.h"

    unsigned char MST_Data,SLV_Data;
    unsigned char temp;

    void main(void)
    {
      volatile unsigned int i;

      WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer

      P1OUT |= 0x02;                            // Set P1.0 for LED
                                                // Set P1.1 for slave reset
      P1DIR |= 0x03;                            // Set P1.0-2 to output direction
      P3SEL |= 0x31;                            // P3.5,4,0 option select

      UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**
      UCA0CTL0 |= UCMST+UCSYNC+UCCKPL+UCMSB;    // 3-pin, 8-bit SPI master
                                                // Clock polarity high, MSB
      UCA0CTL1 |= UCSSEL_2;                     // SMCLK
      UCA0BR0 = 0x02;                           // /2
      UCA0BR1 = 0;                              //
      UCA0MCTL = 0;                             // No modulation
      UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
      UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt

      P1OUT &= ~0x02;                           // Now with SPI signals initialized,
      P1OUT |= 0x02;                            // reset slave

      for(i=50;i>0;i--);                        // Wait for slave to initialize

      MST_Data = 0x01;                          // Initialize data values
      SLV_Data = 0x00;                          //

      while (!(UCA0IFG&UCTXIFG));               // USCI_A0 TX buffer ready?
      UCA0TXBUF = MST_Data;                     // Transmit first character

      __bis_SR_register(LPM0_bits + GIE);       // CPU off, enable interrupts
    }

    #pragma vector=USCI_A0_VECTOR
    __interrupt void USCI_A0_ISR(void)
    {
      volatile unsigned int i;

      switch(__even_in_range(UCA0IV,4))
      {
        case 0: break;                          // Vector 0 - no interrupt
        case 2:                                 // Vector 2 - RXIFG
          while (!(UCA0IFG&UCTXIFG));           // USCI_A0 TX buffer ready?

          if (UCA0RXBUF==SLV_Data)              // Test for correct character RX'd
            P1OUT |= 0x01;                      // If correct, light LED
          else
            P1OUT &= ~0x01;                     // If incorrect, clear LED

          MST_Data++;                           // Increment data
          SLV_Data++;
          UCA0TXBUF = MST_Data;                 // Send next value

          for(i = 20; i>0; i--);                // Add time between transmissions to
                                                // make sure slave can process information
          break;
        case 4: break;                          // Vector 4 - TXIFG
        default: break;
      }
    }
    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
    以上是TI提供的例子。1.请问从发送缓存中发送的数据是怎么到接受缓存的?是直接从发送缓存到接受缓存?怎么设置的?
                      2.我现在把430与FPGA相连,就用这个例子,数据是从发送缓存到FPGA再到接受缓       存的吗?不是的话怎么怎么改? (我连好了,在软件里能看到RXBUFF和TXBUFF的数据,但是我把时钟线和使能线拔了也能看到数据)
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    对于单片机说来说,只要CPU执行“UCA0TXBUF = MST_Data;”就是将数据写入缓冲了,接下来就待从SI信号脚输出,与此同时时钟信号也会伴随同步输出。同时,SO信号引脚也会读入SO信号线上的变化电平。
    简单点说,在发送一个数据的同时,SO引脚也会接收一个数据的。
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分23
      • 经验1506
      • 文章25
      • 注册2010-12-22
      原来我线接错了,就相当于把输出输入线连起来了,谢谢dc
      微控网感谢您的参与
      Powered by LeadBBS 9.2 .
      Page created in 0.1724 seconds with 5 queries.