TI中文支持网
TI专业的中文技术问题搜集分享网站

msp430 SPI 中断

MSP430F448的SPI接口配置如下:

char SpiMasterInit(void)
{
    UCTL0 |= SWRST;                 //初始
    ME1 |= USPIE0;                            // Enable USART0 SPI mode
    UCTL0 |= CHAR + SYNC + MM;        // 8-bit SPI Master **SWRST**
    UTCTL0 |= CKPH + SSEL1 + SSEL0 + STC;     // SMCLK, 3-pin mode
    UBR00 = 0x02;                             // UCLK/2
    UBR10 = 0x00;                             // 0
    UMCTL0 = 0x00;                            // no modulation
    UCTL0 &= ~SWRST;                          // Initalize USART state machine
    IE1 |= URXIE0 + UTXIE0;         // Enable USART0 TX RX interrupt    P3SEL |= 0x0E;                            // P3.1-3 SPI option select
    P3DIR |= 0x01;                            // P3.0 output direction
    return(1);                  //设置成功
 
}

用IAR进行调试发现如下问题:

(1)当发生一字节数据时,先进入接收中断,然后进入发送中断(IFG1相应接收和发送中断标志同时置1),但是接收到的数据为0;

(2)当接收一字节数据时,先发送0xff,然后等待接收数据,发送完0xff后,仍先进入接收中断,然后进入发送中断,接收到的数据仍为0;

我现在有点搞不清SPI的工作原理了,如何才能接收到从机的有效数据呢?

希望大家予以回复,谢谢。

zhiye Lai:

HI,

之前我也纠结了很久,后来想明白了SPI是同步双工通讯,你发送数据的时候,一个周期前一半时间是在发送数据,后一半时间则接收数据了,相当于一个周期有发送与接收了,所以在写数据进入发送寄存器后,接收中断标志位就置位了。同样,要接收数据的话,要先写东西进入发送寄存器,再读接收寄存器。

这个我是个人的理解,如果有不正确,请指教。

灰小子:

参考下这里:http://blog.sina.com.cn/s/blog_98e47a4901010uvy.html

Zhao Li2:

回复 zhiye Lai:

你好,谢谢你的回复,但还有几个问题仍需请教。

你说一个周期前一半时间是发送数据,后一半时间是接收数据,可是我需要往从设备发送7个32位数据对其进行配置,配置完成后才从从设备读数据,以判断从设备是否配置成功,这样

(1)我每发一个字节,MSP430接收的数据是如何产生的呢(好像收到的数都为0)?

(2)若我每发一个字节,都能收到一字节数据,那我怎样才能收到从设备发送的数据呢,是写0xff到从设备吗?

zhiye Lai:

回复 Zhao Li2:

你好,配置完成,发送完后再读RXBUF寄存器的数据即可,没配置完前面返回的数据可以不用理,我现在遇到问题是配置成功,返回值正确,但是不稳定,同样的程序有时可以有时不行

Ken Wang:

回复 Zhao Li2:

zhao,

   在MCU里面关于SPI的通信,和SCI是不太一样的。它没有分开的所谓的发送中断和接收中断。一般只会提供一个中断,这是因为它在发送数据的同时也在接收slave端的数据。

   SPi通信采用的移位寄存器的形式,它在SPICLK的驱动下把自己的数据移出去的同时,也会将slave端的数据移进来。所以说在建立正确的SPI通信时,在master端发送SPI的clock之前必须先确定slave端的数据是否已经准备好。如果没有的话,master端的数据能发出,但是接收到的数据基本上就是没用的数据了。

针对很多的带SPI接口的sensor或是AD芯片,他们首先都要经过配置,然后才能去读取它的数值。这个时候,你的编程就需要分成两部分,一开始的SPI通信都是对他进行配置,这是接收到的数据都不是你要的。

你需要的有效接受数据都是在下一个SPI通信过程中得到的,当slave端有数据需要发送时,一般都会通过一个IRQ中断信号提示master端,然后master发送clock把slave端的数据收回来。

谢谢

赞(0)
未经允许不得转载:TI中文支持网 » msp430 SPI 中断
分享到: 更多 (0)