void BoardDriverInit(void) { mod_led_init(&LED_BMS_HEARTBEAT, &ledCfg1); mod_led_init(&LED_CAN_RX, &ledCfg2); mod_led_init(&LED_BOARDHEARTBEAT, &ledCfg3); }
int main(void) { uint8_t data; uint8_t blinkDelay = BLINK_DELAY; bool blinkToggle = false; pState = PS_IDLE; mCounter = 0; mod_led_init(); st_init_tmr0(); usiTwiSlaveInit( SLAVE_ADRS ); // Initialize USI hardware for I2C Slave operation. mod_led_toggle(4); sei(); // Enable interrupts. usitwiSlaveEnable(); // Enable the USI interface to receive data. mod_led_toggle(3); // A simple loop to check for I2C Commands. // A state variable is needed to process multi-byte messages. // 01, 05 are Writes. 04 is a Read. while(1) { #if 0 // Heart Beat LED if( GPIOR0 & (1<<DEV_1MS_TIC) ) { GPIOR0 &= ~(1<<DEV_1MS_TIC); if(--blinkDelay == 0) { blinkDelay = BLINK_DELAY; if(blinkToggle) { mod_led_on(); } else { mod_led_off(); } blinkToggle = !blinkToggle; } } #endif //mod_led_toggle(2); if( usiTwiDataInReceiveBuffer() ) { data = usiTwiReceiveByte(); switch (pState) { case PS_IDLE: // Process new message ++mCounter; switch(data) { case 01: // Writing to the Control Register pState = PS_CMD01_0; // next byte is Control byte break; case 04: // Reading counter usiTwiTransmitByte(mCounter); // load up data for following read. break; case 05: // Writing to LED pState = PS_CMD05_0; // next byte controls LED break; default: break; // Ignore unknown command. } break; case PS_CMD01_0: // Process Control byte. b0=1 clears counter. if( (data & 0x01) == 0x01 ) { mCounter = 0; } pState = PS_IDLE; // reset for next message break; case PS_CMD05_0: // Change LED state // If the data is 00, then turn OFF the LED. Turn it ON for any non-zero value. // NOTE: LED hardware is wired 'Active LOW'. if( data == 0) { mod_led_off(); // Turn LED OFF. } else { mod_led_on(); // Turn LED ON. } pState = PS_IDLE; // reset for next message break; default: pState = PS_IDLE; // ERROR, restore to know state break; } } } }
int main(void){ unsigned int temp_int; unsigned char val = 0; CTS_DDR_REG |= (1<<CTS_PIN); // set to output CTS_PORT_REG |= (1<<CTS_PIN); // set high RTS_DDR_REG &= ~(1<<CTS_PIN); // set to input RTS_PORT_REG |= (1<<CTS_PIN); // enable pull-up mod_led_init(); InitTWI(); initbootuart(); // Initialize UART. /* Main loop */ while(true) { val = recchar(); // Wait for command character. switch(val) { case 'P': case 'L': case 'E': sendchar('\r'); break; // Read lock byte -> execute command case 'r': switch(command_char) { case 'a': // NOT SUPPORTED in new code. read_and_send( TWI_CMD_AVERSION ); break; case 'b': // NOT SUPPORTED in new code. read_and_send( TWI_CMD_BVERSION ); break; case 'd': // Read CRCHI sendchar(CRC_HI); break; case 'e': // Read CRCLO sendchar(CRC_LO); break; case 'f': // Status condition // NOT SUPPORTED in new code. read_and_send(TWI_CMD_GETERRCONDN); break; default: sendchar(0xFF); break; } break; case 'l': // Write lock byte -> load command. NOT SUPPORTED in new code. // NOTE: This looks like a hijacked command to do a CRC check. command_char = recchar(); #if 0 if( command_char == 'c' ) { send_command( TWI_CMD_CRCCHECK ); read_from_slave(); CRC_HI= statusCode; read_from_slave(); CRC_LO = statusCode; } #endif sendchar('\r'); break; case 'N': // Read high fuse bits -> BVERSION read_and_send( TWI_CMD_BVERSION ); break; case 'F': // Low Fuse Bits -> AVERSION read_and_send( TWI_CMD_AVERSION ); break; case 'a': sendchar('Y'); // Yes, we do auto-increment. break; case 'A': addr =(recchar()<<8) | recchar(); // Read address high and low byte. if(addr > MAX__APP_ADDR) over_size_flag = 1; //+ 15mar17 ndp - send address to Slave. slaveCmdBuff[0] = CMD_RECV_ADRS; slaveCmdBuff[1] = (uint8_t)((addr>>8) & 0x00FF); // AH slaveCmdBuff[2] = (uint8_t)(addr & 0x00FF); // AL (void) MasterTransmit( SLAVE_ADDRESS, slaveCmdBuff, 3 ); //- sendchar('\r'); // Send OK back. break; case 'e': // Chip erase. NOT SUPPORTED in new code. #if 0 runApp[0] = TWI_CMD_ERASEFLASH; runApp[1] = TWI_CMD_ERASEFLASH; get_slave_status(); success = MasterTransmit( SLAVE_ADDRESS, runApp, 2 ); #endif sendchar('\r'); // Send OK back. break; case 'b': // Check block load support. sendchar('Y'); // Report block load supported. sendchar((BLOCKSIZE>>8) & 0xFF); // MSB first. sendchar(BLOCKSIZE&0xFF); // Report BLOCKSIZE (bytes). over_size_flag = 0; // ndp 1-29-2017 fix break; case 'B': // Start block load. temp_int = (recchar()<<8) | recchar(); // Get block size. val = recchar(); // Get memtype. sendchar( BlockLoad(temp_int, val) ); // Block load. // mod_led_toggle(4); // Need a short delay here. pageBuffer[0] = CMD_RECV_DATA; // Address was sent in 'A' command service. pageBuffer[1] = (uint8_t)(temp_int & 0x00FF); // NL..Only block size less than 256 supported. // NOTE: Always sends PAGE_SIZE even if less data received from Host. success = MasterTransmit( SLAVE_ADDRESS, pageBuffer, pageBuffer[1]+2 ); break; case 'S': // Return programmer identifier. sendchar('A'); // Return 'AVRBOOT'. sendchar('V'); // Software identifier (aka programmer signature) is always 7 characters. sendchar('R'); sendchar('B'); sendchar('O'); sendchar('O'); sendchar('T'); reps =0; break; case 'V': // Return software version. // NOTE: TODO Should implement in new code. // send_command(TWI_CMD_EXECUTEAPP); // Disable bootloader mode for slave sendchar('2'); sendchar('0'); break; case 's': // Return signature bytes [for the Target device ATtiny85]. slaveCmdBuff[0] = CMD_GET_SIG; (void) MasterTransmit( SLAVE_ADDRESS, slaveCmdBuff, 1 ); mod_led_toggle(200); // Need a short delay here to let Slave set up data. (void) MasterReceive( SLAVE_ADDRESS, slaveCmdBuff, 3 ); sendchar( slaveCmdBuff[2] ); sendchar( slaveCmdBuff[1] ); sendchar( slaveCmdBuff[0] ); break; /* Add missing command .. ndp 01-29-2017 * Return Flash Data. * * TODO: Need to read from Slave. */ case 'g': temp_int = (recchar()<<8) | recchar(); // Get block size. val = recchar(); // Get mem type. // NOTE: Address was sent in 'A' command process. slaveCmdBuff[0] = CMD_GET_DATA; slaveCmdBuff[1] = (uint8_t)(temp_int & 0x00FF); (void) MasterTransmit( SLAVE_ADDRESS, slaveCmdBuff, 2 ); mod_led_toggle(200); // Need a short delay here to let Slave set up data. (void) MasterReceive( SLAVE_ADDRESS, pageBuffer, (temp_int & 0x00FF) ); for(int i=0; i<temp_int; ++i) { sendchar( pageBuffer[i] ); } break; default: if(val != 0x1b) { // If not ESC, then it is unrecognized... sendchar('?'); } break; } // end: switch() } // end: while(true) } // end: main