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端的数据收回来。
谢谢