Forum: Mikrocontroller und Digitale Elektronik ISP per software SPI


von Steffen (Gast)


Lesenswert?

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!

von holger (Gast)


Lesenswert?

Schau doch einfach mal in die Sourcecodes
von USBProg oder anderen USB Programmern
rein.

von Steffen (Gast)


Lesenswert?

Wollte nur nochmal ne Rückmeldung geben für andere mit dem selben 
Problem:

die Zeile
1
for (unsigned char a=8; a>1; a--) { // MSBit first

in
1
for (unsigned char a=8; a>0; a--) { // MSBit first


ändern und es klappt... Ein byte hat halt doch 8 bit ;) Danke Oscar ;)


Lg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.