Forum: Mikrocontroller und Digitale Elektronik Bootloader--SPI Problem


von Jörn (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
Ich benutzte einen Bootloader um mein Programm in den ATmega8 zu 
flashen, bislang funktionierte das auch einwandfrei.

Nun benutzte ich in meinem Programm welches ich per Bootloader flashe 
die Hardware SPI Schnittstelle des Atmega8.
Nach dem Flashen sowie nach jedem reset des uC lässt sich einmal 1 Byte 
per SPI versenden, danach hängt sich der Controller bei

!(SPSR & (1<<SPIF))

auf.

Ich habe jetzt lange nach dem Fehler gesucht. Testweise hab ich einfach 
mal das Programm mit AVRdude ganz ohne Bootloader geflasht und siehe da 
die SPI Schnittstelle funktioniert einwandfrei. Die FUSE bit 
Einstellungen habe ich nicht verändert.

Im Anhang sind 2 dumps vom Flash. Einmal mit bootloader geflasht und 
einmal mit AVRdude. Für mich sehen die geflashten Programme komplett 
gleich aus, also scheint der Bootloader korrekt zu funktionieren.

Hat jemand eine Idee wo sonst noch der Fehler liegen könnte?

MFG Jörn

von Anon Y. (avion23)


Lesenswert?

1. diff sagt, dass die Dateien nicht gleich sind.

2. Beim flashen mit dem Bootloader ist SPI wahrscheinlich schon 
initialisiert. Danach muss der µC resetet werden. Der sicherste Weg 
dafür ist der watchdog.

von Jörn (Gast)


Lesenswert?

Die Dateien können auch nicht vollständig gleich sein.
Ich meinte das der Programmteil ab Adresse 0x0000 - 0x0220  gleich ist 
....

Ab Adresse 0x1800 steht der Bootloader. Dieser kann ja nicht vorhanden 
sein wenn ich mein Programm wie gewohnt mit AVRdude flashe.

Im Bootloader wird kein SPI verwendet. Ich kann soviel Resetten und 
Spannung wegnehmen wie ich will....
Mit Bootloader funktioniert in meiner Firmware die ich mittels 
Bootloader reinschreibe SPI nicht richtig.

Oder ist der Fehler mit der SPI Schnittstelle nur ein Anzeichen dafür, 
das noch was ganz anderes schief läuft?

Ich hoffe hier kennt jemand das Problem und kann mir helfen

Gruß Jörn

von ←↓→ (Gast)


Lesenswert?

>Oder ist der Fehler mit der SPI Schnittstelle nur ein Anzeichen dafür,
>das noch was ganz anderes schief läuft?
kann schon sein.
wie sieht der code zum initialisieren und zum senden/empfangen aus?

nicht schlecht, 1300 bytes großer bootloader was ist denn das für ein 
protokoll - "stk500v2"?

von Jörn (Gast)


Lesenswert?

Hi,
als Bootloader kommt das Beispiel aus der Atmel AN AVR109 zum einsatz.

die SPI  funktionen werde ich gleich mal posten, wobei diese ja 
eigentlich fehlerfrei funktionieren. Das Problem tritt ja nur nach 
flashen mit Bootloader auf.

Gruß Jörn

von ←↓→ (Gast)


Lesenswert?

>als Bootloader kommt das Beispiel aus der Atmel AN AVR109 zum einsatz.
ist das orginal wirklich so groß, beim mir hat der gerade mal 500bytes.

>Das Problem tritt ja nur nach
>flashen mit Bootloader auf.
ist wirklich komisch, irgenwas stimmt da nicht.

von Markus (Gast)


Lesenswert?

... irgenwas stimmt da nicht ...

Einsame Klasse - diese Antwort.

von Peter D. (peda)


Lesenswert?

Jörn schrieb:
> Nach dem Flashen sowie nach jedem reset des uC lässt sich einmal 1 Byte
> per SPI versenden, danach hängt sich der Controller bei
>
> !(SPSR & (1<<SPIF))
>
> auf.

Wenn man vergessen hat, den /SS auf Ausgang zu schalten.


Peter

von Jörn (Gast)


Lesenswert?

Hi,
ich bin noch nicht viel weitergekommen... das Problem besteht nach wie 
vor.

@Peter
/SS ist auf Ausgang geschaltet. Bei direktem Flashen über ISP mit 
AVRdude tritt das Problem nicht auf, SPI funktioniert dann einwandfrei 
!! Also gehe ich davon aus, das mein Programm an sich ok ist.

Hier trozdem nochmal der Code für die SPI schnittstelle:
1
#define SPI_DR    DDRB
2
#define SPI_PIN    PINB
3
#define SPI_PORT  PORTB
4
5
#define SPI_MOSI  PB3
6
#define SPI_MISO  PB4
7
#define SPI_SCK    PB5
8
9
10
/*
11
 * INIT the Hardware SPI interface
12
 */
13
14
void spi_init(void)
15
{
16
  SPI_DR |= (1<<SPI_MOSI);          //set as output
17
  SPI_DR |= (1<<SPI_SCK);            //set as output
18
19
  SPI_DR &= ~(1<<SPI_MISO);          //set as input
20
21
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1);  //activate SPI, Master Mode, Fosc/64
22
}
23
24
/*
25
 * send one byte
26
 */
