#include #include #include const uint16_t interrupts = EUSCI_B_I2C_RECEIVE_INTERRUPT0; volatile uint32_t i; volatile uint8_t Rxbuf[5]; volatile uint8_t status; int main(void){ WDT_A_hold(WDT_A_BASE); // Stop watchdog timer GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0 + GPIO_PIN1); // Set P1.0 + 1.1 to output direction - LED1 + LED2 GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN6); // Set P1.6 to output - Standby1 GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN7); // Set P2.7 to output - Reset1 GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN6); // Set P2.6 to output - Standby2 GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN5); // Set P2.5 to output - Reset2 GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0 + GPIO_PIN1); // Set LEDs to low GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN1); // Set P2.1 to input - Button // Set P1.2 to input - i2c_SDA & P1.3 to input - i2c_SCL GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1, GPIO_PIN2 + GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION); // Disable the GPIO power-on default high-impedance mode to activate previously configured port settings PMM_unlockLPM5(); EUSCI_B_I2C_initSlaveParam initSlaveParam = {0}; initSlaveParam.slaveAddress = 0x48; initSlaveParam.slaveAddressOffset = EUSCI_B_I2C_OWN_ADDRESS_OFFSET0; initSlaveParam.slaveOwnAddressEnable = EUSCI_B_I2C_OWN_ADDRESS_ENABLE; EUSCI_B_I2C_initSlave(EUSCI_B0_BASE, &initSlaveParam); EUSCI_B_I2C_setMode(EUSCI_B0_BASE, EUSCI_B_I2C_RECEIVE_MODE); EUSCI_B_I2C_enable(EUSCI_B0_BASE); EUSCI_B_I2C_clearInterrupt(EUSCI_B0_BASE, interrupts); EUSCI_B_I2C_enableInterrupt(EUSCI_B0_BASE, interrupts); // receive interrupt enable GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN6); __delay_cycles(1000); GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN6); // Standby board 1 __delay_cycles(5000000); GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN7); // Reset board 1 GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN7); __bis_SR_register(CPUOFF + GIE); __no_operation(); } #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=USCI_B0_VECTOR __interrupt #elif defined(__GNUC__) __attribute__((interrupt(USCI_B0_VECTOR))) #endif void USCIB0_ISR(void) { switch(__even_in_range(UCB0IV, USCI_I2C_UCBIT9IFG)) { case USCI_NONE: // No interrupts break; break; case USCI_I2C_UCALIFG: // Arbitration lost break; case USCI_I2C_UCNACKIFG: // NAK received (master only) break; case USCI_I2C_UCSTTIFG: // START condition detected with own address (slave mode only) break; case USCI_I2C_UCSTPIFG: // STOP condition detected (master & slave mode) break; case USCI_I2C_UCRXIFG3: // RXIFG3 break; case USCI_I2C_UCTXIFG3: // TXIFG3 break; case USCI_I2C_UCRXIFG2: // RXIFG2 break; case USCI_I2C_UCTXIFG2: // TXIFG2 break; case USCI_I2C_UCRXIFG1: // RXIFG1 break; case USCI_I2C_UCTXIFG1: // TXIFG1 break; case USCI_I2C_UCRXIFG0: // RXIFG0 Rxbuf[0] = UCB0RXBUF; //EUSCI_B_I2C_slaveGetData(EUSCI_B0_BASE); if(Rxbuf[0]){ GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN1); } break; case USCI_I2C_UCTXIFG0: // TXIFG0 break; case USCI_I2C_UCBCNTIFG: // Byte count limit reached (UCBxTBCNT) break; case USCI_I2C_UCCLTOIFG: // Clock low timeout - clock held low too long break; case USCI_I2C_UCBIT9IFG: // Generated on 9th bit of a transmit (for debugging) break; default: break; } }