Ich steuere einen Baustein mit SPI an, CS ist fest auf Masse. Leider messe ich beim aktivieren der SPI-Schnittstelle des AVR kurze Spannungspulse an SCL und MOSI. Wie aktiviere ich die Ausgänge richtig, sodass sie keinen unerwünschten Pegel haben?
Ich kenn die AVRs nicht richtig gut, aber bei anderen Controllern setzt man erst die Portpins, dann die SFRs und zum Schluß schaltet man die Portrictungspins (also auf Ausgang). Das verhindert zumindest bei Serien wie dem C167, MSP430, ARM Glitches.
Thomas schrieb: > Ich steuere einen Baustein mit SPI an, CS ist fest auf Masse. Das ist schlecht, denn SPI verlässt sich sehr gern auf den SS als Synchronisationsinfornation. Was, wenn dein Empfänge einmal einen Takt mehr oder weniger sieht? Dann kommt dein Ganzes Sytem aus dem Takt! > Leider messe ich beim aktivieren der SPI-Schnittstelle des AVR kurze > Spannungspulse an SCL und MOSI. Schaltung? Code? Oszi-Bilder?
Thomas schrieb: > Leider > messe ich beim aktivieren der SPI-Schnittstelle des AVR kurze > Spannungspulse an SCL und MOSI. Ohne mal speziell auf die SPI einzugehen: Wo gibt es da Probleme? Eine gute synchrone Logik hat in der Regel keine Glitches. Bzw. sollte keine haben. Woher kommen sie? Oft sind aber Inputs z.B. an Logik oder µC auch so gestaltet, daß sie glitch-free sind. D.h., ein Pin wird mehrmals gelesen, und aus den logischen Werten der Mittelwert gebildet.
Das Problem tritt auf, wenn der AVR aus dem Reset kommt und ich die Pins auf Ausgang schalte. Dann geht der Pin für einen kurzen Moment auf Low, obwohl ein externer Pullup dranhängt.
1 | DDRB = ( 1 << PB2 ); //Ausgang |
2 | PORTB |= (1<<PB2); //High |
wie wäre es, das Port zuerst auf High zu schreiben und dann die Richtung auf Ausgang?
N' Abend, beim Atmega48 ist es so, dass die Register für die Pins alle mit einer 0 initialisiert werde. Sie sind kurz nach dem Reset, also bis dein Code greift, Inputs. Wenn der Controller interne Kontakt des Inputs, gegen Masse, deinen externen Pullup einfach plattmacht, könnte das die Ursache für dein Problem sein ( wie warm wird es in deiner Schaltung denn so?) . Am einfachsten ist es glaubenich das System erst zu Initialisieren, also alle in Initialisierungszeit getätigten Operationen zu verwerfen. Hoffe es hilft weiter. Grüße Meehrschwein
>Ich steuere einen Baustein mit SPI an,
Welchen? SPI mit CS fest an GND geht bei einigen Chips
gar nicht. SPI EEPROMS oder Flash starten die internen
Aktionen erst bei steigender Flanke von CS.
Der Beitrag von Lothar dürfte wohl der wichtigste
Hinweis sein weshalb dein SPI Konzept nicht
wirklich funktioniert. Jeder kleine Glitch verhindert
das das SPI auch synchron bleibt.
Ist ein ADC von TI, im Datenblatt ist explizit erlaubt CS auf GND zu hängen wenn kein anderes Gerät am SPI-Bus hängt...
Thomas schrieb: > Ist ein ADC von TI, im Datenblatt ist explizit erlaubt CS auf GND zu > hängen wenn kein anderes Gerät am SPI-Bus hängt... Trotzdem wird der nicht erkennen, wenn ein klitzekleiner Spike auf der Taktleitung daherkomt (Schon mal was von EMV und ESD gehört?). Und wenn alles passt nimmt der ADC den dann als gültigen Taktimpuls, und gibt fürderhin alles um 1 Bit versetzt aus. Das ist dann echt dumm gelaufen... SPI funktioniert auf Dauer nur, wenn zwischendurch mal mit SS synchronisiert wird. Das ist ganz einfach so. Sieh doch dein eigenes Design an: schon vor dem Loslegen geht das bei dir schief, weil der ADC schon selektiert ist, bevor der uC richtig loslegt... :-/ > Ist ein ADC von TI, im Datenblatt ist explizit erlaubt CS auf GND zu > hängen wenn kein anderes Gerät am SPI-Bus hängt... Du glaubst nicht, was Datenblätter alles erlauben, und was man in der Praxis trotzdem nicht machen darf. Ein ganz einfacher Fall sind z.B. Eingänge mit hochohmigen Pullups, wo dann steht "may be left open, if this function is not used" (wie z.B. der Reset-Eingang bei AVR-Controllern). Und dann geh mit so einem internen Pullup mal ins EMV-Labor. Gute Nacht, da gehen die Lichter aus und an, das hast du noch nicht gesehen... :-o
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.