#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
switch(__even_in_range(UCB0IV,12))
{
case 0: break; // Vector 0: No interrupts
case 2: break; // Vector 2: ALIFG
case 4: break; // Vector 4: NACKIFG
case 6: break; // Vector 6: STTIFG
case 8: break; // Vector 8: STPIFG
case 10: break; // Vector 10: RXIFG
case 12: // Vector 12: TXIFG
if (TXByteCtr) // Check TX byte counter
{
UCB0TXBUF = *PTxData++; // Load TX buffer
TXByteCtr–; // Decrement TX byte counter
}
else
{
UCB0CTL1 |= UCTXSTP; // I2C stop condition
UCB0IFG &= ~UCTXIFG; // Clear USCI_B0 TX int flag
__bic_SR_register_on_exit(LPM0_bits); // Exit LPM0
}
default: break;
}
}
MSP430F54x Demo – USCI_B0 I2C Master TX multiple bytes to MSP430 Slave
这是TI给的官方例程,但是为甚这样就可以连续发送数据,不是进入中断后中断标记位会自动清零吗?
还有能不能提供一份ADS115的IIC协议的程序,不是模拟IIC。
Triton Zhang:
首先要搞清楚发射中断是指TXBUF为空中断,而不是发送结束中断.
进入中断后自动清零的是TXBUF为空的中断标志,但只要TXBUF没有数据TXIFG就会一直被置位。通过这个标志来判断TX发送结束是不正确的。
事实上TXIFG触发的中断是在发送数据结束之前,也就是说发生在TXBUF的数据移位到移位寄存器的时候。
如果要想停止TX发送,需要关闭TXIFG的中断。
Hardy Hu:
这段代码没有问题的,注意它是开启了TX中断,后面这一段代码都是在TX中断标志所触发的。
Hardy Hu:
回复 Hardy Hu:
USCI_B只有一个中断向量,进入中断后需要去check到底是响应哪个中断。