Forum: Mikrocontroller und Digitale Elektronik ATtiny: asm-Beispielcode für SPI-Output?


von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Hallo,

ich such ein Stück Assembler-Beispielcode zur Verwendung der seriellen 
Schnittstelle eines ATtiny (Three-Wire Mode).

Im sehr guten AVR-Tutorial auf mikrocontroller.net hab ich leider nur 
ein UART-Beispiel gefunden.

von spess53 (Gast)


Lesenswert?

Hi

>ich such ein Stück Assembler-Beispielcode zur Verwendung der seriellen
>Schnittstelle eines ATtiny (Three-Wire Mode).

Schon mal ins Datenblatt gesehen?

MfG Spess

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

spess53 schrieb:
> Schon mal ins Datenblatt gesehen?

Aber freilich. :-)
Dabei ist mir auch aufgefallen, dass der ATtiny-25-Beispielcode im 
Kapitel "SPI Master Operation Example" fehlerhaft ist.

Eine weitere Frage ist aufgetaucht:

Wenn der Master ständig USCK taktet, kann der Slave jederzeit ein Byte 
senden. Empfängt der Master dann, solange der Slave nichts sendet, Bytes 
mit dem Wert 0xff?

Also, angenommen, der Slave sendet zwischendurch ein Byte mit dem Wert 
0x00, dann würde z.B. folgendes beim Master ankommen:

0xff 0xff 0xf0 0x0f 0xff

Üblicherweise wird das Byte doch mit einem Startbit (0) eingeleitet. 
Kann das SPI des ATtiny damit umgehen?

von Jim M. (turboj)


Lesenswert?

> Wenn der Master ständig USCK taktet [...]

Macht er das denn? Bei SPI wird nur dann getaktet, wenn ein Byte raus 
geht. Sonst bleibt die Clock Leitung im Ruhezustand - je nach 
Einstellung Low oder High. Die Lesefunktionen schmeissen ein Dummy Byte 
raus.

Somit ist sichergestellt, dass das Bit 0 vom Slave gesendet auch als Bit 
0 am Master ankommt, solage keine Clocks verlorengehen oder falsch 
erkannt werden.

Edit:
Habe übersehen das synchroner UART gemeint ist. Dort läuft die Clock 
dauernd, und die Bytes werden wie beim asynchronen UART mit Start- und 
Stopp- Bit umgeben.

> Empfängt der Master dann, solange der Slave nichts sendet, Bytes
> mit dem Wert 0xff

Bei SPI: Ja, bei synchronem UART: Nein, da kein Start-Bit gesendet wird.

> Kann das SPI des ATtiny damit umgehen?

Vermutlich nicht; Genaueres steht hoffentlich im Datenblatt; Lies das 
bitte lieber selbst. Man müsste eventuell das Start- und Stopp-Bit in 
Software erkennen und die Bits dann zurecht schieben. Hmmm, das klingt 
eher häßlich.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Hallo Jim, danke für die Hilfe!

Jim Meba schrieb:
>> Wenn der Master ständig USCK taktet [...]
>
> Macht er das denn? Bei SPI wird nur dann getaktet, wenn ein Byte raus
> geht. Sonst bleibt die Clock Leitung im Ruhezustand - je nach
> Einstellung Low oder High. Die Lesefunktionen schmeissen ein Dummy Byte
> raus.

Gute Plan! Ich denk, so werd ich das auch machen. Anders ist es beim 
ATtiny vielleicht auch gar nicht hinzubekommen.

>> Empfängt der Master dann, solange der Slave nichts sendet, Bytes
>> mit dem Wert 0xff
>
> Bei SPI: Ja, bei synchronem UART: Nein, da kein Start-Bit gesendet wird.
>
>> Kann das SPI des ATtiny damit umgehen?
>
> Vermutlich nicht; Genaueres steht hoffentlich im Datenblatt; Lies das
> bitte lieber selbst. Man müsste eventuell das Start- und Stopp-Bit in
> Software erkennen und die Bits dann zurecht schieben. Hmmm, das klingt
> eher häßlich.

Stimmt, ist echt umständlich, aber ich hab mir einen ATtiny in den Kopf 
gesetzt. Also muss ich eben manches zu Fuß erledigen. :-)

Denk aber trotzdem, dass das hinzubekommen ist. Ich werde einfach auf 
ein 0-Bit "lauern" und genau 8 Takte später das empfangene Byte aus dem 
USI-Datenregister USIDR fischen. Dort sollten ja die empfangenen Bits 
von rechts nach links reingeschoben werden, also ist das empfangene Byte 
nach genau 8 Takten vollständig.

In den USI-Puffer USIBR werden sie automatisch immer genau dann 
übernommen, wenn der interne 4-Bit-Zähler des USI (USICNT3..0) auf 0 
wechselt. Darauf kann ich mich natürlich nicht verlassen, weil ich nicht 
wissen kann, wann ein empfangenes Byte "beginnt".

Nun hoffe ich, dass ich den Mechanismus begriffen habe...
Danke für deine Hilfe!

Markus

P.S.: Es geht mir um das Beschreiben einer SD-Karte und die 
entsprechende Kommunikation, die dafür notwendig ist.

von Der D. (derdaniel)


Lesenswert?

Hallo,

ich habe jetzt den Thread durchgelesen und einmal lese ich UART senden, 
dann empfangen und dann wieder SPI (der Stift hat noch keinen Kaffee 
gekocht).
Wenns um UART senden per USI geht (wird übrigens auch der Mechanismus 
zum empfangen klar), damit habe ich mich letztens auseinandergesetzt.
Beitrag "UART per USI"

Sollte ich falsch verbunden sein, einfach wieder Auflegen...

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Daniel Steffen schrieb:
> Sollte ich falsch verbunden sein, einfach wieder Auflegen...

Nein, weitere Infos sind immer willkommen. :-)

Wenn meine Nachforschungen stimmen, dann bleibt die Antwort einer 
SD-Karte im Byte-Raster, das vom Master (hier vom Mikrocontroller) 
vorgegeben wurde.

Das heißt, zwischen dem Ende eines gesendeten Kommandos und dem Start 
einer Antwort sind immer 0, 8, 16 usw. Bits. Das vereinfacht die Sache 
natürlich.

Außer, ich täusch mich... werd mal weiter suchen.

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.