__interrupt void USCI0RX_ISR(void) { TACCTL0 &= ~CCIE;//Stop Timmer #ifdef SAVE if((IFG2&UCB0RXIFG) == UCB0RXIFG) { //SPI_RxISR_Hook(); *SPI_Rx_Buffer = UCB0RXBUF; // 读取接收缓存,同时,用于清除“UCA0RXIFG”中断标志位 if(SPI_Rx_Size!=0) { SPI_Rx_Size-- ; // 待发送的数据减1 SPI_Rx_Buffer++; // 接收指针向下一字节偏移 UCB0TXBUF = 0xFF; // 纯粹为了提供CLK。UCA0TXIFG标志位同时被清除。 } IFG2 &= ~UCB0TXIFG; //! if(SPI_Rx_Size==0) // flagRx = 0; _bic_SR_register_on_exit(LPM0_bits); } #endif if((IFG2&UCA0RXIFG) == UCA0RXIFG) { IFG2 &= ~UCA0RXIFG; // 手动清除标志位 UART_OnRx(); // 调用Rx事件处理函数 } if (isInTimmer == 0) TACCTL0 |= CCIE;//Enable Timmer }
__interrupt void USI_TXRX(void) { switch(__even_in_range(i2c_state,12)) { case I2C_IDLE: break; case I2C_START: // generate start condition USISRL = 0x00; USICTL0 |= (USIGE|USIOE); USICTL0 &= ~USIGE; i2c_prepare_data_xmit_recv(); break; case I2C_PREPARE_ACKNACK: // prepare to receive ACK/NACK USICTL0 &= ~USIOE; // SDA = input USICNT |= 0x01; // Bit counter=1, receive (N)Ack bit i2c_state = I2C_HANDLE_RXTX; // Go to next state: check ACK/NACK and continue xmitting/receiving if necessary break; case I2C_HANDLE_RXTX: // Process Address Ack/Nack & handle data TX if((USISRL & BIT0) != 0) { // did we get a NACK? i2c_prepare_stop(); } else { i2c_prepare_data_xmit_recv(); } break; case I2C_RECEIVED_DATA: // received data, send ACK/NACK *i2c_receive_buffer = USISRL; i2c_receive_buffer++; USICTL0 |= USIOE; // SDA = output if(i2c_sequence_length > 0) { // If this is not the last byte USISRL = 0x00; // ACK i2c_state = I2C_HANDLE_RXTX; // Go to next state: data/rcv again } else { // last byte: send NACK USISRL = 0xff; // NACK i2c_state = I2C_PREPARE_STOP; // stop condition is next } USICNT |= 0x01; // Bit counter = 1, send ACK/NACK bit break; case I2C_PREPARE_STOP: // prepare stop condition i2c_prepare_stop(); // prepare stop, go to state 14 next break; case I2C_STOP: // Generate Stop Condition USISRL = 0x0FF; // USISRL = 1 to release SDA USICTL0 |= USIGE; // Transparent latch enabled USICTL0 &= ~(USIGE|USIOE); // Latch/SDA output disabled i2c_state = I2C_IDLE; // Reset state machine for next xmt if(i2c_wakeup_sr_bits) { _bic_SR_register_on_exit(i2c_wakeup_sr_bits); // exit active if prompted to } break; } USICTL1 &= ~USIIFG; // Clear pending flag }
__interrupt void USCI_A0_ISR(void) { switch(__even_in_range(UCA0IV,4)) { case 0: break; // Vector 0 - no interrupt case 2: // Vector 2 - RXIFG SPI_RxISR(); if(SPI_Rx_Size == 0) _bic_SR_register_on_exit(LPM0_bits); break; case 4: SPI_TxISR(); if(SPI_Tx_Size == 0) _bic_SR_register_on_exit(LPM0_bits); break; // Vector 4 - TXIFG default: break; } }
__interrupt void handleTimerA(void) { timeMSec++; // count milliseconds if(timeMSec == 1000) // if we reached 1 second { timeMSec = 0; // reset milliseconds timeSecond++; // increase seconds if(timeSecond == 60) // if we reached 1 minute { timeSecond = 0; // reset seconds timeMinute++; // increase minutes if(timeMinute == 60) // if we reached 1 hour { timeMinute = 0; // reset minutes } } VCOM ^= MLCD_VCOM; // invert polarity bit every second _bic_SR_register_on_exit(LPM0_bits); // wake up main loop every second } }
__interrupt void USCI0TX_ISR(void) { //TACCTL0 &= ~CCIE;//Stop Timmer #ifdef SAVE if((IFG2&UCB0TXIFG) == UCB0TXIFG) { //IFG2 &= ~UCB0TXIFG; // SPI_TxISR_Hook(); UCB0RXBUF; // Tx和Rx中断标志位都会置位。此处对UCA0RXBUF空操作,用于清除“UCA0RXIFG”中断标志位 if(SPI_Tx_Size!=0) { SPI_Tx_Size-- ; // 待发送的数据减1 SPI_Tx_Buffer++; // 发送指针向下一字节偏移 UCB0TXBUF = *SPI_Tx_Buffer; // 放入发送缓存,同时,用于清除“UCA0TXIFG”中断标志位 } else IFG2 &= ~UCB0TXIFG; if(SPI_Tx_Size==0) _bic_SR_register_on_exit(LPM0_bits); //IFG2 &= ~UCB0TXIFG; } #endif if((IFG2&UCA0TXIFG) == UCA0TXIFG) { IFG2 &= ~UCA0TXIFG; UART_OnTx(); // 调用Tx事件处理函数 //IFG2 &= ~UCA0TXIFG; // 手动清除标志位 } //TACCTL0 |= CCIE;//Enable Timmer //if (isInTimmer == 0) TACCTL0 |= CCIE; }
__interrupt void ADC10_ISR_HOOK(void) { _bic_SR_register_on_exit(LPM4_bits); }