#include <msp430.h> 
 
  
 
unsigned char TXData; 
 
unsigned char TXByteCtr; 
 
  
 
int main(void) 
 
{ 
 
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT 
 
  P3SEL |= 0x03;                            // 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 
 
  UCB0IE |= UCTXIE;                         // Enable TX interrupt 
 
  
 
  TXData = 0x01;                            // Holds TX data 
 
  
 
  while (1) 
 
  { 
 
    TXByteCtr = 1;                          // Load TX byte counter 
 
  
 
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent 
 
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition 
 
    
 
    __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0 w/ interrupts 
 
    __no_operation();                       // Remain in LPM0 until all data 
 
                                            // is TX'd 
 
                                               
 
    TXData++;                               // Increment data byte 
 
  } 
 
} 
 
  
 
//------------------------------------------------------------------------------ 
 
// The USCIAB0_ISR is structured such that it can be used to transmit any 
 
// number of bytes by pre-loading TXByteCtr with the byte count. 
 
//------------------------------------------------------------------------------ 
 
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) 
 
#pragma vector = USCI_B0_VECTOR 
 
__interrupt void USCI_B0_ISR(void) 
 
#elif defined(__GNUC__) 
 
void __attribute__ ((interrupt(USCI_B0_VECTOR))) USCI_B0_ISR (void) 
 
#else 
 
#error Compiler not supported! 
 
#endif 
 
{ 
 
  switch(__even_in_range(UCB0IV,12)) 
 
  { 
 
  case  0: break;                           // Vector  0: No interrupts 
 
  case  2: break;                           // Vector  2: ALIFG 
 
  case  4: break;                           // Vector  4: NACKIFG 
 
  case  6: break;                           // Vector  6: STTIFG 
 
  case  8: break;                           // Vector  8: STPIFG 
 
  case 10: break;                           // Vector 10: RXIFG 
 
  case 12:                                  // Vector 12: TXIFG   
 
    if (TXByteCtr)                          // Check TX byte counter 
 
    { 
 
      UCB0TXBUF = TXData;                   // Load TX buffer 
 
      TXByteCtr--;                          // Decrement TX byte counter 
 
    } 
 
    else 
 
    { 
 
      UCB0CTL1 |= UCTXSTP;                  // I2C stop condition 
 
      UCB0IFG &= ~UCTXIFG;                  // Clear USCI_B0 TX int flag 
 
      __bic_SR_register_on_exit(LPM0_bits); // Exit LPM0 
 
    } 
 
    break; 
 
  default: break; 
 
  } 
 
} 
 
 上面是TI官方提供的硬件I2C的一个操作例程。我将该例程下载到5528单片机中,调试中发现无法进入中断服务函数。我觉得执行完下面三句后,应该就要进入中断。 
 
 while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent 
 
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition 
 
    
 
    __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0 w/ interrupts 
 
其中, UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition  这条语句执行完后应该将起始位和从机地址发送出去,理论上在中断使能的情况下就可以进入中断了。 
 
从机是PCF8574(i/o扩展芯片,用来驱动lcd1602),默认地址为0x27,从机地址是对的。上下拉电阻也加上了。不知道问题出在哪个方面,请大家帮帮忙,谢谢! |   
     
  
 |