请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 }