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的硬件IIC调试ADS1115一直调不出来

Other Parts Discussed in Thread: ADS1115

问题:当IIC发送起始信号后始终无法接收到ADS1115的ACK.。ADS1115的地址是0x48。附上只与发送数据相关的代码代码

void I2C_Init()
{

    //--------开启引脚复用功能,BIT6->SCL   BIT7->SDA-------//
    P1SEL |= BIT6+BIT7;
    P1SEL2 |= BIT6+BIT7;
    //--------软件复位状态-----------//
     UCB0CTL1 |= UCSWRST;
     //--------同步通信I2C主机状态-------//
     UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;
     //-------使用SMCLK,软件复位--------//
     UCB0CTL1 = UCSSEL_2 + UCSWRST;
     //-------分频系数-------//
     UCB0BR0 = 11;
     //-------一级别分频一般不启用--------//
     UCB0BR1 = 0;
     //------从机地址,可在宏定义中修改-------//
     UCB0I2CSA = Slave_Addr;
     //------开启I2C-------//
     UCB0CTL1 &=~ UCSWRST;
     _enable_interrupts();

}

void I2C_Tx_Init()
{

    UCB0CTL1 |= UCTR;

    IFG2 &=~ UCB0TXIFG;

    IE2 &=~ UCB0RXIE;

    IE2 |= UCB0TXIE;


}

void I2C_TxFrame(unsigned char num,unsigned char *p_Tx)
{
    while(UCB0STAT & UCBBUSY);
    TxByteCnt = num;
    pTxData = (unsigned char *)p_Tx;
    I2C_Tx_Init();
    UCB0CTL1 |= UCTXSTT;
    __bis_SR_register(CPUOFF + GIE);
    while (UCB0CTL1 & UCTXSTP);

}

**********************************************/
void I2C_TxFrame_ISR()
{
    //---------------判断数据剩余个数-------//
    if(TxByteCnt)
    {
        //--------数据填充-------//
        UCB0TXBUF = *pTxData;
        //--------指针位移-------//
        pTxData++;
        //--------数据个数减一-------//
        TxByteCnt--;
    }
    else
    {
        //--------数据个数为0,发送停止位------//
        UCB0CTL1 |= UCTXSTP;
        //-------没有把数据写入buffer,不能清除中断,需要手动清除中断----------//
        IFG2 &=~ UCB0TXIFG;

    }
}

#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR_HOOK(void)
{
    //-------UCA0和UCB0共用一个中断向量,进入中断前判断哪个触发了中断

    if(IFG2 & UCA0TXIFG)
    {
    IFG2 &=~ UCA0TXIFG;
    //---------调用事件处理函数-------

    }
    if(IFG2 & UCB0TXIFG)
        {
        //---------调用事件处理函数-------
         I2C_TxFrame_ISR();

        }

}

  • 最好观察以下时序。

    程序可以参考http://www.deyisupport.com/question_answer/microcontrollers/msp430/f/55/t/11287.aspx

  • lingming zhang 说:

    问题:�IIC发送起始信号后始终无法接收到ADS1115的ACK.。ADS1115的地址是0x48。附上只与发送数据相关的代码代码

    void I2C_Init()
    {

        //--------开启引脚复用功能,BIT6->SCL   BIT7->SDA-------//
        P1SEL |= BIT6+BIT7;
        P1SEL2 |= BIT6+BIT7;
        //--------软件复位状态-----------//
         UCB0CTL1 |= UCSWRST;
         //--------同步通信I2C主机状态-------//
         UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;
         //-------使用SMCLK,软件复位--------//
         UCB0CTL1 = UCSSEL_2 + UCSWRST;
         //-------分频系数-------//
         UCB0BR0 = 11;
         //-------一级别分频一般不启用--------//
         UCB0BR1 = 0;
         //------从机地址,可在宏定义中修改-------//
         UCB0I2CSA = Slave_Addr;
         //------开启I2C-------//
         UCB0CTL1 &=~ UCSWRST;
         _enable_interrupts();

    }

    void I2C_Tx_Init()
    {

        UCB0CTL1 |= UCTR;

        IFG2 &=~ UCB0TXIFG;

        IE2 &=~ UCB0RXIE;

        IE2 |= UCB0TXIE;


    }

    void I2C_TxFrame(unsigned char num,unsigned char *p_Tx)
    {
        while(UCB0STAT & UCBBUSY);
        TxByteCnt = num;
        pTxData = (unsigned char *)p_Tx;
        I2C_Tx_Init();
        UCB0CTL1 |= UCTXSTT;
        __bis_SR_register(CPUOFF + GIE);
        while (UCB0CTL1 & UCTXSTP);

    }

    **********************************************/
    void I2C_TxFrame_ISR()
    {
        //---------------判断数据剩余个数-------//
        if(TxByteCnt)
        {
            //--------数据填充-------//
            UCB0TXBUF = *pTxData;
            //--------指针位移-------//
            pTxData++;
            //--------数据个数减一-------//
            TxByteCnt--;
        }
        else
        {
            //--------数据个数为0,发送停止位------//
            UCB0CTL1 |= UCTXSTP;
            //-------没有把数据写入buffer,不能清除中断,需要手动清除中断----------//
            IFG2 &=~ UCB0TXIFG;

        }
    }

    #pragma vector=USCIAB0TX_VECTOR
    __interrupt void USCI0TX_ISR_HOOK(void)
    {
        //-------UCA0和UCB0共用一个中断向量,进入中断前判断哪个触发了中断

        if(IFG2 & UCA0TXIFG)
        {
        IFG2 &=~ UCA0TXIFG;
        //---------调用事件处理函数-------

        }
        if(IFG2 & UCB0TXIFG)
            {
            //---------调用事件处理函数-------
             I2C_TxFrame_ISR();

            }

    }

    硬件上在IIC总线上加上拉了没?