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.

MSP430F2617 同一个通信模块SPI和异步的UART复用的问题

Other Parts Discussed in Thread: MSP430F2617

因需要使用了MSP430F267的两个UART的模块,但此时因为又需要使用SPI的模式,但其中一个UART和SPI的需求是只接不发。他们使用同一个中断向量,能不能在同一个中断函数里面做处理,该怎么处理,通过中断标志位来判断吗?求指教

  • 您好!

    我觉得比较麻烦的一点就是UART数据和SPI数据的冲突,所以你要随时切换成UART模式或者SPI模式。

    我觉得比较可行的办法是,一个硬件UART,一个硬件SPI,用IO软件实现UART。

  • 我是这样使用的,能解决MSP430F2xx的同一个中断向量的问题:

    在串口接收中断内,

    #pragma vector=USCIAB0RX_VECTOR

    __interrupt void USCI_A0_ISR(void)

    {

     if (IFG2 & UCA0RXIFG)

       {

         RX0Buf[RX0Buf_in] = UCA0RXBUF;          // RXed character ->

         RX0Buf_in++;                                              // 数组保存位置的指针

     }

    }

    在主程序内,对于 SPI的接收,

    buffer[i] = UCB0RXBUF;                      // Store data from last data RX

    while (!(IFG2&UCB0RXIFG));              // Wait for RX to finish

  • 楼主part number打错了吧?是F247还是F2617?不过无论是其中哪一颗,都自带两个USCI模块,应该都能实现两个UART和两个SPI同时工作。楼主最后的方法可以实现,USCIA0用来做UART接受,而USCIB0用来实现SPI,且不使用中断方式接受。只是这样实现,主程序会长时间等待在SPI的接送FLAG的判断上,其实USCIB0用中断发送也可以实现,只需要把判断条件放到同一个中断处理函数里即可,用不同的中断标志位来判断执行各自的代码

  • 谢谢您,我使用的是MSP430F2617,我刚开始也是这样想的,是通过同一个中断函数,不同标志位来判断。但自己没有尝试过,两个功能是要通过配置相应的寄存器来切换使用的,这边SPI做从机只接受数据,异步的UART也是只收数据,但如果两者同时收到数据的话,我自己这里理解的有点模糊了。若在while(1)里面查询的话,因为数据量较大,怕丢失数据,请问您通过中断复用了两个功能吗?

  • 谢谢您,因为数据量较大,且复用的功能都是用从机,怕会丢失数据。

  • USCIA和USCIB都有接受缓存来处理数据的接受,所以即使UART和SPI的数据同时到达,也会分别由各自的buffer来存储,并不会发生数据丢失的情况。只是若SPI的速度过快,而MCLK的速度过慢,则可能会发生数据丢失的情况。这就需要降低SPI速度或者提高MCLK频率了。