2
2
* Based on https://gist.github.com/racerxdl/c9a592808acdd9cd178e6e97c83f8baf
3
3
* which was based on: https://github.com/jaromir-sukuba/efm8prog/
4
4
Use his SW to program EFM8 using arduino.
5
- This needs some work though (but it works)
6
5
**/
7
- #define C2D 2
8
- #define C2CK 3
9
- #define LED 13 // build in on Mega
6
+
7
+ // GPIO is manipulated through PORT mappings for better speed.
8
+ // Flashes EFM8 at about 10kB/s
9
+ // Baud rate: 1000000
10
+
11
+ // Digital pin 2 on Mega
12
+ #define C2D_PORT PORTE
13
+ #define C2D_PIN 4
14
+
15
+ // Digital pin 3 on Mega
16
+ #define C2CK_PORT PORTE
17
+ #define C2CK_PIN 5
18
+
19
+ #define LED LED_BUILTIN
10
20
11
21
#define INBUSY 0x02
12
22
#define OUTREADY 0x01
13
23
14
- void c2_send_bits (unsigned char data, unsigned char len);
15
- void c2_pulse_clk (void );
16
- unsigned char c2_read_bits (unsigned char len);
24
+ static void c2_send_bits (unsigned char data, unsigned char len);
25
+ static unsigned char c2_read_bits (unsigned char len);
17
26
18
27
void c2_rst (void );
19
28
void c2_write_addr (unsigned char addr);
20
- unsigned char c2_read_addr (void );
21
- unsigned char c2_read_data (void );
22
- void c2_write_data (unsigned char addr);
29
+ static unsigned char c2_read_addr (void );
30
+ static unsigned char c2_read_data (void );
31
+ static void c2_write_data (unsigned char addr);
23
32
24
33
unsigned char c2_init_PI (void );
25
34
unsigned char c2_read_flash_block (unsigned int addr, unsigned char * data, unsigned char len);
26
- unsigned char c2_poll_bit_low (unsigned char mask);
27
- unsigned char c2_poll_bit_high (unsigned char mask);
35
+ static unsigned char c2_poll_bit_low (unsigned char mask);
36
+ static unsigned char c2_poll_bit_high (unsigned char mask);
28
37
unsigned char c2_write_flash_block (unsigned int addr, unsigned char * data, unsigned char len);
29
38
unsigned char c2_erase_device (void );
30
39
31
40
32
41
void c2_rst () {
33
- digitalWrite (C2CK, LOW );
34
- delayMicroseconds (100 );
35
- digitalWrite (C2CK, HIGH );
36
- delayMicroseconds (100 );
42
+ C2CK_PORT &= ~( 1 <<C2CK_PIN );
43
+ delayMicroseconds (50 );
44
+ C2CK_PORT |= ( 1 <<C2CK_PIN );
45
+ delayMicroseconds (50 );
37
46
}
38
47
39
- void c2_pulse_clk () {
40
- pinMode (C2CK, OUTPUT);
41
- digitalWrite (C2CK, LOW);
42
- digitalWrite (C2CK, LOW);
43
- digitalWrite (C2CK, LOW);
44
- digitalWrite (C2CK, LOW);
45
- digitalWrite (C2CK, HIGH);
46
- }
48
+ #define c2_pulse_clk ()\
49
+ C2CK_PORT &= ~(1 <<C2CK_PIN); \
50
+ C2CK_PORT |= (1 <<C2CK_PIN);
51
+
47
52
48
- unsigned char c2_read_bits (unsigned char len) {
53
+ static unsigned char c2_read_bits (unsigned char len) {
49
54
unsigned char i, data, mask;
50
55
mask = 0x01 << (len-1 );
51
56
data = 0 ;
52
- pinMode (C2D, INPUT);
57
+ // pinMode(C2D, INPUT);
58
+ DDRE &= ~(1 <<C2D_PIN);
59
+ PINE &= (1 <<C2D_PIN);
53
60
for (i=0 ;i<len;i++) {
54
61
c2_pulse_clk ();
55
62
data = data >> 1 ;
56
- if (digitalRead (C2D) == HIGH ) {
63
+ if (PINE & ( 1 <<C2D_PIN) ) {
57
64
data = data | mask;
58
65
}
59
66
}
60
- pinMode (C2D, OUTPUT);
67
+ DDRE |= (1 <<C2D_PIN);
68
+ // pinMode(C2D, OUTPUT);
61
69
62
70
return data;
63
71
}
64
72
65
- void c2_send_bits (unsigned char data, unsigned char len) {
73
+ static void c2_send_bits (unsigned char data, unsigned char len) {
66
74
unsigned char i;
67
- pinMode (C2D, OUTPUT);
75
+ // pinMode(C2D, OUTPUT);
76
+ DDRE |= (1 <<C2D_PIN);
68
77
for (i=0 ;i<len;i++) {
69
78
if (data&0x01 ) {
70
- digitalWrite (C2D, HIGH );
79
+ C2D_PORT |= ( 1 <<C2D_PIN );
71
80
} else {
72
- digitalWrite (C2D, LOW);
81
+ C2D_PORT &= ~( 1 <<C2D_PIN);
73
82
}
74
83
c2_pulse_clk ();
75
84
data = data >> 1 ;
76
85
}
77
86
}
78
87
79
- void c2_write_data (unsigned char data) {
88
+ static void c2_write_data (unsigned char data) {
80
89
unsigned char retval;
81
90
c2_send_bits (0x0 , 1 );
82
91
c2_send_bits (0x1 , 2 );
@@ -89,13 +98,13 @@ void c2_write_data (unsigned char data) {
89
98
c2_send_bits (0x0 , 1 );
90
99
}
91
100
92
- unsigned char c2_poll_bit_high (unsigned char mask) {
101
+ static unsigned char c2_poll_bit_high (unsigned char mask) {
93
102
unsigned char retval;
94
103
retval = c2_read_addr ();
95
104
while ((retval&mask)==0 ) retval = c2_read_addr ();
96
105
}
97
106
98
- unsigned char c2_poll_bit_low (unsigned char mask) {
107
+ static unsigned char c2_poll_bit_low (unsigned char mask) {
99
108
unsigned char retval;
100
109
retval = c2_read_addr ();
101
110
while (retval&mask) retval = c2_read_addr ();
@@ -173,7 +182,7 @@ unsigned char c2_init_PI (void) {
173
182
return 0 ;
174
183
}
175
184
176
- unsigned char c2_read_data () {
185
+ static unsigned char c2_read_data () {
177
186
unsigned char retval;
178
187
c2_send_bits (0x0 , 1 );
179
188
c2_send_bits (0x0 , 2 );
@@ -187,7 +196,7 @@ unsigned char c2_read_data() {
187
196
return retval;
188
197
}
189
198
190
- unsigned char c2_read_addr () {
199
+ static unsigned char c2_read_addr () {
191
200
unsigned char retval;
192
201
c2_send_bits (0x0 , 1 );
193
202
c2_send_bits (0x2 , 2 );
@@ -204,20 +213,20 @@ void c2_write_addr(unsigned char addr) {
204
213
}
205
214
206
215
void setup () {
207
- Serial.begin (38400 );
208
- pinMode (C2CK, OUTPUT);
209
- pinMode (C2D, OUTPUT);
216
+ Serial.begin (1000000 );
217
+
218
+ DDRE |= (1 <<C2D_PIN);
219
+ DDRE |= (1 <<C2CK_PIN);
220
+ C2CK_PORT |= (1 <<C2CK_PIN);
221
+
210
222
digitalWrite (LED, LOW);
211
- digitalWrite (C2CK, HIGH);
212
- delay (300 );
213
223
}
214
224
215
225
unsigned int i;
216
226
unsigned char retval;
217
- unsigned char flash_array[34 ],flash_array2[34 ],flash_array3[34 ];
218
227
unsigned char rx_message[250 ],rx_message_ptr;
219
228
unsigned char rx,main_state,bytes_to_receive,rx_state;
220
- unsigned char flash_buffer[130 ];
229
+ unsigned char flash_buffer[250 ];
221
230
unsigned long addr;
222
231
223
232
unsigned char rx_state_machine (unsigned char state, unsigned char rx_char) {
@@ -241,11 +250,15 @@ unsigned char rx_state_machine (unsigned char state, unsigned char rx_char) {
241
250
}
242
251
243
252
void loop () {
253
+
244
254
if (Serial.available ()) {
245
255
rx = Serial.read ();
246
256
rx_state = rx_state_machine (rx_state, rx);
247
257
if (rx_state == 3 ) {
248
258
switch (rx_message[0 ]) {
259
+ case 0x0 :
260
+ Serial.write (0x80 );
261
+ break ;
249
262
case 0x01 :
250
263
c2_init_PI ();
251
264
Serial.write (0x81 );
0 commit comments