/** Based on https://github.com/jaromir-sukuba/efm8prog/ Use his SW to program EFM8 using arduino. This needs some work though (but it works) **/ #define C2D 2 #define C2CK 3 #define LED 13 #define INBUSY 0x02 #define OUTREADY 0x01 void c2_send_bits (unsigned char data, unsigned char len); void c2_pulse_clk (void); unsigned char c2_read_bits (unsigned char len); void c2_rst (void); void c2_write_addr (unsigned char addr); unsigned char c2_read_addr (void); unsigned char c2_read_data (void); void c2_write_data (unsigned char addr); unsigned char c2_init_PI (void); unsigned char c2_read_flash_block (unsigned int addr, unsigned char * data, unsigned char len); unsigned char c2_poll_bit_low (unsigned char mask); unsigned char c2_poll_bit_high (unsigned char mask); unsigned char c2_write_flash_block (unsigned int addr, unsigned char * data, unsigned char len); unsigned char c2_erase_device (void); void c2_rst() { digitalWrite(C2CK, LOW); delayMicroseconds(100); digitalWrite(C2CK, HIGH); delayMicroseconds(100); } void c2_pulse_clk() { pinMode(C2CK, OUTPUT); digitalWrite(C2CK, LOW); digitalWrite(C2CK, LOW); digitalWrite(C2CK, LOW); digitalWrite(C2CK, LOW); digitalWrite(C2CK, HIGH); } unsigned char c2_read_bits (unsigned char len) { unsigned char i, data, mask; mask = 0x01 << (len-1); data = 0; pinMode(C2D, INPUT); for (i=0;i> 1; if (digitalRead(C2D) == HIGH) { data = data | mask; } } pinMode(C2D, OUTPUT); return data; } void c2_send_bits (unsigned char data, unsigned char len) { unsigned char i; pinMode(C2D, OUTPUT); for (i=0;i> 1; } } void c2_write_data (unsigned char data) { unsigned char retval; c2_send_bits(0x0, 1); c2_send_bits(0x1, 2); c2_send_bits(0x0, 2); c2_send_bits(data, 8); retval = 0; while (retval == 0) { retval = c2_read_bits(1); } c2_send_bits(0x0, 1); } unsigned char c2_poll_bit_high (unsigned char mask) { unsigned char retval; retval = c2_read_addr(); while ((retval&mask)==0) retval = c2_read_addr(); } unsigned char c2_poll_bit_low (unsigned char mask) { unsigned char retval; retval = c2_read_addr(); while (retval&mask) retval = c2_read_addr(); } unsigned char c2_read_flash_block (unsigned int addr, unsigned char * data, unsigned char len) { unsigned char retval,i; c2_write_addr(0xB4); c2_write_data(0x06); c2_poll_bit_low(INBUSY); c2_poll_bit_high(OUTREADY); retval = c2_read_data(); c2_write_data(addr>>8); c2_poll_bit_low(INBUSY); c2_write_data(addr&0xFF); c2_poll_bit_low(INBUSY); c2_write_data(len); c2_poll_bit_low(INBUSY); c2_poll_bit_high(OUTREADY); retval = c2_read_data(); for (i=0;i>8); c2_poll_bit_low(INBUSY); c2_write_data(addr&0xFF); c2_poll_bit_low(INBUSY); c2_write_data(len); c2_poll_bit_low(INBUSY); c2_poll_bit_high(OUTREADY); retval = c2_read_data(); for (i=0;i