我可以使用一些帮助。 我正在使用红色的 MSP432 Launchpad。 我启动了 UART、并努力将字符回显到终端并搜索设置命令。 我还设置了 SPI 块、并对模拟器件 AD7124-8 ADC 的 ID 寄存器执行 Ping 操作。 我有一个名为 ADC_CMD()的子例程,它传输一个字节的数据,后跟一个虚拟0x00字节,以保持 SCLK 计时,然后等待 SPI ISR 设置完成标志。 SPI ISR 缓存第二个接收到的字节并设置完成标志。
我想让其中一条 UART 命令对 ADC 的 ID 寄存器执行 Ping 操作。 我遇到了一个问题、当我在 UART ISR 中调用 ADC_CMD ()例程时、SPI ISR 永远不会触发、因此 ADC_CMD ()例程就在那里并等待。
我已尽量减少代码:
#include "driverlib.h" void main (void){ //停止看门狗计时器 WDT_A_HOLD (WDT_A_BASE); //设置端口,UART intterupt,SPI 中断 initHardware(); ADC_CMD (0x45);//这在这里工作 while (1); } /******** ADC_CMD (txByte / void ADC_CMD (uint_fast8_t txByte){ // 发送 txByte // ////发送虚拟0x00字节 // //////等待 SPI ISR 设置完成标志 // ******** // EUSCIA0_IRQHandler ()
// UART 中断处理程序 ********* / void EUSCIA0_IRQHandler (void){ //清除 UART 中断标志 uint32_t status = SPI_getEnableInterruptStatus (EUSCI_A0_BASE); UART_clearInterruptFlag (EUSCI_A0_BASE、STATUS); //禁用 UART 中断 MAP_UART_DisableInterruptStatus (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt); //将字符回显到用户 printMSG(&receiveByte,1); if (receiveByte='\r\n'){ // 执行填充 // adc_cmd (0x45);//此处不起作用 // //执行更多填充 // } //启用 UART 中断映 射_UART_enableInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt); } /******** // EUSCIB0_IRQHandler ()
// SPI 中断处理程序 ********* / void EUSCIB0_IRQHandler (void){ // 接收两个字节的数据,设置完成标志 // }
我认为问题是 UART ISR 标志未被清除、因此微控制器仍被设置为处理 UART ISR 并防止触发其他可屏蔽中断。 使用 UART ISR、我清除 UART ISR 标志并禁用中断、但 SPI 中断仍然不会触发。
如果有任何帮助,将不胜感激。