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.

MSP430 G2553 硬件I2C SCL为什么拉这么长?

  • 楼主你好!

    能否把给I2C模块的时钟信号也拉出来,用示波器同时显示?

  • 楼主这个现象很奇怪,SCL和SDA线接了几个从设备?能不能给个I2C大概的连接电路图?

  • I2C模块的时钟信号 就是SCL吧。第一幅图的蓝色的那个就是时钟信号,黄色的是SDA。

  • 只有一个从设备,是LCD1602. 程序我就是用TI官方例程 msp430g2xx3_uscib0_i2c_08,只是把从地址改了一下。我在SDA和SCL分别接了2个10K的上拉电阻,还有把P1.6下面那个跳线拔了。一共就4根线。SDA,SCL,电源,地线。我把程序停在发送完START语句之后,发现的问题就是

    1.SCL第5个脉冲拉的特别长

    2.从设备返回NACK

    3.它返回了NACK后,SCL一直为低。

    4.我用示波器测量时钟频率大概就100HZ

    5.我看TI官方例程有点奇怪。在START信号发送之后,什么时候TXIFG会再次产生? 

    还有这句话

      while (1)
      {
        PTxData = (unsigned char *)TxData;      // TX array start address
        TXByteCtr = sizeof TxData;              // Load TX byte counter
        while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
        UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
        __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts
                                                // Remain in LPM0 until all data
                                                // is TX'd
      }
    为什么整个while(1)?  假设它能发送完数据,还有在用指针指向第一个地址,然后在发一遍?
    谢谢了~
  • 你好,

          建议换一个I2C从机试一下,比如直接两个430launchpad用I2C通信。

    关于第5个问题,TXIFG信号会在TXBUF发送完成之后产生。

    关于最后一个问题:while(1)语句的最后让430进入了LPM模式,进入I2C中断并退出之后依然会进入LPM模式,而不是

    PTxData = (unsigned char *)TxData;这一句。只有当字符串的数据发送完之后才会在中断中调用 __bic_SR_register_on_exit(CPUOFF);    退出LPM模式,这时才会执行PTxData = (unsigned char *)TxData;重新将指针指向数组开头。
  • 你好,

           我手上只有一个launchpad,但是我换了个主设备,lpc1768,它是可以使那个LCD显示的。

          那这个函数的功能就是  发完一个数组里的数据出去后 ,然后在发一遍,一直循环吗?

  • 你好,

           你的理解没错,这段代码功能就是不断发送数组中的内容。关于换个主设备就可以的问题,我觉得可能还是在编程上,方便的话能不能把初始化以及发送数据的代码post出来?

  • 你好:

      时钟源我还有个问题,SMCLK系统默认是1Mhz,想要100Khz,为什么官方例程要除以12呢?

    下面是代码了。

    void I2C_Init(uchar SlaveAddress)
    {
    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 = SlaveAddress;
    UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
    }

    void I2C_WriteMode(void)
    {
    IFG2 &=~ UCB0TXIFG;
    IE2 &=~ UCB0RXIE;
    IE2 |= UCB0TXIE;
    UCB0CTL1 |= UCTR;
    }

    void I2C_TxByte(uchar* TxData,uint len)
    {
    I2C_WriteMode();
    PTxData = (uchar *)TxData; // TX array start address
    TxByteCtr = len;
    UCB0CTL1 |= UCTXSTT;
    __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts
    }

    #pragma vector = USCIAB0TX_VECTOR
    __interrupt void USCIAB0TX_ISR(void)
    {

    if (TxByteCtr) // Check TX byte counter
    {
    UCB0TXBUF = *PTxData++; // Load TX buffer
    TxByteCtr--;
    }
    else
    {
    UCB0CTL1 |= UCTXSTP; // I2C stop condition
    IFG2&=~UCB0TXIFG; // Clear USCI_B0 TX int flag
    //IE2 &=~UCB0TXIE;
    __bic_SR_register_on_exit(CPUOFF); // Exit LPM0
    }

    }

  • 首先你所说的的1M其实是一个大概值,在430上电时候SMCLK的时钟源默认是DCO~1.1Mhz,但是DCO会受很多因素的影响,比如温度等,我们所说的100khz其实是一个大概值,所以说进行12分频。

x 出现错误。请重试或与管理员联系。