请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR2433 主题中讨论的其他器件: USB2ANY
我的设置由一个以16MHz 运行的 MSP430FR2433 I2C 从设备组成。 I2C 主设备通信使用 TI USB2ANY 器件完成。 我注意到 MSP430需要定期拉伸 I2C 时钟以跟上主设备的步伐。 在所连接的捕获中、需要时钟拉伸来应答地址。 我意识到这完全符合 I2C 规范、但我对它无法跟上100kHz I2C 总线有点惊讶?
这是我的 ISR:
#pragma vector=USCI_B0_vector
__interrupt void USCIB0_ISR (void)
{
switch (_even_in_range (UCB0IV、0x1E))
{
案例0x00:break;//向量00:无中断
案例0x02:break;//向量02:UCALIFG
案例0x04:break;//向量
0x06 UCNIFG 案例0x04:CnIFG:CnIFG: //向量06:UCSTTIFG 启动
rxBuffIndex = 0;
中断;
情况0x08: //向量08:UCSTPIFG 停止
stopSet = true;
break;
case 0x0A:break;// Vector 0A:UCRXIFG3
case 0x0C:break;// Vector 0C:UCTXIFG3
case 0x0E:break;// Vector 0E:UCRXIFG2
case 0x10:break;// Vector 10:UCTXIFG2
case 0x12:break;// Vector 12:UCRXIFG1
:UCRXIFG1:0x14:UCRXIFG1:case 0x14;/ Vector 0x14:break
//向量16:UCRXIFG0
if (rxBuffIndex >= slave_I2C_buff_size)
{
//生成 NAK
UCB0CTLW0 |= UCTXNACK;
返回;
}
rxBuff[rxBuffIndex++]= UCB0RXBUF;
IF (stopSet)
{
stopSet = false;
if (dataRxCallback!= NULL)
{
dataRxCallback (&rxBuff[0]、rxBuffIndex);
}
}
中断;
情况0x18: //向量18:UCTXIFG0
if (txBuff.dataIndex >= txBuff.maxNumBytes)
{
//生成 NAK
UCB0CTLW0 |= UCTXNACK;
返回;
}
UCB0TXBUF = txBuff.dataPtR[txBuff.dataIndex++];
break;
case 0x1A:break;// Vector 1A:UCBCNTIFG
case 0x1C:break;// Vector 1C:UCCLTOIFG
case 0x1E:break;// Vector 1E:UCBIT9IFG
default:break;
}
