Forum: Mikrocontroller und Digitale Elektronik Porterweiterung SPI konform 74HC165, 74HC589


von Jörg H. (dr_coolgood)


Lesenswert?

Freunde der Porterweiterung,

so trivial wie es immer behauptet wird finde ich es nicht, da die 
Porterweiterung selten im Zusammenspiel mit weiteren SPI Teilnehmern 
betrachtet wird.

Standardbeschaltung aus dem AVR-Tutorial: Schieberegister.
Datenblatt von Philips, Dez. 1990
http://www.datasheetcatalog.org/datasheet/philips/74HC_HCT165_CNV_2.pdf

Laut Tutorial und Datenblatt muß SCK für das 74HC165 während des Ladens 
high sein.
Durch SPCR CPOL=1 wird SCK im Leerlauf auf high gesetzt und diese 
Bedingung erfüllt.

Frage 1: Laut Datenblatt wird das Register jedoch durch eine 0-1 Flanke 
getaktet?

Frage 2: Nach meinem Verständnis des Datenblattes gibt es eine zweite 
Begründung, warum PL vor Beginn der Übertragung wieder high sein muß: 
Das Durchkommen der SCK Takte wird durch ein PL = 0 verhindert?


Am Anfang von schiebe_eingang wird PL 0 gesetzt, dann wieder auf 1.
Im Betrieb ist der Verlauf 1-0-1 und somit die benötigte Sequenz für das 
Laden und Durchschalten von SCK.
Alle anderen mir bekannten SPI Bausteine benötigen jedoch ein CS = Low 
während der gesamten Übertragung.

Ebenfalls praktisch ist der permanent aktive Ausgang, der die 
Verschaltung mit weiteren SPI Sendern verhindert. Dies kann mit einem 
74HC125 "repariert" werden, der dann das "normale" CS = Low erfordert.

Somit benötige ich für einen voll SPI konformen Betrieb:
- Gesonderte Behandlung des 74HC165 von anderen SPI Teilnehmern
- Einen zusätzlichen Port Pin für PL
- Ein zusätzliches IC um den Ausgang TriState zu bekommen.

Frage 3: Ist dieses Verständnis richtig? Oder übersehe ich etwas?

Mit dem 74HC299 komme ich nicht weiter, es benötigt ebenfalls 
zusätzliche Logik und hat auch einen aktiven Ausgang.
Der 74HC589 sieht besser aus - Ausgang kann mit OE in High Z geschaltet 
werden.
Die restliche Ansteuerung? Beispiel habe ich keine gefunden, er scheint 
nicht beliebt/verbreitet zu sein.

Gibt es das "Traum" Schieberegister:

- Voll SPI Konform, 8 MHz
- Integrierte Pull Up Widerstände an den Eingängen
- Preis idealerweise < 1 Euro


Merci 1000 mal.

Gruß
Jörg

von Bensch (Gast)


Lesenswert?

> Laut Tutorial und Datenblatt muß SCK für das 74HC165 während des Ladens
high sein.

In meinem Datenblatt steht was anderes....

74xx165 und 595 passen wunderbar zusammen, lassen sich gemeinsam 
betreiben, also schreiben und lesen gleichzeitig. Wenn ich mich richtig 
erinnere, braucht der 165 einen Chip Selct mit aktiv high, der 595 aktiv 
low. Aber das solltest du schon selbst rausfinden.

von Simon K. (simon) Benutzerseite


Lesenswert?

Gibt auch noch 74xxx4094 bzw CD4094 als CMOS. Aber "Voll SPI Konform, 8 
MHz" sind die eigentlich alle, da wirst du noch mal das Datenblatt 
wälzen müssen.

von Jörg H. (dr_coolgood)


Lesenswert?

Hallo,

@Bensch:
Either the CP or the CE should be HIGH before the LOW-to-HIGH transition 
of PL to prevent shifting the data when PL is activated.
Da im Tutorial der CE auf GND liegt, muß es CP, i. e. SCK sein.
Welches Datenblatt verwendest Du?
Ich fand den Satz auch überraschend, da laut function table das CP beim 
Laden don't care ist.
Wie immer steckt der Teufel im Detail.

