TI中文支持网
TI专业的中文技术问题搜集分享网站

用MSP430G2553的硬件IIC调试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

Ling Zhu2:

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();        }}

赞(0)
未经允许不得转载:TI中文支持网 » 用MSP430G2553的硬件IIC调试ADS1115一直调不出来
分享到: 更多 (0)