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