因需要使用了MSP430F267的两个UART的模块,但此时因为又需要使用SPI的模式,但其中一个UART和SPI的需求是只接不发。他们使用同一个中断向量,能不能在同一个中断函数里面做处理,该怎么处理,通过中断标志位来判断吗?求指教
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.
因需要使用了MSP430F267的两个UART的模块,但此时因为又需要使用SPI的模式,但其中一个UART和SPI的需求是只接不发。他们使用同一个中断向量,能不能在同一个中断函数里面做处理,该怎么处理,通过中断标志位来判断吗?求指教
我是这样使用的,能解决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频率了。