Nochmal konkret:
Wie betreibt Ihr einen 74HC165 zusammen mit anderen SPI Bausteinen, die 
auch die MISO Leitung nutzen? Welche Alternativen ausser einem 
zuätzlichen 74HC125 gibt es?

Unter voll SPI konform verstehe ich:
a) Der Ausgang ist im nicht selektierten Zustand High Z damit andere 
senden können.
b) Das CS wird zum Beginn der Übertragung auf 0 gesetzt und am Ende 
wieder auf 1.

Zwei unterschiedliche SPI Senderoutinen für 74HC165 und den Rest der 
Welt?
Klar, NOCH ist Platz im Flash, aber wehret den Anfängen...

Gruß
Jörg

von Peter D. (peda)


Lesenswert?

Das Laden des HC165 erfolgt asynchron, also ist der Pegel an CP/CE 
schnurz.

Man kann prima gleichzeitig ein Byte vom HC165 einlesen und ein Byte zum 
HC595 ausgeben.

Etwas unschön ist, daß der Ausgang des HC165 nicht tristate ist. Falls 
also noch andere SPI-ICs anzuschließen sind, schalte ich einen 4.7k in 
Reihe.
Ist kein andere Chip enabled, liegen die Daten des HC165 über den 4,7k 
an.
Ist ein anderer Chip adressiert, liegen dessen Daten direkt an.


Peter

von Bensch (Gast)


Lesenswert?

> Etwas unschön ist, daß der Ausgang des HC165 nicht tristate ist.

Stimmt leider, gibt aber m.W. keinen anderen.
Da ich ohnehin oft ein oder zwei Gatter brauche, nehme ich gern den 125- 
da ist das Gatter für TS dann mehr oder weniger Abfall- die Lösung mit 
dem Widerstand gefällt mir für professionelle Geräte nicht so gut.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Bensch schrieb:
> da ist das Gatter für TS dann mehr oder weniger Abfall- die Lösung mit
> dem Widerstand gefällt mir für professionelle Geräte nicht so gut.
Programmier dir doch einen XL9536 als I/O SPI Slave, da haste die volle 
kontrolle und kannst ggf noch externe Logik mit in den Chip reinziehen, 
5V tollerant ist er auch...

von Simon K. (simon) Benutzerseite


Lesenswert?

Leider braucht man noch diverses Programmierequipment und Kenntnisse in 
der Programmierung. Außerdem muss noch die Software installiert werden. 
Und wenn das einer Nachbauen möchte, hat der die gleichen Probleme noch 
mal.

Ich weiß nicht was daran vorteilhaft sein soll. Die Idee kommt ja öfter 
im Forum.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Simon K. schrieb:
> Leider braucht man

> noch diverses Programmierequipment und Kenntnisse in
Auch hier gehts mit einem 5 Widerstandsprogrammer los wenn man es den 
möchte.

> der Programmierung.
Naja, man kann wie beim AVR eingach nen fertiges BIT File brennen.

> Außerdem muss noch die Software installiert werden.
Jagut so ist das halt, aber auch nicht komplizierter als bei einem AVR.

> Ich weiß nicht was daran vorteilhaft sein soll. Die Idee kommt ja öfter
Platzersparnis, Flexibilität, man kann die Pins größtenteils so legen 
wies für das Layout am besten ist, und und...

von Peter D. (peda)


Lesenswert?

Man muß aber auch beachten, daß die meisten CPLDs Stromfresser sind.
Und die XCR3064 sind zwar CMOS, vertragen aber keine 5V als VCC.

Ich nehme daher auch lieber HC165/595.

Bzw. man könnte auch einfach nen weiteren AVR als SPI-Expander nehmen, 
der in Powerdown geht, wenn er nicht selektiert ist.


Peter

von Bensch (Gast)


Lesenswert?

> Bensch schrieb:
> da ist das Gatter für TS dann mehr oder weniger Abfall- die Lösung mit
> dem Widerstand gefällt mir für professionelle Geräte nicht so gut.
Programmier dir doch einen XL9536 als I/O SPI Slave, da haste die volle
kontrolle und kannst ggf noch externe Logik mit in den Chip reinziehen,
5V tollerant ist er auch...

Wozu? Ich brauch nicht mehr Glue-Logik und die Schieberegister liegen an 
verschiedenen Stellen (auch z.B. auf einem externen Bedienteil mit 
Tastenfeld und Display). Das ist doch gerade der Vorteil von SPI, dass 
ich viele Leitungen spare. Da soll ich dann alles in ein zentrales 
Bauteil packen?
Ein programmierbarer Baustein lohnt nur, wenn er mindestens 4-5 TTLs 
ersetzen kann.

von Jörg H. (dr_coolgood)


Lesenswert?

Hallo,

Danke für die Antworten.

@Peter: Wie immer sind Deine Vorschläge knapp, knackig und korrekt.

@Läubi: Guter Vorschlag, jedoch sind GAL, FPGA, CPLD Technologien, die 
ich nicht nutze.
Welche der benötigten Werkzeuge sind auf einem Mac lauffähig?

@Bensch: Implizit wollte ich einen kaskadierbare, verteilte Lösung. 
Wobei ich dann mit der Taktfrequenz herunter muß, wenn ich EMV clean 
sein will.
Was den "uneleganten" Widerstand angeht: Atmel selbts zwingt uns zu 
genau dieser Lösung, wenn wir den seriellen Port am mega128 nutzen 
wollen. So schlimm ist es nicht.

Nun bleibt noch der Widerspruch aufzuklären, in welchem SPI Modus 
der74HC595 angesprochen werden soll. Das Tutorial nutzt SPI mode 0, 
Frank Link mode 3...

Grüßlis
Jörg

von Bensch (Gast)


Lesenswert?

> Nun bleibt noch der Widerspruch aufzuklären, in welchem SPI Modus
der74HC595 angesprochen werden soll. Das Tutorial nutzt SPI mode 0,
Frank Link mode 3...

Hab jetzt keine Software-Unterlagen da. Aber ist doch ganz einfach:
Die Daten werden mit der 1. Flanke rausgeschoben und der 2.Flanke ins SR 
geladen, dann gibt's keine Laufzeitprobleme. Der 595 lädt mit der 
steigenden Flanke, also wäre die erste Flanke (die die Daten 
rausschiebt) fallend und der CLK-Ruhepegel high. Lt. Datenblatt wäre das 
Mode 0.
Aber auch Mode 3 wäre in diesem Fall möglich, da die Daten bereits vor 
der ersten Flanke da sind. Die letzte Entscheidung könnten 
Eingangsregister bringen, die nur in einem dieser beiden Moden laufen.

von Peter D. (peda)


Lesenswert?

1
static void spi_write( u8 bh, u8 bl )    // write 2 bytes
2
{
3
  OUT_LOW( LD_INPUT );        // input register: load
4
  OUT_HIGH( LD_INPUT );        // input register: shift
5
  SPDR = bh;
6
  while( !(SPSR & 1<<SPIF) );      // wait until done
7
  input_ram[0] = SPDR;        // store input value
8
  SPDR = bl;
9
  while( !(SPSR & 1<<SPIF) );      // wait until done
10
  input_ram[1] = SPDR;        // store input value
11
}
12
13
void set_display( u8 bh, u8 bl )
14
{
15
  OUT_LOW( LD_DISPLAY );
16
  spi_write( bh, bl );
17
  OUT_HIGH( LD_DISPLAY );      // latch display
18
}
19
20
void init_spi( void )
21
{
22
  SPCR = 1<<SPR0^1<<MSTR^1<<SPE;    // XTAL / 16
23
            // SPI-mode 0
24
            // Master
25
            // MSB first
26
  SPSR = 0;          // no double speed
27
}


Peter

von M. Marienhagen (Gast)


Lesenswert?

Als Alternative für eine Porterweiterung mit SPInterface bietet sich 
auch der MAX7301, s. http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3371, 
an.


Gruß,

Maik

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.