苏杭 发表于 2014-8-21 21:47:52

G2553 硬件I2C接口一直卡在从机应答

基本上是照着官方例程写的,驱动AD5933,器件地址是0X0D,电路焊接好之后调程序(单步调试),
卡在while (UCB0CTL1 & UCTXSTT);这句话,查看寄存器,发现UCTXSTT一直为1,并没有接收到从机应答
请问各位前辈怎么调试出来I2C的,有什么要注意的事项呢?

苏杭 发表于 2014-8-21 21:49:18

#include "i2c.h"

uchar TXByteCtr,RXByteCtr;
uchar TxData;
uchar RxBuf={0x00};

void Init_I2C(void)
{
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/160 = ~100kHz
UCB0BR1 = 0;
P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
UCB0I2CSA = SlaveAddress;
UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
}

void I2C_WriteMode(void)
{
UCB0CTL1 |= UCTR;
IFG2 &=~ UCB0TXIFG;
IE2 &=~ UCB0RXIE;
IE2 |= UCB0TXIE;
}
void I2C_ReadMode(void)
{
UCB0CTL1 &=~ UCTR;
IFG2 &=~ UCB0RXIFG;
IE2 &=~ UCB0TXIE;
IE2 |= UCB0RXIE;                              // 关闭发送中断,开启接收中断
}
/*----------------------------------------------------------------------------
功能:向I2C接口发送1个字节数据
输入:待发送字节个数 num,7-bit从机地址slave_addr
输出:
说明:在发送第1个字节过程中需要置位停止位,待发送数据放在TxData
----------------------------------------------------------------------------*/
void I2C_Txbyte(uchar Reg_addr,uchar Reg_data)
{
while(UCB0STAT & UCBBUSY);
I2C_WriteMode();
TxData=Reg_addr;
TxData=Reg_data;
TXByteCtr=2;                                     // Load TX byte counter
UCB0CTL1 |= UCTXSTT;               // I2C TX, start condition
while (UCB0CTL1 & UCTXSTT);
__bis_SR_register(CPUOFF + GIE);                   // Enter LPM0 w/ interrupts
while (UCB0CTL1 & UCTXSTP);
}

void I2C_Rxbyte(uchar Reg_addr)
{
while(UCB0STAT & UCBBUSY);
I2C_WriteMode();
TxData=Reg_addr;
TXByteCtr=1;                                    // Load TX byte counter
UCB0CTL1 |= UCTXSTT;               // I2C TX, start condition
__bis_SR_register(CPUOFF + GIE);                   // Enter LPM0 w/ interrupts
while (UCB0CTL1 & UCTXSTP);
I2C_ReadMode();
RXByteCtr=1;
UCB0CTL1 |= UCTXSTT;
__bis_SR_register(CPUOFF + GIE);
while (IFG2 & UCB0RXIFG);
while (UCB0CTL1 & UCTXSTP);
}



#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
if ( IFG2 & UCB0TXIFG )
{
       if (TXByteCtr)                            // Check TX byte counter
       {
      TXByteCtr--;
      UCB0TXBUF =TxData;               // Load TX buffer                               // Decrement TX byte counter
       }
   else
       {
      UCB0CTL1 |= UCTXSTP;                  // I2C stop condition
      IFG2&=~UCB0TXIFG;                     // Clear USCI_B0 TX int flag
      //IE2 &=~UCB0TXIE;
      __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
       }
}
if ( IFG2 & UCB0RXIFG )
    {
   if (RXByteCtr)
   {
      RXByteCtr--;
      if(RXByteCtr==0)
      {
       UCB0CTL1 |= UCTXSTP+UCTXNACK;//必须在接受最后一个数据之前发送停止和NACK
      }
      RxBuf=UCB0RXBUF;
      UCB0CTL1 &=~UCTXNACK;
   }
   else
   {
      //UCB0CTL1 |= UCTXSTP;
      IFG2&=~UCB0RXIFG;
       __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
   }
    }
}

祥子 发表于 2014-8-22 10:42:42

硬件上要加上拉电阻了吗?

hkhkdyx 发表于 2015-3-29 16:59:16

我用G2553调试BH1750光照强度模块正常通过,感觉要注意的一点是设置地址问题,实际地址会比理论地址右移一位

34071417 发表于 2015-3-30 15:53:06

430硬件I2C不是很好用,建议换成IO模拟的I2C。

wanyyxum 发表于 2015-3-31 15:39:44

模拟比较方便,也便于移植,可是试试!
页: [1]
查看完整版本: G2553 硬件I2C接口一直卡在从机应答