请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430F5529 主题中讨论的其他器件: MSP430F2619
您好!
我在 I2C 总线上有一个 MSP430F5529。 在我的系统运行期间、某些组件可以与该总线连接或断开。 在与从器件通信之前、我想检查总线上是否有特定的从器件。 我找到了一个有用的函数(TI_USCI_I2C_SLAVE_Present)、该函数在文档 slaa382a 中引用、并在 GitHub 上生成了一些 TI 生成的源代码、尽管适用于 MSP430F2619。 我一直在尝试为 MSP430F5529调整此函数、但我一直在努力使此代码正常工作。
MSP430F2619的原始代码
unsigned char TI_USCI_I2C_slave_present(unsigned char slave_address){
unsigned char ie2_bak, slaveadr_bak, ucb0i2cie, returnValue;
ucb0i2cie = UCB0I2CIE; // restore old UCB0I2CIE
ie2_bak = IE2; // store IE2 register
slaveadr_bak = UCB0I2CSA; // store old slave address
UCB0I2CIE &= ~ UCNACKIE; // no NACK interrupt
UCB0I2CSA = slave_address; // set slave address
IE2 &= ~(UCB0TXIE + UCB0RXIE); // no RX or TX interrupts
__disable_interrupt();
UCB0CTL1 |= UCTR + UCTXSTT + UCTXSTP; // I2C TX, start condition
while (UCB0CTL1 & UCTXSTP); // wait for STOP condition
returnValue = !(UCB0STAT & UCNACKIFG);
__enable_interrupt();
IE2 = ie2_bak; // restore IE2
UCB0I2CSA = slaveadr_bak; // restore old slave address
UCB0I2CIE = ucb0i2cie; // restore old UCB0CTL1
return returnValue; // return whether or not
// a NACK occured
}
我当前尝试使用 MSP430F5529
unsigned char TI_USCI_I2C_slave_present(unsigned char slave_address){
unsigned char slaveadr_bak, ucb0i2cie, returnValue;
ucb0i2cie = UCB0IE; // restore old UCB0I2CIE
slaveadr_bak = UCB0I2CSA; // store old slave address
UCB0I2CSA = slave_address; // set slave address
UCB0IFG &= ~(UCTXIFG + UCRXIFG); // Clear any pending interrupts
UCB0IE &= ~ ( UCNACKIE + UCRXIE + UCTXIE); // no NACK, RX, or TX interrupts
__disable_interrupt();
UCB0CTL1 |= UCTR + UCTXSTT + UCTXSTP; // I2C TX, start condition
while (UCB0CTL1 & UCTXSTP); // wait for STOP condition
// !!! Not sure what registers need to be used here for MSP430F5529 !!!
returnValue = !(UCB0IV & USCI_I2C_UCNACKIFG);
//returnValue = !(UCB0IFG & UCNACKIFG); //
__enable_interrupt();
UCB0I2CSA = slaveadr_bak; // restore old slave address
UCB0IE = ucb0i2cie; // restore old UCB0CTL1
return returnValue; // return whether or not
// a NACK occured
}
运行调试器时、我似乎没有获得变量"returnValue"所需的值、但我不确定我做了什么错误。 我有一个测试设置和一个逻辑分析仪。 我的目标是验证总线上是否存在现有的从器件、然后验证不存在的从器件。
感谢您的任何帮助!
j