Forum: Mikrocontroller und Digitale Elektronik SPI Problem bei Power on


von spien (Gast)


Lesenswert?

Hallo,

ich habe ein - mir unerklärliches - Problem:

Ich habe einen ATMega2560 Controller. An der SPI Schnittstelle hängen 
zwei AD-Wandler und eine SD-Karte. Ich hatte alles schon am Laufen, 
sprich Analogwerte auslesen, Gain- und Offsetwerte auf SD-Karte 
speichern.

Jetzt habe ich eine neue Platine bekommen, bei der dieser Teil der 
Schaltung gleich geblieben ist und nun funktioniert nichts mehr, also 
zumindest nicht sofort!
Wenn ich die Spannung auf mein Board gebe funktioniert alles außer die 
SPI-Schnittstelle (AD-Wandler auf 65535 und SD-Karte wird nicht 
gelesen). Wenn ich den Controller dann resete, dann startet er neu und 
alles funktioniert!?!?!?!?

Hat schon jemand soetwas erlebt bzw. hat jemand einen Hinweis woran es 
liegen könnte?

Softwarefehler schließe ich aus, da nach einem Reset ja alles 
funktioniert. Einen Hardwarefehler seh ich aber auch nicht, da nach 
einem Reset ja alles funktioniert....

Bin für jede Antwort dankbar!

Gruß

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Klingt mir danach, als ob die Peripherie beim Aufbauen der 
Versorgungsspannung mehr Zeit braucht, als deine Reset Routine ihnen zur 
Verfügung stellt. Evtl. sind die Fuses im Mega auf zu schnell gestellt? 
Ansonsten füg einfach noch eine kleine Warteschleife im Reset ein.

von spien (Gast)


Lesenswert?

Danke für die schnelle Antwort.
Also die Fuses im Mega sind wie folgt gesetzt:

BODLEVEL = 4V3
OCDEN = [X]
JTAGEN = [X]
SPIEN = [X]
WDTON = [ ]
EESAVE = [ ]
BOOTSZ = 2048W_1F800
BOOTRST = [X]
CKDIV8 = [ ]
CKOUT = [X]
SUT_CKSEL = EXTXOSC_8MHZ_XX_16KCK_65MS

EXTENDED = 0xFC (valid)
HIGH = 0x1A (valid)
LOW = 0xBF (valid)


Ich betreibe den Mega mit einem externen 16MHz Quartz. Das ist ja die 
längste einstellbare Zeit über die Fuses...

Die Idee mit der Warteschleife im Reset ist gut, nur wie realisier ich 
das?? Wo kann ich auf die Reset-Time zugreifen?

Danke!

von krumeltee (Gast)


Lesenswert?

spien schrieb:
> Die Idee mit der Warteschleife im Reset ist gut, nur wie realisier ich
> das?? Wo kann ich auf die Reset-Time zugreifen?
1
int main() {
2
    _delay_ms(80Jahre);
3
    ... weitermachen ...

von spien (Gast)


Lesenswert?

ok, das ist ein einfaches delay, das hätt ich auch noch hinbekommen....

Ich dachte es gibt noch eine Möglichkeit das "Anlaufen" des Controllers 
zu verzögern. Im Datenblatt gibt es eine Time-out period t(TOUT). Ich 
dachte es gibt vielleicht eine Möglichkeit über diese ein delay in den 
Reset zu geben...

von Peter D. (peda)


Lesenswert?

spien schrieb:
> Softwarefehler schließe ich aus

Ich nicht.
Es gibt einen SPI-Standardfehler:
/SS wird zu spät auf Ausgang gesetzt und daher geht das SPI in den 
Slave-Mode.


Peter

von spien (Gast)


Lesenswert?

Danke Peter, aber auf das habe ich geachtet (glaube ich zumindest):
1
int main(void)
2
{  
3
4
//******** Port definitions
5
  DDRH |= (1 << PH4) | (1 << PH5);                  //Channel Select
6
  PORTH |= (1 << PH4) | (1 << PH5);                  //No device selected
7
  DDRH |= (1 << PH2) | (1 << PH3);                  //External ADC RESET Ports
8
  PORTH |= (1 << PH2) | (1 << PH3);                  //External ADC RESET Ports
9
  DDRB |= (1 << PINB2) | (1 << PINB1) | (1 << PINB0);          //Set MOSI, SCK and /SS ouput (SPI-MODE)
10
  DDRL |= (1 << PL4);                          //Output for PWM
11
  
12
//******** UART init (PD2 -> RXD, PD3 -> TXD)
13
  UCSR1C |= (1<<UCSZ10) | (1<<UCSZ11);
14
  UBRR1H = (BAUD_PRESCALE >> 8); 
15
  UBRR1L = BAUD_PRESCALE;                        
16
  UCSR1B |= (1<<RXEN1) | (1<<TXEN1);
17
18
//******** SPI init
19
   SPCR |= (1 << SPE) | (1 << MSTR) | (1 << CPOL);

Ich tippe mittlerweile auch fast auf das Problem, das Matthias 
angesprochen hat.

von spien (Gast)


Lesenswert?

Hallo,

nachdem ich mich immer ärgere wenn ich einen Thread finde, der das 
gleiche Problem beinhaltet aber dann keine Lösung anbietet poste ich den 
gefundenen Fehler.

Nachdem ich also einiges versucht habe, bin ich bei der SD-Karten 
Initialisierung hängen geblieben. Und tatsächlich, nach dem Power on 
brauchte die SD-Karte etwas länger auf meine Anfrage zu antworten, viel 
aus der Funktion mit einem Fehler raus (welchen ich noch nicht anzeigen 
ließ) und hat das /SS-Signal nicht wieder auf High gesetzt. Somit hatte 
ich immer zwei Zuhörer bzw. zwei Sprecher, die das MISO-Signal irgendwo 
floatend zwischen High und Low hielten.

Somit muss ich Peter recht geben, es lag dann letztendlich doch am /SS 
Pin...

Als Konzequenz habe ich gleich ein Fehler-Handling eingefügt...

Danke (fast) allen für die hilfreichen Antworten!

Gruß

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.