Forum: Mikrocontroller und Digitale Elektronik AVR128DB mir 3-wire SPI


von Justus K. (jka_via)


Lesenswert?

Hallo lieber Microcontrollercontroller,

Ich möchte mit einem AVR128DB48 eine RTC ansteuern. Um genau zu sein die 
RV-8063-C7 von Microcrystal.

Mein Problem ist, dass diese RTC nur 3 Leitungen für SPI hat: SCL, SDIO 
und CE.

Im Datenblatt vom AVR128DB ist auf Seite 407 Kapitel 28.1 (SPI - 
Features) zu lesen: "Three-Wire Synchronous Data Transfer".
https://ww1.microchip.com/downloads/en/DeviceDoc/AVR128DB28-32-48-64-DataSheet-DS40002247A.pdf

Weitere Hinweise zur Verwendung kann ich aber keine finden, weder wie 
ich es anzuschließen habe, noch irgend ein dafür zuständiges Register...

Das Internet hat ein paar Bastellösungen mit einem Widerstand zwischen 
MISO und MOSI zu bieten, das kommt für meine Anwendung aber nicht in 
Frage.

Ich habe auch noch das Beitrag "ATMega48 mit 3-wire SPI" 
gefunden, ist das alles, einfach MOSI vom AVR an SDIO der RTC ??? Werde 
es auf jeden Fall Morgen testen.
Wenn es das ist, kann ich dann sowohl 3-Wire als auch 4-Wire SPI Geräte 
über den selben Bus ansprechen ? Sollte doch problemlos möglich sein 
oder ?


Besten Dank

Justus

von uff basse (Gast)


Lesenswert?

Justus K. schrieb:
> Weitere Hinweise zur Verwendung kann ich aber keine finden, weder wie
> ich es anzuschließen habe, noch irgend ein dafür zuständiges Register...

Ich schon:

https://www.microcrystal.com/fileadmin/Media/Products/RTC/App.Manual/RV-8063-C7_App-Manual.pdf

Das dürfe eigentlich alles erschlagen was man an Fragen hat.

von uff basse (Gast)


Lesenswert?

Justus K. schrieb:
> ist das alles, einfach MOSI vom AVR an SDIO der RTC ?

Wenn's der Falk dir sagt, und ein fragender User das auch
noch bestätigt, dann kann's ja nicht so falsch sein.

von Justus K. (jka_via)


Lesenswert?

uff basse schrieb:
> Ich schon:
>
> 
https://www.microcrystal.com/fileadmin/Media/Products/RTC/App.Manual/RV-8063-C7_App-Manual.pdf
>
> Das dürfe eigentlich alles erschlagen was man an Fragen hat.

Naja das Datenblatt ist mir bekannt, wollte auch nichts zur RTC wissen 
sondern habe ehr nach sowas wie 3-Wire-Mode-Enable in einem Register vom 
AVR gesucht... Aber gut wenns der Falk sagt wird's wohl klappen...

Danke

von Frank K. (fchk)


Lesenswert?

Du überträgst doch eh immer nur ein paar Bytes. Da kannst du dochh 
problemlos die RTC an drei GPIOs hängen und das ganze komplett in 
Software abhhandeln. Wie das geht, ist ja ausführlich dokumentiert.

fchk

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


Lesenswert?

Justus K. schrieb:

> Ich habe auch noch das Beitrag "ATMega48 mit 3-wire SPI"
> gefunden, ist das alles, einfach MOSI vom AVR an SDIO der RTC ?

Wenn du niemals Daten von der RTC lesen willst, ja, dann ist das so 
einfach.

Wenn du MISO am AVR nicht beschaltest, wie sollten denn Daten zurück zum 
AVR kommen?

> Das Internet hat ein paar Bastellösungen mit einem Widerstand zwischen
> MISO und MOSI zu bieten, das kommt für meine Anwendung aber nicht in
> Frage.

Warum eigentlich nicht? Das wäre die einfachste Lösung.

Alternativ, wie schon geschrieben wurde, alles in Software machen statt 
des Hardware-SPI.

von Axel R. (axlr)


Lesenswert?

Liest man tatsächlich viel mit dem 1K-Widerstand. Ich würde eher ne 
Schottky-Diode und einen Pull-Up nehmen.So hat man wenigstens "halbwegs 
ordentlichen" LOW_Pegel. Der MOSI lässt sich beim AVR ja nicht als 
Open-Drain-Output konfigurieren. Bei anderen Architekturen geht das ja.

von Justus K. (jka_via)


Lesenswert?

Jörg W. schrieb:
> Wenn du MISO am AVR nicht beschaltest, wie sollten denn Daten zurück zum
> AVR kommen?

Ja genau das frage ich mich auch!

Grundsätzlich ist mein Problem nicht, dass ich diese RTC über 
irgendeinen Weg zum laufen bekommen muss... Ich kann auch einfach eine 
Anderen nehmen. Sowohl über Software als auch mit Widerstand läuft die 
RTC bei mir Problemlos.

Ich frag mich viel eher wie es konkret mit 3-Wire-SPI gehen soll bzw. 
wie sich das die Hersteller vorstellen... Microcrystal hat es mir 
ähnlich erklärt wie hier zu lesen 
Beitrag "ATMega48 mit 3-wire SPI" (einfach nur MOSI 
anschließen) aber ich versehe einfach nicht wie das klappen soll... Geht 
das bei anderen Microcontrollern?? Also klar es wird welche geben die 
auch nur ein SDIO Anschluss haben aber ich mein bei andern mit 
4-Wire-SPI.

Meine auch mehr oder weniger elegante Lösung sieht wie folgt aus:
1
PORTA.OUTSET = PIN7_bm;                     //CE HIGH
2
SPI0.DATA = DataSend;                       
3
while(!(SPI0.INTFLAGS & SPI_IF_bm))         //Warten bis Übertragung fertig
4
    ;
5
PORTA.DIRCLR = PIN4_bm;                     //MOSI auf Input setzen
6
SPI0.DATA = 0x00;                           //Dummy byte seden
7
while(!(SPI0.INTFLAGS & SPI_IF_bm))         
8
    ;
9
PORTA.OUTCLR = PIN7_bm;                     //CE LOW 
10
PORTA.DIRSET = PIN4_bm;                     //MOSI zurück auf Output
11
DataReceive = SPI0.DATA;                    //Daten einlesen

Also einfach MISO und MOSI zusammen an SDIO und vor dem Senden des Dummy 
Bytes MOSI Output verbieten. Klappt soweit gut.

Aber das kann doch so nicht gedacht sein oder ????

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Justus K. schrieb:

> Mein Problem ist, dass diese RTC nur 3 Leitungen für SPI hat: SCL, SDIO
> und CE.

Also eine bidirektionale Datenleitung (halbmutiplex), ansonsten alles 
das Übliche.

> Im Datenblatt vom AVR128DB ist auf Seite 407 Kapitel 28.1 (SPI -
> Features) zu lesen: "Three-Wire Synchronous Data Transfer".
> 
https://ww1.microchip.com/downloads/en/DeviceDoc/AVR128DB28-32-48-64-DataSheet-DS40002247A.pdf

Da ist CS (bzw. in deinem Fall CE) nicht eingerechnet.

> Weitere Hinweise zur Verwendung kann ich aber keine finden, weder wie
> ich es anzuschließen habe, noch irgend ein dafür zuständiges Register...

Gibt's auch nicht. Halbmultiplex wird nicht unterstützt.

> Das Internet hat ein paar Bastellösungen mit einem Widerstand zwischen
> MISO und MOSI zu bieten, das kommt für meine Anwendung aber nicht in
> Frage.

Dann lass' den Widerstand einfach weg und verbinde MOSI und MISO direkt. 
Der Widerstand dazwischen dient nur zum Schutz gegen falsche 
Programmierung, elektrisch ist er nicht nötig. Solange du alles richtig 
machst, kannst du ihn also problemlos weglassen.

> Wenn es das ist, kann ich dann sowohl 3-Wire als auch 4-Wire SPI Geräte
> über den selben Bus ansprechen ? Sollte doch problemlos möglich sein
> oder ?

Nein. Dann wird der Widerstand doch wieder nötig. Oder eine andere 
externe Maßnahme, die denselben Zweck besser erfüllen kann, z.B. ein 
Multiplexer.

von c-hater (Gast)


Lesenswert?

c-hater schrieb:

Verdammt, da hatte ich doch von Anfang an schon das Ende im Kopf und 
deswegen einen falschen Begriff verwendet.

Also: überall, wo "halbmultiplex" steht, bitte gedanklich durch den 
korrekten Begriff "halbduplex" ersetzen.

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


Lesenswert?

Justus K. schrieb:
> Ich frag mich viel eher wie es konkret mit 3-Wire-SPI gehen soll bzw.
> wie sich das die Hersteller vorstellen.

"3-Wire-SPI" ist halt kein Standard.

von MWS (Gast)


Lesenswert?

Justus K. schrieb:
1
PORTA.DIRSET = PIN4_bm;                     //MOSI zurück auf Output
2
DataReceive = SPI0.DATA;                    //Daten einlesen
> Aber das kann doch so nicht gedacht sein oder ????
Wenn Du MOSI, also "Master Out" des µCs auf Ausgang setzt, bevor der 
Slave zu antworten beginnt, dann arbeiten beide gegeneinander, offenbar 
gewinnt bei Dir die Treiberstufe des Slave.

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.