Forum: Mikrocontroller und Digitale Elektronik SPI-Bus, SD-Karte, CAN und LCD -> wie lösen(C/C++)?


von NickNack (Gast)


Lesenswert?

Hallo zusammen,

ich stehe gerade vor der Aufgabenstellung eine SD-Karte, einen 
CANbus-Treiber(MCP2515) und ein SPI-Lcd(1,8"noname)an einem 
Atmega1284(als Spi-Master) zu betreiben.

Da ja immer nur einer der Teilnehmer gleichzeitig auf dem Bus aktiv sein 
darf, stelle ich mir die Frage wie ich diese am besten entkoppel und 
nacheinander abarbeite?!?

Ein Taskmanager ist vorhanden, allerdings wie löse ich z.B. das 
pollen(dummy-bytes senden) bei der SD-Karten-Initialisierung bis diese 
antwortet(Bibliothek: http://www.roland-riegel.de/sd-reader/)?...Sobald 
"sie" geantwortet hat, darf ich doch nicht einfach weiter pollen, bis 
der Task abgearbeitet wurde!?!

Programmiert wird im Atmel-Studio in C/C++.

Für detaillierte Herangehensweisen und Vorschläge wäre ich euch dankbar

von Frank K. (fchk)


Lesenswert?

Dein AVR hat 2 UARTs, die Du auch im SPI-Modus betreiben kannst. Es ist 
am Besten, CAN und SD-Karte auf getrennte SPI-Ports zu legen oder - noch 
besser - einen Controller mit integriertem CAN zu verwenden.

fchk

von user (Gast)


Lesenswert?

Ein Slave muß erst vollständig bearbeitet werden bevor man eine Aktion 
auf einem anderen Salve ausführen kann.
Also entweder die Slaves nacheinander abarbeiten oder einen Controller 
mit mehreren SPIs benutzen.

von NickNack (Gast)


Lesenswert?

@Frank
Warum wäre dies vor allem mit dem CAN-Chip von Vorteil? Wegen der hohen 
Datenrate?
Da beide Möglichkeiten leider nicht umsetzbar sind bleibt nur die 
Softwarelösung.

Wie würdet ihr diese Softwarelösung ansatzweise umsetzen? Per 
Status-Polling oder Interruptbetrieb(bevorzugt).

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

NickNack schrieb:
> Da beide Möglichkeiten leider nicht umsetzbar sind bleibt nur die
> Softwarelösung.

Klar sind die Umsetzbar. Warum nicht? Es ist schwer zu helfen, wenn man 
die Hintergründe nicht kennt.

von Falk B. (falk)


Lesenswert?

@ NickNack (Gast)

>ich stehe gerade vor der Aufgabenstellung eine SD-Karte, einen
>CANbus-Treiber(MCP2515) und ein SPI-Lcd(1,8"noname)an einem
>Atmega1284(als Spi-Master) zu betreiben.

Kein Problem.

>Da ja immer nur einer der Teilnehmer gleichzeitig auf dem Bus aktiv sein
>darf, stelle ich mir die Frage wie ich diese am besten entkoppel und
>nacheinander abarbeite?!?

Nacheinander? Siehe Multitasking.

>Ein Taskmanager ist vorhanden, allerdings wie löse ich z.B. das
>pollen(dummy-bytes senden) bei der SD-Karten-Initialisierung bis diese
>antwortet(Bibliothek: http://www.roland-riegel.de/sd-reader/)?...

Ich sehe da kein Problem. Man ruft die Init-Funktion der SD-Karte auf, 
die arbeitet ne Weile, dann ist sie fertig. SD-Karte wird per Chip 
Select deaktiviert, dann können andere SPI-ICs angesprochen werden. Ganz 
normales kooperatives Multitasking.


>Programmiert wird im Atmel-Studio in C/C++.

Ohhh C++. Aber Keine Idee wie man so ein eher einfaches Problem angeht? 
Komisch.

von NickNack (Gast)


Lesenswert?

@Torsten C & Frank K.
Die Hardware steht bereits und ist bis auf den SPI-Bus komplett 
ausgereizt. Da die Anforderungen gestiegen sind(im laufe der Zeit) 
kriegt die Platine nun ein Update in Form einer Erweiterungsplatine, 
welche über den SPI-Bus verbunden wird.
Der Atmel "Microcontroller Selector" spuckt mir keinen Atmel Controller 
aus der im TQFP48 ist, I2C, 2USARTS, SPI, CAN und mindestens 16kB Ram 
hat.
-->Ein komplettes Redesign würde sich nicht mehr lohnen.

Daher mein Wunsch das ganze möglichst nur per Softwaresteuerung für den 
SPI-Bus zu lösen. Da fehlen mir allerdings die Erfahrungen und ich frage 
euch nach Lösungsansätzen für selbige :)

Gruß

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

NickNack schrieb:
> ich stehe gerade vor der Aufgabenstellung eine SD-Karte, einen
> CANbus-Treiber(MCP2515) und ein SPI-Lcd(1,8"noname)an einem
> Atmega1284(als Spi-Master) zu betreiben.

Und welcher von den dreien ist der "Update in Form einer 
Erweiterungsplatine"?

Hast Du noch GPIOs frei, um einen zusätzlichen Software-SPI zu ergänzen? 
Oder soll die Erweiterungsplatine mit einem zusätzlichen "Chip-Select" 
an den vorhandenen (Hardware-SPI?) angeschlossen werden?

Falk Brunner schrieb:
> SD-Karte wird per Chip
> Select deaktiviert, dann können andere SPI-ICs angesprochen werden.

Kann das "Chip-Select" nicht zwischendurch auch inaktiviert werden, um 
mit dem SPI andere Dinge zu machen? Oder nimmt das die SD-Karte krumm?

von Falk B. (falk)


Lesenswert?

@Torsten C. (torsten_c) Benutzerseite

>> SD-Karte wird per Chip
>> Select deaktiviert, dann können andere SPI-ICs angesprochen werden.

>Kann das "Chip-Select" nicht zwischendurch auch inaktiviert werden, um
>mit dem SPI andere Dinge zu machen?

Komischer Satz.

Eher so.

Ja, Chip Select der SD-Karte kann zwischen Operationen inaktiv (=High) 
werden, damit wird die SD-Karte inaktiv geschaltet, in dem Sinn, dass 
die SPI-Kommunikation nicht an sie gerichtet ist. INTERN macht sie dabei 
natürlich KEINEN Reset sondern wartet auf neue Anweisungen per SPI, wenn 
CS wieder aktiv (= LOW) wird.

>Oder nimmt das die SD-Karte krumm?

Nö. Es gibt sicher ein paar Stellen, wo es Timeouts gibt, aber an die 
kommt man im Normalfall so nicht ran, wenn man eine fertige FAT-Lib 
benutzt, die stecken in den Details der SD-Karten Kommunikation und 
damit der FAT-Lib. Jeder Aufruf einer Funktion der FAT-Lib endet mit 
einem deaktivierten CS der SD-Karte. Also kann man sinngemäss einfach so 
machen.

1
while (1) {
2
  zugriff_SD-Karte()
3
  zugriff_CAN()
4
  zugriff_LCD()
5
}

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

@Falk Brunner (falk): Danke für die Klarstellung.

Torsten C. schrieb:
> Oder soll die Erweiterungsplatine mit einem zusätzlichen "Chip-Select"
> an den vorhandenen (Hardware-SPI?) angeschlossen werden?

PS: Oder ist vielleicht gar kein weiterer GPIO für ein weiteres CS frei? 
Dann kannst Du vielleicht aus zwei CS-Signalen vier machen, z.B. mit 
einem 74HC138.

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.