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.

430数据无法发出

您好,我在使用MSP430的SPI向从机发数据。SPI模式已经选择为主机模式。但是在430调试过程中 while (!(IFG2 & UTXIFG1))这一步老是死循环。应该就是说之前的数据还没发送出去吧,从机没有收到来自430的数据。请问该怎么解决这个问题。 附件为log

  • 你好

    1、你可以试试把断点设在 等待语句 的后一句 ,看看能否 运行到 那句:

              while (!(IFG2 & UTXIFG1)) ;

    断点    dummy +=1;

    2、你可以用示波器看看,有没有发送出正确数据、时钟信号?

  • 没有UCLK1时钟输出,为什么会这样呢?我是设置过的啊

  • 没数据怎么有时钟?

    参考一下代码例子:

     UCA0CTL1 = UCSWRST;                       // **Put state machine in reset**

     UCA0CTL0 |= UCCKPL + UCMSB + UCSYNC;      // 3-pin, 8-bit SPI master

     UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**

     IE2 |= UCA0RXIE;                          // Enable USCI0 RX interrupt

     __bis_SR_register(LPM4_bits + GIE);       // Enter LPM4, enable interrupts

    }

    // Echo character

    #pragma vector=USCIAB0RX_VECTOR

    __interrupt void USCI0RX_ISR (void)

    {

     while (!(IFG2 & UCA0TXIFG));              // USCI_A0 TX buffer ready?

     UCA0TXBUF = UCA0RXBUF;

    }

    或者把你的代码配置spi这块发出来看看

  • 时钟不是设置成主模式就有输出吗?  怎么要有数据才有时钟?不太明白。

  • 时钟不是设置成主模式就有输出吗?  怎么要有数据才有时钟?不太明白。以下是我的SPI设置

    uchar Spi_Init(long baud,uchar dataBits,uchar mode,uchar clkMode)

    {  

       long int brclk;                 //波特率发生器时钟频率

     // P5SEL |= 0x0E;                   //// P5.1,P5.2,P5.3复用功能,SPI的出入和时钟

      U1CTL |= SWRST;                 //初始  ?????????????????

      //反馈选择位,为1,发送的数被自己接收,用于测试,正常使用时注释掉

      //UxCTL |= LISTEN;

      U1CTL |= SYNC + MM;             //SPI 主机模式   ?????????//?????是否需要考虑SWRST

      //时钟源设置

      U1TCTL &=~ (SSEL0+SSEL1);       //清除之前的时钟设置

      if(baud<=16364)                 //

      {

        U1TCTL |= SSEL0;              //ACLK,降低功耗

        brclk = 32768;                //波特率发生器时钟频率=ACLK(32768)

      }

      else

      {

        U1TCTL |= SSEL1;              //SMCLK,保证速度

        brclk = 1000000;              //波特率发生器时钟频率=SMCLK(1MHz)

      }

      //------------------------设置波特率-------------------------  

      if(baud < 300||baud > 115200)   //波特率超出范围

      {

          return 0;

      }

      //设置波特率寄存器

      int fen = brclk / baud;         //分频系数

      if(fen<2)return (0);            //分频系数必须大于2

      else

      {

          U1BR0 = fen % 256;

          U1BR1 = fen / 256;

      }

      //------------------------设置数据位-------------------------    

      switch(dataBits)

      {

          case 7:case'7': U1CTL &=~ CHAR; break;      //7位数据

          case 8:case'8': U1CTL |= CHAR;  break;      //8位数据

          default :       return(0);                  //参数错误

      }

      //------------------------设置模式---------------------------    

      switch(mode)

      {

          case 3:case'3': U1TCTL |= STC;  USPI3ON;    break;  //三线模式

          case 4:case'4': U1TCTL &=~ STC; USPI4ON;    break;  //四线模式

          default :       return(0);                          //参数错误

      }

      //------------------------设置UCLK模式-----------------------  

      switch(clkMode)

      {

          case 0:case'0': U1TCTL &=~ CKPH; U1TCTL &=~ CKPL;   break;  //模式0

          case 1:case'1': U1TCTL &=~ CKPH; U1TCTL |= CKPL;    break;  //模式1

          case 2:case'2': U1TCTL |= CKPH;  U1TCTL &=~ CKPL;   break;  //模式2

          case 3:case'3': U1TCTL |= CKPH;  U1TCTL |= CKPL;    break;  //模式3

          default :       return(0);                                  //参数错误

      }

      U1ME |= USPIE1;             //模块使能

      UCTL1 &= ~SWRST;            // Initialize USART state machine

      U1IE |= URXIE1 + UTXIE1;    // Enable USART1 RX interrupt

      return(1);                  //设置成功

    }

  • 没数据发送的好像就是时钟不输出的呀

    USICNT写了么?

    时钟源设置正确了么?SPI使能了么?

  • 您好 您说的USICNT是什么?对应于430的哪个寄存器

  • 你的程序里还有波特率的配置?SPI的速度是由时钟决定的。建议你找demo code SPI配置这块看一下。master的配置主要是一下几个寄存器配置

     UCA0CTL1 |= UCSWRST;                      // **Put state machine in reset**

     UCA0CTL0 |= UCMST+UCSYNC+UCCKPL+UCMSB;    // 3-pin, 8-bit SPI master

                                               // Clock polarity high, MSB

     UCA0CTL1 |= UCSSEL_2;                     // SMCLK

     UCA0BR0 = 0x02;                           // /2

     UCA0BR1 = 0;                              //

     UCA0MCTL = 0;                             // No modulation

     UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**

     UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt

  • 波特率的设置实际上也就是设置 UCA0BR0 这个寄存器。我在看一下有没有设置上的问题吧。因为我用的是Usart1这个口充当SPI口的。  现在想确定一个问题。   是不是只要SPI设置对了,就会有时钟发出。是不是只要有UCLK时钟,数据就会不停的发送接收(不管是给定数据,或是无效数据),也就是说不会在那句判定语上停止。   期待您的回答

  • 你用的哪颗片子,哪个USCI口。首先确定你使用端口的带有SPI功能,SPI发送数据时,SCLK与SMIO能测量到信号。发送数据都是你程序里设定的,发送数据就有SCLK信号,不发数据就没有。你在好好把SPI的协议看看吧。

  • 是不是引脚接错了?SPICLK有没有信号?

    能不能确定硬件是好的?

    例程试了没?

    从机是什么?

    SPI的极性和相位设置一致没有?

  • 你看他配置程序都是有问题的嘛,有数据才有clk信号啊。

  • 您好!

    引脚功能配置,您给注释掉了。

    // P5SEL |= 0x0E;                   //// P5.1,P5.2,P5.3复用功能,SPI的出入和时钟

    取消注释看看。

  • 不好意思,可能说的和您使用的型号不一样,我只用过只有USI模块的,简单型的MSP430