我有一个应用程序,其中 MSP430充当 I2C 总线上的从属设备。 主控制器将以同步方式请求状态字节的数组,因为从控制器可能正在休眠或收集数据。 这在很大程度上是有效的,但偶尔会发生碰撞,导致时钟过度拉伸和总线冻结。 我的解决方法是使用超时中断重置总线,但我认为使用 DMA 进行数据传输是一种更好的方法。 我正在使用 UCTXIFG0 ISR 实现此目的,但文档表明,如果设置了中断位 UCB0IE |= UCB0TXIE,eUSCI_B0上的 DMA 传输将不起作用。 我的想法是在 UCSTIFG 内部调解 DMA 传输,而不是 UCTXIFG0,但我想在尝试开发之前获得一些指导。 我的应用程序是否可以使用 DMA,如果可以,最佳方法是什么? 我目前的工作代码如下:
#pragma vector = EUSCI_B0_VECTOR __interrupt void USCI_B0_ISR(void) { switch(__even_in_range(UCB0IV, USCI_I2C_UCBIT9IFG)) { case USCI_I2C_UCTXIFG0: // Vector 26: TXIFG0 if (TxCount == SBYTES) { PStatus = Status_array; // Point PStatus to start of Status_Array Tflag = 1; //Alert main program that interrupt occurred if (TimerFlag == 1) Tstore = TB0R; //Store the timer count } if (TxCount) // Check TX byte counter not empty { UCB0TXBUF = *PStatus++; // Load TX buffer TxCount--; // Decrement TX byte counter } else { UCB0IFG &= ~UCTXIFG0; // Clear USCI_B0 TX int flag } break; } }