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
> 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.
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.
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
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
> 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.
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...
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.
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...
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
> 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.
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
> 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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.