[求助] spi接收数据与发送不一致

xiaoyumao333   2014-7-21 21:45 楼主
    采用的教材上的例程,SPI的自收自发没问题,但是将两片430f6638的spi接口连接起来时,作为接收端的从机总是出现溢出的错误,接收到的数据也很乱,不知道怎么回事,同时主机的UCTXIFG总是为1,当将数据写入UCA1TXBUF时仍然为1,好多问题,希望论坛里的高手给予帮助,谢谢了!
下面是我的从机接收端的程序,程序不长,还麻烦大家帮帮忙
#include
unsigned int MST_Data,SLV_Data;
unsigned char temp;
void main(void)
{
    volatile unsigned int i;
        WDTCTL = WDTPW+WDTHOLD;        // Stop watchdog timer
        P8SEL = BIT1+BIT2+BIT3;      //USCI_A1的8.2为SIMO,8.3为SOMI,8.1为USCI_A1的CLK
        P8DIR = BIT3;              //SOMI端口设为输出
        P8DIR &= ~BIT2;          // SIMO端口设为输入
        P8DIR &= ~BIT1;          //CLK设为输入
         P1REN |= BIT4;                            // Enable P1.4 internal resistance
         P1OUT |= BIT4;                            // Set P1.4 as pull-Up resistance
         P1IES &= ~BIT4;                           // P1.4 Lo/Hi edge
         P1IFG &= ~BIT4;                           // P1.4 IFG cleared
         P1IE |= BIT4;                             // P1.4 interrupt enabled
         UCA1CTL1|=UCSWRST;
         UCA1CTL0|= UCSYNC+UCCKPL+UCMSB;
         UCA1CTL1&=~UCSWRST;
        __bis_SR_register(LPM0_bits+GIE);
}

#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
        switch(__even_in_range(UCA1IV,4))
            {
                case 0: break;
                case 2:
                    while (!(UCA1IFG&UCTXIFG))
                    UCA1TXBUF =  UCA1RXBUF;
                    __delay_cycles(500);
                    break;
                case 4: break;
                default: break;
            }
}

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
  P1IFG &= ~BIT4;                           // Clear P1.4 IFG
  P1IE &= ~ BIT4;                            // Clear P1.4 IE
  UCA1CTL1 |= UCSWRST;                // Master is ready
  UCA1CTL1 &= ~UCSWRST;             // Re-init slave state machine
  UCA1IE |= UCRXIE;                        // Enable RX interrupt
}

回复评论 (7)

__delay_cycles(500);
这句起什么作用??
点赞  2014-7-21 21:52
引用: lcofjp 发表于 2014-7-21 21:52
__delay_cycles(500);
这句起什么作用??

这是之前作为主机发送时的程序修改了,忘了注释了,应该删了
点赞  2014-7-21 22:00
引用: lcofjp 发表于 2014-7-21 21:52
__delay_cycles(500);
这句起什么作用??

    这是教材的接收程序,关于P1.4也就是最后的中断程序不理解其作用,也不知道进入中断的条件,能否帮帮忙
点赞  2014-7-21 22:03
引用: xiaoyumao333 发表于 2014-7-21 22:03
这是教材的接收程序,关于P1.4也就是最后的中断程序不理解其作用,也不知道进入中断的条件,能否帮帮 ...

不知道你能不能仿真,看看能不能进入接收中断?
你的P1.4中断是开启SPI中断用的。

点赞  2014-7-21 22:07
引用: lcofjp 发表于 2014-7-21 22:07
不知道你能不能仿真,看看能不能进入接收中断?
你的P1.4中断是开启SPI中断用的。

将主机上的任意一个引脚比如P2.0或者P1.2之类的与从机的P1.4相连接,能进入中断,但是感觉很奇怪,在P1.4的中断第一句话加断点,然后将从机全速运行,主机单步执行,每次进入中断的语句都不一样;不连接从机的P1.4,进入不了中断,所以对最后这个中断程序进入中断的条件很迷惑,看了TI的例程,好像也有这么一个中断程序
点赞  2014-7-21 22:13
引用: xiaoyumao333 发表于 2014-7-21 22:13
将主机上的任意一个引脚比如P2.0或者P1.2之类的与从机的P1.4相连接,能进入中断,但是感觉很奇怪,在P1.4 ...

你还是找个学长帮你指导下吧,你这么说我也不知道啥问题。

点赞  2014-7-21 22:19
引用: lcofjp 发表于 2014-7-21 22:19
你还是找个学长帮你指导下吧,你这么说我也不知道啥问题。

还是感谢你的帮助,继续等
点赞  2014-7-21 22:23
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复