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.
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的工作原理了,如何才能接收到从机的有效数据呢?
希望大家予以回复,谢谢。
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端的数据收回来。
谢谢