27
28
void spi_send_byte(unsigned char data)
29
{
30
  SPDR = data;                //Write data
31
  while (!(SPSR & (1<<SPIF)));        //Wait for data to be written
32
}
1
#define RFM12_DR1  DDRB
2
#define RFM12_PIN1  PINB
3
#define RFM12_PORT1  PORTB
4
5
#define RFM12_DR2  DDRD
6
#define RFM12_PIN2  PIND
7
#define RFM12_PORT2  PORTD
8
9
10
#define RFM12_NSEL  PB2
11
#define RFM12_NIRQ  PD2
12
13
14
void rfm12_init(void)
15
{
16
  RFM12_DR1 |= (1<<RFM12_NSEL);    //set as output
17
  RFM12_DR2 &= ~(1<<RFM12_NIRQ);    //set as input
18
19
  RFM12_PORT1 |= (1<<RFM12_NSEL);    //set select high
20
21
}

Beide init routinen werden am Anfang der Main aufgerufen, SPI sollte 
also korrekt initialisiert werden.

Gruß Jörn

von Peter D. (peda)


Lesenswert?

Jörn schrieb:
> Beide init routinen werden am Anfang der Main aufgerufen,

Dann aber auch die mit dem Setzen des /SS als Ausgang zuerst?


Peter

von Jörn (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Dann aber auch die mit dem Setzen des /SS als Ausgang zuerst?

Genau da lag der Fehler. Ich versteh zwar nicht warum dieser nur 
auffällt wenn man per Bootloader flasht und sonst nicht, aber jetzt 
funktioniert es einwandfrei.

Vielen Dank, da wäre ich nie drauf gekommen ;-)

Und hier nochmal der funktionierende Code:
1
void spi_init(void)
2
{
3
  SPI_DR |= (1<<SPI_MOSI);          //set as output
4
  SPI_DR |= (1<<SPI_SCK);            //set as output
5
  SPI_DR |= (1<<SPI_SS);            //set as output
6
7
  SPI_DR &= ~(1<<SPI_MISO);          //set as input
8
9
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1);  //activate SPI, Master Mode, Fosc/64
10
}

Gruß Jörn

von Peter D. (peda)


Lesenswert?

Jörn schrieb:
> Genau da lag der Fehler. Ich versteh zwar nicht warum dieser nur
> auffällt wenn man per Bootloader flasht und sonst nicht,

Floatende Pins sind unberechenbar. Beim Einschalten ist er vielleicht 
high und über die Zeit des Bootloadens entlädt er sich auf low.

Wenn Du dann zuerst das SPI als Master setzt, fällt das sofort in den 
Slavemode zurück, da der Pin noch ein Eingang ist.


Peter

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.