SPI Problem bei Power on

Gast #2572281
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ß
Gast #2573100
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!
Gast #2573121
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...
Gast #2573175
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.
Gast #2579134
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ß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren