小默 发表于 2013-4-25 13:41:48

msp430f5529 硬件SPI 问题

//******************************************************************************
//   MSP430F552x Demo - USCI_A0, SPI 3-Wire Slave Data Echo
//
//   Description: SPI slave talks to SPI master using 3-wire mode. Data received
//   from master is echoed back.USCI RX ISR is used to handle communication,
//   CPU normally in LPM4.Prior to initial data exchange, master pulses
//   slaves RST for complete reset.
//   ACLK = ~32.768kHz, MCLK = SMCLK = DCO ~ 1048kHz
//
//   Use with SPI Master Incremented Data code example.If the slave is in
//   debug mode, the reset signal from the master will conflict 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.
//
//                   MSP430F552x
//               -----------------
//            /|\ |               |
//             ||               |
//    Master---+->|RST            |
//                |               |
//                |             P3.3|-> Data Out (UCA0SIMO)
//                |               |
//                |             P3.4|<- Data In (UCA0SOMI)
//                |               |
//                |             P2.7|-> Serial Clock IN (UCA0CLK)
//
//
//   Bhargavi Nisarga
//   Texas Instruments Inc.
//   April 2009
//   Built with CCSv4 and IAR Embedded Workbench Version: 4.21
//******************************************************************************

#include <msp430f5529.h>

void main(void)
{
WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer

while(!(P2IN&0x80));                      // If clock sig from mstr stays low,
                                          // it is not yet in SPI mode
P3SEL |= BIT3+BIT4;                     // P3.3,4 option select
P2SEL |= BIT7;                            // P2.7 option select
UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**
UCA0CTL0 |= UCSYNC+UCCKPL+UCMSB;          // 3-pin, 8-bit SPI slave,
                                          // Clock polarity high, MSB
UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt

__bis_SR_register(LPM4_bits + GIE);       // Enter LPM4, enable interrupts
}

// Echo character
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
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?
      UCA0TXBUF = UCA0RXBUF;
      break;
    case 4:break;                           // Vector 4 - TXIFG
    default: break;
}
}

这一句

while(!(P2IN&0x80)); // If clock sig from mstr stays low, it is not yet in SPI mode


为什么   If clock sig from mstr stays low, it is not yet in SPI mode



祥子 发表于 2013-4-25 22:48:41

这个仅仅是程序的示例。

一开始的时候,单片机并没有工作在SPI从机模式。
430复位后,SPI从机在这一句while(!(P2IN&0x80)); 等待中;主机CLK变高时,程序才往下执行。

//---把这句注释掉是不是也能正常运行?

当主机发送一个数据回来时,从机继续往下执行,接收数据

慢慢懂 发表于 2013-4-26 12:57:38

看是不是配置错了,我前一久弄了一下硬件SPI,

小默 发表于 2013-4-27 11:40:06

配置没错啊



小默 发表于 2013-4-27 11:42:01

祥子 发表于 2013-4-25 22:48 static/image/common/back.gif
这个仅仅是程序的示例。

一开始的时候,单片机并没有工作在SPI从机模式。


主机CLK 何时变高,是设置为外部时钟输出就变高吗

祥子 发表于 2013-4-27 20:48:11

小默 发表于 2013-4-27 11:42 static/image/common/back.gif
主机CLK 何时变高,是设置为外部时钟输出就变高吗

看下SPI的时序图,在user guide 里边有。CSSDI SDO SCLK有对应关系; 另外,可以配置SCLk的高低电平
页: [1]
查看完整版本: msp430f5529 硬件SPI 问题