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.

[参考译文] 编译器/MSP430G2553:I2C 发送启动连接问题

Guru**** 2587345 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/677653/compiler-msp430g2553-i2c-send-start-condution-problem

器件型号:MSP430G2553

工具/软件:TI C/C++编译器

我正在 通过"Resource Explorer"实现 I2C 示例。 (msp430g2xx3_uscib0_i2c_01.c)

MCU 与从 IC 通信、但卡在开启状态

while (UCB0CTL1 & UCTXSTT); //循环、直到发送 I2C STT 

如果我断开传感器 SDA 线与 MCU 的连接、则没有问题。

我实现了与另一个 MCU (STM32)的通信。 因此、我认为系统上没有物理问题。

#include 

int main (void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器

P1SEL |= BIT6 + BIT7; //将 I2C 引脚分配给 USCI_B0
P1SEL2|= BIT6 + BIT7; //将 I2C 引脚分配给 USCI_B0
UCB0CTL1 |= UCSWRST; //启用 SW 复位
UCB0CTL0 = UCMST+UCMODE_3+UCSYNC; // I2C 主设备,同步模式
UCB0CTL1 = UCSSEL_2+UCSWRST; //使用 SMCLK、保持软件复位
UCB0BR0 = 12; // fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0x1C; //设置从地址
UCB0CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作
IE2 |= UCB0RXIE; //启用 RX 中断
TACCTL0 = CCIE; //启用 TACCR0中断
TACTL = tassel_2 + MC_2; // SMCLK、contmode

while (1)
{
_bis_SR_register (GIE); // CPU 关闭,中断启用
UCB0CTL1 &=~UCTR; // I2C RX
UCB0CTL1 |= UCTXSTT; // I2C 启动条件
while (UCB0CTL1 & UCTXSTT); //循环、直到发送 I2C STT
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX、启动条件
_bis_SR_register (GIE); // CPU 关闭,中断启用
while (UCB0CTL1 & UCTXSTT); //循环、直到发送 I2C STT
UCB0CTL1 |= UCTXSTP; //第一个 TX 后的 I2C 停止条件
}
#if

defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__)
#pragma vector = TIMER0_A0_Vector
__interrupt void TA0_ISR (void)
#Elif defined (__GICS__)
void __attribute__((NOT_UCC_A0

)#INTERRUPT (NOT_TA0) TIMER0!NOT_COMPLETOR #TA0!
#endif
{
//_BIC_SR_register_ON_EXIT (CPUOFF); //退出 LPM0
}

// USCI_B0数据 ISR
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCIAB0TX_Vector
__interrupt void USCIAB0TX_ISR (void)
#Elif defined (__GIC_)#BIAS_ COMPUSCIC_
(void

)(void)(void)(void)#BIST_BIST_0TX_ERROR)
#endif
{
UCB0TXBUF =(UCB0RXBUF << 4)| 0x0F; //将 RX 数据移动到 TX
//_BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM0
}


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

    您好、Sinan、

    当您使用示例代码来实现 I2C 通信时、请首先查看 MSP430 MCU 上常见 eUSCI 和 USCI 串行通信问题的解决 方案应用报告、该报告指出了可能的解决方案。 请参阅第5节、了解使用 I2C 时的常见通信问题。

    请告诉我、如果任何一种无法解决的解决方案都不能帮助解决问题。

    此致、

    Britta

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

    您是否能够使用指定的应用报告对问题进行故障排除?
    请告诉我您是否仍需要帮助、或者单击"已解决我的问题"以关闭此主题。

    此致、
    Britta