Forum: Compiler & IDEs Mehrere Geräte am SPI Bus - Interupts


von Robert S. (razer) Benutzerseite


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Robert S. (razer) Benutzerseite


Lesenswert?

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....

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

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.).

von Robert S. (razer) Benutzerseite


Lesenswert?

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

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

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

von Robert S. (razer) Benutzerseite


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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. :)

von Robert S. (razer) Benutzerseite


Lesenswert?

Ja die ICs sind wirklich nice :)

Leider hab ich TQFP64 schon vorgegeben...

von Andi (Gast)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

@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
Noch kein Account? Hier anmelden.