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.

[参考译文] MSP430FR2311:带MSP430FR2311 UC的TMP275传感器接口

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/616999/msp430fr2311-tmp275-sensor-interface-with-msp430fr2311-uc

部件号:MSP430FR2311
主题中讨论的其他部件:TMP275

借助  I2C协议,我拥有一个带MSP430FR2311的TMP275温度传感器接口。

以下代码滞留在第一个功能的TX ISR中。  

请检查我的代码是否正确 ,或者是否需要进行任何修改才能正常工作。

#include <msp430fr2311.h>

//unsigned int Slaver_Address[3]={0x0048,0x0048,0x004A};
//int Slave_Flag;
无符号int TxData[3];
无符号int RX_Data[2];
Int Tx计数器;
Int RX_Counter;
无符号int TX_Int_Counter;
无符号int Rx_Int_Counter;
//volatile int ReG_Add1;
void TX_Data_of_Data_Demand (unsigned int ReG_Add);
void TX_Data_Format_bit (unsigned int ReG_Add,unsigned int ReG_Data);

内部主(无效)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

//为I2C配置引脚
P1SEL0 || BIT2 | BIT3;// I2C引脚

//禁用GPIO开机默认高阻抗模式
//以激活先前配置的端口设置
PM5CTL0 &=~LOCKLPM2;

//为I2C模式配置USI_B0
UCB0CTLW0 |= UCSWRST;//将eUSSCI_B置于重置状态
UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC;// I2C主模式,SMCLK
UCB0BRW = 0x8;//波特率= SMCLK / 8
UCB0I2CSA = 0x0048;
UCB0CTLW0 &=~UCSWRST;//清除重置寄存器

__bis_sr_register (GIE);

TX_Data_Format_bit (0x01,0x20);//配置寄存器
while (UCB0CTLW0和UCTXSTP);//确保已发送停止条件


同时(1)

while (UCB0CTLW0和UCTXSTP);//确保已发送停止条件

TX_Data_of_Data_Demand (0x00);
while (UCB0CTLW0和UCTXSTP);//确保已发送停止条件

}
}


#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector = USI_B0_vector
__interrupt void USCIB0_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USI_B0_vector))) USCIB0_ISR (void)
#否则
错误编译器不受支持!
#endif

Switch(__偶 数_in_range(UCB0IV,USI_I2C_UCBIT9IFG))

案例USI_NONE:Break;// Vector 0:no interrupt break;
案例USI_I2C_UCALIFG:中断;
案例USI_I2C_UCNACKIFG:
UCB0CTL1 |= UCTXSTT;//如果不符合,请重新发送启动
中断;//向量4:NACKIFG中断;
案例USI_I2C_UCSTIFG:中断;//矢量6:STTIFG中断;
案例USI_I2C_UCSTPIFG:中断;//矢量8:STPIFG中断;
案例USI_I2C_UCRXIFG3:中断;//矢量10:RXIFG3中断;
案例USI_I2C_UCTXIFG3:中断;//矢量14:TXIFG3中断;
案例USI_I2C_UCRXIFG2:中断;//矢量16:RXIFG2中断;
案例USI_I2C_UCTXIFG2:中断;//矢量18:TXIFG2中断;
案例USI_I2C_UCRXIFG1:中断;//矢量20:RXIFG1中断;
案例USI_I2C_UCTXIFG1:中断;//矢量22:TXIFG1中断;
案例USI_I2C_UCRXIFG0:
RX_Data[RX_Counter]= UCB0RXBUF;
RX_Counter++;
RX_Int_Counter++;
中断;//引导程序24:RXIFG0中断;
案例USI_I2C_UCTXIFG0://检查TX字节计数器
// ReG_Add1 = TxData[TX_Counter];
// IF (Tx计数器> 0)
//{
UCB0TXBUF = TxData[TX_Counter];
TX_计数器--;
TX_Int_Counter++;
//}
中断;//矢量26:TXIFG0中断;
案例USI_I2C_UCBCNTIFG:中断;//矢量28:BCNTIFG
案例USI_I2C_UCCLTOIFG:中断;//矢量30:时钟低超时
案例USI_I2C_UCBIT9IFG:中断;//矢量32:第9位
默认值:中断;
}
}


void TX_Data_Format_bit (无符号int ReG_Add,无符号int ReG_Data)

TX_计数器= 2;

//UCB0IE |= UCNACKIE;//传输和nack中断启用
TxData[2]= ReG_Add;
TxData[1]= ReG_Data;
while (UCB0CTLW0和UCTXSTP);//确保已发送停止条件
UCB0CTLW0 |= UCTR | UCTXSTT;// I2C TX,启动条件
UCB0IE || UCTXIE0;//清除USI_B0 TX int标志
//__bis_sr_register (GIE);

// While (Tx计数器> 0)
While (Tx计数器!= 0)

__no_operation();
}


UCB0CTLW0 |= UCTXSTP;
UCB0IE &=~UCTXIE0;//清除USSCI_B0 TX int标志

//UCB0IE &=~UCNACKIE;

}

Void TX_Data_of_Data_Demand (无符号int ReG_Add)

TX_计数器= 1;
TxData[1]= ReG_Add;
Rx_Counter = 0;
while (UCB0CTLW0和UCTXSTP);//确保已发送停止条件
UCB0CTLW0 |= UCTR | UCTXSTT;// I2C TX,启动条件
UCB0IE |= UCTXIE0;//传输和nack中断启用

While (Tx计数器!= 0)

__no_operation();
}

UCB0IE &=~UCTXIE0;//清除USSCI_B0 TX int标志
__no_operation();


//UCB0CTLW0 |= UCTXSTP;
//UCB0CTVALUE = UCB0CTLW0;

while (UCB0CTLW0和UCTXSTP);//确保已发送停止条件
UCB0CTLW0 &=~UCTR;
UCB0CTLW0 |= UCTXSTT;// I2C TX,启动条件
UCB0IE |= UCRXIE0;//传输和nack中断启用

While (RX_Counter < 2)

__no_operation();
}

UCB0CTLW0 |= UCTXSTP;
UCB0IE &=~UCRXIE0;//清除USSCI_B0 TX int标志
__no_operation();

}

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

    您好,Kelvin,

    我没有看到任何会导致您的代码卡在第一个函数的TX ISR中的情况。 您能否通读 MSP430 MCU上常见eUSCI和USCI串行通信问题解决方案的I2C部分? 这 包括在MSP430上使用I2C通信时遇到的最常见问题,并且在调试此类问题时非常有用。

    此外,您能否使用逻辑分析仪探测I2C数据总线并提供总线上发生的情况的屏幕截图?

    此致,

    Caleb Overbay

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

    我已经浏览过PDF,似乎一切都正常。
    但我的程序计数器在void TX_Data_Format_bit(unsigned int ReG_Add, unsigned int ReG_Data)函数中卡住@,而(TX_Counter !=0)。
    程序计数器仅在TX ISR中输入一次。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Kelvin,

    这里最有益的事情是使用逻辑分析器来探测I2C总线。 执行此操作后,您可以发布屏幕截图,以便我们可以查看正在发送或未在总线上发送的数据?

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

    只需启用UCB0IE |= UCNACKIE中断,此代码就可以正常工作。

    谢谢

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

    感谢您提供问题的解决方案。 在这种情况下,从从属设备接收nack可能意味着在MSP430开始在I2C总线上传输之前,它没有完全初始化并准备好接收信息。 我建议在代码的开头添加一个延迟,以便在尝试与从属设备通信之前给它一段时间进行完全初始化。

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

    谢谢你们的合作和精彩的建议。


    此致,
    开尔文