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.

MSP430G系列使用硬件IIC还需不需要外部接上拉电阻?

Other Parts Discussed in Thread: ADS1115

小弟我调ADS1115,模拟IIC完美运行,但是想试试G2553的硬件IIC,死活弄不出来,感觉发送地址之后单片机收不到应答信号,想来想去会不会是我外部接了一个上拉电阻的原因,所以特来问问各位使用内部的硬件IIC还需要外接上拉电阻不?接了之后会不会有什么影响

  • 一般是要接的,当然不接很多时候也没问题

  • 可以看下手册I2C模式P449,推荐加上拉电阻:http://www.ti.com.cn/cn/lit/ug/zhcu032i/zhcu032i.pdf 

  • lingming zhang 说:

    小弟我调ADS1115,模拟IIC完美运行,但是想试试G2553的硬件IIC,死活弄不出来,感觉发送地址之后单片机收不到应答信号,想来想去会不会是我外部接了一个上拉电阻的原因,所以特来问问各位使用内部的硬件IIC还需要外接上拉电阻不?接了之后会不会有什么影响

    需要接。接了之后不会有其他影响

  • 难受,我边看寄存器边调试,发现产生一个开始信号之后,UCTXSTT这个为就一直是1,表面从机没给应答,不知道怎么回事,从机应该不会出错,毕竟模拟IIC就是这个地址,无奈,希望大家给点意见,感谢!

  • lingming zhang 说:

    难受,我边看寄存器边调试,发现产生一个开始信号之后,UCTXSTT这个为就一直是1,表面从机没给应答,不知道怎么回事,从机应该不会出错,毕竟模拟IIC就是这个地址,无奈,希望大家给点意见,感谢!

    你是不是用Launchpad调的? Launchpad 上P1.6接着一个LED,你需要把跳帽拔掉

    #include <msp430.h>
    
    unsigned char TXData[3]={0x01,0b10000100,0b10000011};
    unsigned char TXByteCtr;
    
    int main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
      P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
      UCB0CTL1 |= UCSWRST;                      // Enable SW reset
      UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
      UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
      UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
      UCB0BR1 = 0;
      UCB0I2CSA = 0x48;                         // Slave Address is 048h
      UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
      IE2 |= UCB0TXIE;                          // Enable TX interrupt
    
    
    
      TXByteCtr = 1;                          // Load TX byte counter
      __bis_SR_register(GIE);        // Enter LPM0 w/ interrupts
    
    
       while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
       UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
    
    
    }
    
    //------------------------------------------------------------------------------
    // The USCIAB0TX_ISR is structured such that it can be used to transmit any
    // number of bytes by pre-loading TXByteCtr with the byte count.
    //------------------------------------------------------------------------------
    #pragma vector = USCIAB0TX_VECTOR
    __interrupt void USCIAB0TX_ISR(void)
    {
      if (TXByteCtr==1)                            // Check TX byte counter
      {
    	  UCB0TXBUF = TXData[0];                     // Load TX buffer
    	  UCB0TXBUF = TXData[1];                     // Load TX buffer
    	  UCB0TXBUF = TXData[2];                     // Load TX buffer
    	  TXByteCtr--;
      }
      if(TXByteCtr==0)
      {
        UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
        IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag
       // __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
      }
    }
    

  • 老哥,救星啊,我确实没想到还有这一出,我感谢你了,这个经验记住了!!!