打印
[TI]

msp430f5528 硬件i2c 无法进入中断

[复制链接]
1392|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dingliangzhu|  楼主 | 2015-3-31 11:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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,从机地址是对的。上下拉电阻也加上了。不知道问题出在哪个方面,请大家帮帮忙,谢谢!

相关帖子

沙发
dingliangzhu|  楼主 | 2015-3-31 15:32 | 只看该作者
问题解决了,软件没问题,是我硬件的问题。

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
yytda + 6 赞一个!
板凳
小猫爱吃鱼| | 2015-5-22 21:35 | 只看该作者
正在用串口,用的是2410,也能用吧?

使用特权

评论回复
地板
adsionshm| | 2015-7-13 16:35 | 只看该作者
好东西,多谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

45

帖子

1

粉丝