用MSP430F448的SPI接口对GP21进行配置时,在发送和接收的过程中,可进入SPI的接收中断和发送中断,但是接收到的数据一直为0。
GP21采用四线SPI接口,Clock Phase Bit = 1,Clock Polarity Bit = 0,当F448的SPI设为四线时,不能进入发送和接收中断,改为三线后,将STE脚作为普通IO实现对GP21中SPI接口SSN的控制(发送和接收数据时将STE脚置低,发送接收完成后置高),此时可进入发送和接收中断。SPI的其他设置为:波特率为9600,ACLK做参考时钟,8位数据,UxTCTL |= CKPH; UxTCTL &=~ CKPL;
另,将F448中SPI寄存器UxCTL |= LISTEN时,可接受到与发送相同的数。
本人是菜鸟,SPI配置程序是从网上下载的。想问一下,我是否能确定已将F448的SPI接口配置正确,能正常工作?
user3917511:
我写的 MSP430F44X单片机SPI接口驱动C语言程序。。希望对你有帮助。。
#include<msp430x44x.h>
char MST_Data=0X00,SLV_Data=0XFF;
void Init(void);
void main(void)
{
unsigned int i;
WDTCTL=WDTPW+WDTHOLD;
Init();
_EINT();
P3OUT&=~0X020;
P3OUT|=0X020;
i=50000;
do(i–);
while(i!=0);
while(1)
{
TXBUF0=MST_Data;
LPM0;
}
}
void Init(void)
{
P1OUT=0X000;
P1DIR=0X001;
P3SEL=0X00E;
UCTL0=CHAR+SYNC+MM+SWRST;
UTCTL0=STC+SSEL1+CKPL;
UBR00=0X02;
UBR01=0X00;
UMCTL0=0;
ME1=USPIE0;
UCTL0&=~SWRST;
IE1=URXIE0;
}
#pragma vector=USART0RX_VECTOR
__interrupt void SPI0_rx(void)
{
P3OUT^=0X010;
while ((IFG1&UTXIFG0)==0);
if (U0RXBUF==SLV_Data)
{
SLV_Data=SLV_Data-1;
MST_Data=MST_Data+1;
TXBUF0=MST_Data;
P1OUT|=0X001;
P1OUT&=~0X001;
}
else
{
TXBUF0=MST_Data;
P1OUT|=0X001;
}
}
Zhao Li2:
回复 user3917511:
chaosong huang1 谢谢你的回复,我还是想知道为什么我的程序中,既然能进接收中断为什么收到的全是0,是否向你的程序一样,初始化后加一个延时,还是SPI配置完成而是GP21没有工作?