Hallo Leute,
ich versuche verzweifelt hier einen Atmega8 von einem Mega644 aus per
ISP zu programmieren. Die Programmierung soll dabei per Software SPI
erfolgen.
Leider bringt mir der Mega8 statt dem (0x53 == ich bin in den
programmiermodus versetzt worden) immer nur 0xff zurück :-/
Inzwischen frage ich mich schon in welchem Modus programmiert wird, laut
meinem Mega8 datenblatt sampelt er bei der Taktflanke low->high
Meine Routine wie folgt:
Routine um ein Byte per Softspi zu senden und gleichzeitig das zu lesen,
welches der slave in dem Moment zurückschickt. (die ganzen SX_... makros
sind richtig definiert und bewirken auch das richtige.)
1 | //############################################################################
|
2 | unsigned char softspi_rwb (char byte, uint8_t n)
|
3 | //############################################################################
|
4 | {
|
5 | // n = softspi nummer
|
6 | char ret;
|
7 |
|
8 | for (unsigned char a=8; a>1; a--) { // MSBit first
|
9 | if (byte & (1 << (a-1))) {
|
10 | *(SX_MOSI_PORT[n]) |= SX_MOSI_PIN[n]; //Mosi = 1
|
11 | } else {
|
12 | *(SX_MOSI_PORT[n]) &= ~(SX_MOSI_PIN[n]); //Mosi = 0
|
13 | }
|
14 |
|
15 | // Takt High (Ein Bit senden/Empfangen)
|
16 | *(SX_SCK_PORT[n]) |= SX_SCK_PIN[n];
|
17 |
|
18 | // Jetzt kann gültiger Status gelesen werden
|
19 | if (*(SX_MISO_PORT[n]) & SX_MISO_PIN[n]) {
|
20 | ret |= (1 << (a-1));
|
21 | } else {
|
22 | ret &= ~(1 << (a-1));
|
23 | }
|
24 |
|
25 | // Takt Low (Bit übernommen)
|
26 | *(SX_SCK_PORT[n]) &= ~(SX_SCK_PIN[n]);
|
27 | }
|
28 | return ret;
|
29 | }
|
Angesteuert das ganzen dann via
1 | char temp;
|
2 | //set Chip_Select to high (INAKTIV)
|
3 | *(SX_SS_PORT[n]) |= SX_SS_PIN[n];
|
4 |
|
5 | //set Chip_Select to low (Aktiv)
|
6 | *(SX_SS_PORT[n]) &= ~(SX_SS_PIN[n]);
|
7 |
|
8 | // Takt Low
|
9 | *(SX_SCK_PORT[n]) &= ~(SX_SCK_PIN[n]);
|
10 |
|
11 | // Reset Toggle
|
12 | *(SX_RES_PORT[n]) &= ~(SX_RES_PIN[n]);
|
13 | _delay_ms(1);
|
14 | *(SX_RES_PORT[n]) |= SX_RES_PIN[n];
|
15 | _delay_ms(1);
|
16 | *(SX_RES_PORT[n]) &= ~(SX_RES_PIN[n]);
|
17 |
|
18 | for (int i = 0; i < 20; i++) _delay_ms(1);
|
19 |
|
20 | temp = softspi_rwb(0xAC, n);
|
21 | //temp ist dann 254
|
22 | temp = softspi_rwb(0x53, n);
|
23 | //temp ist wieder 254
|
24 | temp = softspi_rwb(0x00, n);
|
25 | //temp ist wieder 254
|
26 |
|
27 | if (temp == 0x53) {
|
28 | #ifdef _UDPDEBUG_
|
29 | udpLog("programming mode Success ", n);
|
30 | #endif
|
31 | } else {
|
32 | #ifdef _UDPDEBUG_
|
33 | udpLog("no answer from controller ", temp);
|
34 | #endif
|
35 | return 1;
|
36 | }
|
naja, leider funktioniert das so nicht. Gibts irgendwo ein Beispiel, wo
jemand sowas schon implementiert hat? Laut datenblatt und verschiedener
PDFs sollte das so klappen :-/
Vielen Dank!