Hi @ all, Ich hab ein Problem. Ich hab mehrere Geräte am SPI Bus des AVRs. Da hängen SD Karte, Touchscreen Controller und ein MCP2515 Can Controller (eventuell später noch mehr Geräte). Der Touchscreen Controller und der CAN Controller haben zusätzlich eine Interruptleitung, die am an einem exteren Interrupteingang des AVRs hängen. Sie sind dazu da, wenn zB ein CAN Packet empfangen wurde, damit der AVR es weiß oder ob jemand gerade das Touchscren Display berrührt. Nur wie soll ich das ganze abfragen? Wenn ich zB gerade die SD beschreibe und einen CAN Interrupt kommt und ich in der Interruptroutine den CAN Controller versuch auszulesen, dann krachts gewaltig und die Daten auf der SD Karte geraten in einen undefinierbaren Zustand. Wie kann ich jdoch das ganze am Besten löen? Wäre es sinnvol in der Interruptroutine des CAN Controllers zB ein Flag setzen oder inkrementieren um zu zählen, das eine Nachricht da ist und er ausgelesen werden will? Nur wie löse ich denn so was geschickt für den Touchscreen Interrupt? Der sollte ja nach eiem Interrupt so schell wie möglich abgefragt werden, um die gedrückte Position zu ermitteln und dementsprechend reagieren zu können. Ich hoffe jemand hat einen Lösungsvorschlag! Danke im Voraus mfg Robert
Du kannst die Interrupts während des SPI-Zugriffes nur irgendwie sperren. Entweder ganz allgemein (cli), oder aber du sperrst einzeln alle damit in Konflikt stehenden Interruptquellen. Natürlich sollte man die IRQs selbst immer möglichst kurz halten, wenn du also irgendwas mit Flag setzen und später auswerten organisieren kannst, dann tu das.
INterrupts sperren will ich eben nicht ;) Da zB eine MP3 gelesen wird von der SD, dann hab hab ic Probleme, da während des Zugriffs die Interrupts alle gesperrt sind. Flag setzen hab ih mir schon gedacht. Und dann später in der Main Schleife auswerten. Beim Can Interrupt ist das ja nicht so tragisch. denn kan ich später auswerten. Wie bringe ich denn das aber am Besten mit dem Touchscreen unter? Wenn gedrükt wird bekomme ich einen IRQ auf de exteren Interrupeingang und ich weiß, dass ich den Touchscreencontroller asulesen und die Cursorpostion ermitteln kann. Den kann ich ja nicht so einfach sperren....
Ohne das Projekt genauer zu kennen: Alles an einen SPI-Bus scheint mir beim Einsatz von Speicherkarten nicht so geschickt, es braucht halt etwas Zeit die Sektoren zu lesen/zu schreiben und in der Zeit ist der SPI-Bus blockiert. Zumindest in dem was ich bisher über SD-Karten gelesen habe, ist einfaches "wegschalten" von CS und später an gleicher Stelle weitermachen nicht vorgesehen. CS muss bei SD-Karten lt. SanDisk-Manual über den gesamten Vorgang (Kommando, Daten, Antwort) "asserted" bleiben. Würde mehrere SPI-Schnittstellen nutzen. Z.B. die SD-Karte am Hardware-SPI lassen und Touchpannel und CAN-Controller über Software-SPI (evtl. AVR USI im SPI-Mode) ansprechen. Falls die Zahl der CAN-Nachrichten nicht zu hoch ist (evtl. Filtern) düfte Software-SPI schnell genug sein, MCP hat ja ein paar Receive-Buffer. Für ein TP sollte Software-SPI allemal reichen, kann man dann sogar mit einem kleinen Zustandsautomaten direkt in einem Timer-Interrupt auslesen, externer Interrupt vom TP wird dann nicht gebraucht. Bleibt das Problem, dass die "512-Byte-Schleifen" in den SD-Routinen recht lange brauchen. Bevor man lange an den Routinen selbst rumbastelt, z.B. "reentrant" macht für eine Zustandsautomaten oder alles mögliche in ISRs packt, hilft vielleicht ein kleines RTOS schneller weiter (avrx z.B.).
Hallo Martin, So schreibt man sich wieder ;) Der Evertool fuktioniert jetzt super und zuverlässig :) Als µC benutze ich einen Mega128. Das mit der SD Karte hab ich mir so gedacht. Leider :( Welche Geschwindigkeiten sind denn mit Software möglich? Der µC ist mit 16 MHz getaktet. CAN Nahrichten kommen eigentlich nicht viele... Aber es kommen eben welche. Den USI kenne ich beim Mega128 nicht (nur bei kleinen zB ATTiny26). Gibts den da? Was ist das genau? Eine Multifunktion Schnittstelle oder? mfg Robert
Robert Schilling wrote: > Hallo Martin, > > So schreibt man sich wieder ;) > Der Evertool fuktioniert jetzt super und zuverlässig :) Prima. > Als µC benutze ich einen Mega128. > > Das mit der SD Karte hab ich mir so gedacht. Leider :( > > Welche Geschwindigkeiten sind denn mit Software möglich? Der µC ist mit > 16 MHz getaktet. CAN Nahrichten kommen eigentlich nicht viele... Aber es > kommen eben welche. Ob die Geschwindkeit für die Anwendung reicht, vermag ich nicht zu sagen. Problem ist ja eigentlich nicht eine evtl. langsame Software-SPI Routine, ist ja alles sychron, sondern dass "der Reset" nicht ausgebremst wird. Vielleicht einfach ausprobieren. Lässt sich auch gut Simulieren und AVR-Studio gibt dann hinreichend Auskunft über Zyklen und Laufzeit. Die folgende Routine habe ich in der Art ein paarmal für Software-SPI zum on-board flashen von AVR zu AVR oder ARM zu AVR verwendet, also keine wirklich zeitkritischen Anwendungen. Nur als "getting started", sicher wird noch jemand ein paar Optimierungsmöglichkeiten finden.
1 | unsigned char soft_spi_read_write(unsigned char data) |
2 | {
|
3 | unsigned char i = 0x80, read = 0; |
4 | |
5 | do { |
6 | if (data & i) SWSPIPORT |= (1<<SWSPIMOSI); |
7 | else SWSPIPORT &= ~(1<<SWSPIMOSI); |
8 | if (SWSPIPIN & (1<<SWSPIMISO)) read += i; |
9 | pulse_sck(); // je nach SPI-Mode high/low oder low/high |
10 | i>>=1; |
11 | } while (i); |
12 | |
13 | return read; |
14 | }
|
Wie bereits geschieben, kann man Software-SPI mit in einem Zustandsautomaten in einem Timer-ISR unterbringen und dann aus einem Puffer schreiben bzw. in einen Buffer lesen, sind aber ein "paar" mehr Zeilen Code. Das macht das SW-SPI zwar langsamer, aber hält "den Rest" dann weniger auf. > > Den USI kenne ich beim Mega128 nicht (nur bei kleinen zB ATTiny26). > Gibts den da? Was ist das genau? Eine Multifunktion Schnittstelle oder? Ja. Aber besser als im Datenblatt eines AVR mit USI kann ich das auch nicht erklären. Im Zweifel nochmal konkreter Fragen. Viel Erfolg, Martin
OK. Ich denke ich werde die Ziel MCU wechselnen. Ich werden den Mega1281 (oder doch vielleicht den Mega2561) nehmen. Der besitzt 2 UARTs, die in einem SPI Modus betrieben werden könnnen. Dann hab ich keine Probleme mehr. mfg Robert
Robert Schilling wrote: > ... Ich werden den Mega1281 > (oder doch vielleicht den Mega2561) nehmen. Der besitzt 2 UARTs, die in > einem SPI Modus betrieben werden könnnen. und extra noch die Standard-SPI-Schnittstelle. Oh, und wenn's auch die 0-er Varianten sein dürfen (1280/2560), die haben sogar 4 USARTs. :)
Ja die ICs sind wirklich nice :) Leider hab ich TQFP64 schon vorgegeben...
Hallo ! Ich hab auch ein problem mit mehreren geräten am spi-bus bzw eine frage: Ich möchte meiner Kamera 4 sd-karten anhängen ( alle paralell) und nur den chipselect pin umschalten (natürlich ist die kamera beim umschalten aus...) Das ganze mache ich, weil ich unterwasser filmen will und 1gb sehr billig ist.. Jetzt meine frage funktioniert das, dass ich alle karten paralell verbinde und nur den cs-pin umschalte? Ist meine Teure Kamera, deshalb will ich nochmal nachfragen.. Vielen Dank Andi
@Andi: Das geht nicht, weil die Kamera die SD-Karten sicher nicht im (langsamen) SPI-Modus benutzt.
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.