This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR59941:从器件 I2C 在重新启动后不会返回器件地址

Guru**** 2379850 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/622555/msp430fr59941-slave-i2c-does-not-ack-device-address-following-a-restart

器件型号:MSP430FR59941

我正在尝试将 MSP430配置为 I2C 从设备、我希望它的工作方式与从任何其他从设备读取寄存器的方式相同。  通常通过发送器件地址、寄存器地址、发出重启信号、然后读回数据来实现。  到目前为止、我能够写入寄存器地址并在 MSP430中接收它、但是在我的主器件发出重新启动命令并再次将器件地址作为读取发送后、我不会得到一个 ACK。

我是否必须在某个位置切换模式才能向外发送字节?

下面是我的设置代码:

void setup_slave_i2c (void){
//配置 GPIO
P6SEL0 |= BIT4 | BIT5;
P6SEL1 &=~(BIT4 | BIT5);

//将 USCI_B2配置为 I2C 模式
UCB3CTLW0 = UCSWRST; //软件复位被启用
UCB3CTLW0 |= UCMODE_3 | UCSYNC; // I2C 模式、同步模式
UCB3I2COA0 = 0x38 | UCOAEN; //自身地址为0x48 +使能
UCB3CTLW0 &=~UCSWRST; //清除复位寄存器
UCB3IE |= UCRXIE | UCTXIE0 | UCSTPIE; //发送,停止中断使能
} 

这是我的中断处理程序代码:

#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector = EUSCI_B3_vector
__interrupt void USCI_B3_ISR (void)
#Elif defined (__GNU__)
void __attribute__(interrupt (eUSCI_B3_vector))) USCI_b3_COMPLETE_ERROR #BUC_B3_COMPLETE

!
#endif
{
开关(__evo_in_range (UCB3IV、USCI_I2C_UCBIT9IFG))
{
USCI_NONE 案例: 中断; //向量0:无中断
USCI_I2C_UCALIFG 案例:中断; //向量2:ALIFG
案例 USCI_I2C_UCNACKIFG:中断; //向量4:NACKIFG
USCI_I2C_UCSTTIFG 案例:
UCB3IFG &=~UCSTPIFG;
/*清除地址和接收缓冲器*/
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);
中断; //向量6:STTIFG
案例 USCI_I2C_UCSTPIFG:中断; //向量8:STPIFG
USCI_I2C_UCRXIFG3案例:中断; //向量10:RXIFG3
USCI_I2C_UCTXIFG3案例:中断; //向量12:TXIFG3
USCI_I2C_UCRXIFG2案例:中断; //向量14:RXIFG2
USCI_I2C_UCTXIFG2案例:中断; //向量16:TXIFG2
USCI_I2C_UCRXIFG1案例:中断; //向量18:RXIFG1
USCI_I2C_UCTXIFG1案例:中断; //向量20:TXIFG1
USCI_I2C_UCRXIFG0案例: //向量22:RXIFG0
UCB3IFG &=~UCRXIFG;//清除 Rx IFG
//UCB3CTLW0 |= UCTXSTP; // I2C 停止条件
//*RXData= UCB3RXBUF;
* RXSlaveData = UCB3RXBUF;
RXSlaveData++;
//*RXData++;
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出 LPM0
中断;
USCI_I2C_UCTXIFG0案例: //向量24:TXIFG0
UCB2TXBUF = 0xAA;
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出 LPM0
中断;
案例 USCI_I2C_UCBCNTIFG:break; //向量26:BCNTIFG
USCI_I2C_UCCLTOIFG 案例:中断; //向量28:时钟低电平超时
USCI_I2C_UCBIT9IFG 案例:中断; //向量30:第9位
默认值:break;
}
} 

我错过了什么?  任何建议都将不胜感激。

谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    解决了、我必须清除启动 IFG、然后我使用了错误的 TXBUF。  奇怪的是、我没有看到 UCSTTIFG 的定义。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您发布解决方案 Eric、很高兴看到您能够解决该问题。  UCSTTIFG 被定义为 UCB3IFG 的位2、并且为针对 eUSCI_B I2C 操作的 UCB3IV 的中断源0x06。  当 I2C 模块检测到一个起始条件及其自身地址时、它应该被置位。

    Ryan