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.

MSP430 LPM0 和 USCI IIC 问题请教

Other Parts Discussed in Thread: MSP430G2452

1、LPM0 和 __bis_SR_register(CPUOFF + GIE) 的区别:

   LPM0 仅仅设置CPUOFF位, __bis_SR_register(CPUOFF + GIE) 设置CPUOFF位 和开中断,是吗?

  能否给出所有的宏定义(低功耗模式相关)

我已知道的

LPM0

__bis_SR_register(CPUOFF + GIE)

2、使用多个中断  某时刻只能有一个中断使能 对吗?

3、USCI  IIC 中断发送数据如何发送?

以下程序有什么问题?

谢谢!

 //硬件IIC 中断方式
  USCI_I2C_Init();
  IE2 |= UCB0TXIE; // Enable TX interrupt
 
  PTxData = u8MCP_Con;
  TXByteCtr = 6;
  while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
  UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
  __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts


 
 while(1)
 {
    
    PTxData = UCB0_TX;
    TXByteCtr = 2;
    
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition

    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts
    delay_ms(1000);
    /*time_cnt = 0;
    IE2 &= ~UCB0TXIE;
    CCTL0 |= CCIE;
    __bis_SR_register(CPUOFF + GIE);
    CCTL0 &= ~CCIE;
    IE2 |= UCB0TXIE;*/

    
    TXByteCtr = 2;
    PTxData = &UCB0_TX[2];
    
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
    
    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts
    delay_ms(1000);
    /*time_cnt = 0;
    IE2 &= ~UCB0TXIE;
    CCTL0 |= CCIE;
    __bis_SR_register(CPUOFF + GIE);
    CCTL0 &= ~CCIE;
    IE2 |= UCB0TXIE;*/
 }

  return 0;
}


void USCI_I2C_Init(void)
{
  P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  P1SEL2|= BIT6 + BIT7;                     // 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 = 48;                             // fSCL = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;
  UCB0I2CSA = MCP23017_HW_ADDR;             // Set slave address
  //UCB0I2CSA = PCF8591_HW_ADDR;
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
 
  //IE2 |= UCB0RXIE;                          // Enable RX interrupt
}



void USCI_SendByte(u8 ch1, u8 ch2)
{
  //while(UCB0STAT & UCBBUSY);

  UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
  while(!(IFG2 & UCB0TXIFG));

  UCB0TXBUF = ch1;
  while(!(IFG2 & UCB0TXIFG));
  UCB0TXBUF = ch2;
  while(!(IFG2 & UCB0TXIFG));

  UCB0CTL1 |= UCTXSTP;
  while (UCB0CTL1 & UCTXSTP);
}

 
// USCI_B0 Data ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{  
  if (TXByteCtr)                            // Check TX byte counter
  {
    UCB0TXBUF = *PTxData++;                     // Load TX buffer
    TXByteCtr--;                            // Decrement TX byte counter
  }
  if (TXByteCtr)
  {
    UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
    IFG2 &= ~UCB0TXIFG;                     // Clear USCI_B0 TX int flag
    __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
  }
}



// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
  CCR0 += 50000;                            // Add Offset to CCR0
  time_cnt++;
  if(time_cnt >= 20)
  {
    time_cnt = 0;
    __bic_SR_register_on_exit(CPUOFF);
  }
}

  • 你好,

    第一个问题你是正确的,如果你用CCS打开一个工程,你可以查到他的宏定义:

    我利用MSP430G2452建立的一个工程,以下定义在MSP430G2452.h文件里面。

    #define LPM0         _bis_SR_register(LPM0_bits)         /* Enter Low Power Mode 0 */

    #define LPM0_bits              (CPUOFF)

    unsigned short _bic_SR_register(unsigned short mask);

    .... 

    详细见

    2.如果你使能多个中断,并且同时请求MCU,MCU只相应一个中断,MSP430中断有自定义的优先级,见user guide。

    3.中断发送数据是发送数据完毕之后会产生中断,也就是你在main函数里面王TX buf里面写数据,数据发送完毕之后才会产生中断,然后程序跳到发送中断处理。