Serielle Schnittstellen (Leseprobe)

Page 1

ISBN 978-3-89576-318-2

Elektor-Verlag GmbH 52072 Aachen www.elektor.de

Um den Inhalt des Buches ansprechend zu gestalten, demonstriert der Autor den Buchinhalt an zwei Platinen. Mit diesen Platinen ist es möglich, die in diesem Buch beschriebenen Beispiele auszuprobieren und mit den Schnittstellen zu experimentieren. Beide Platinen basieren auf 8-Bit-PIC-Mikrocontrollern von Microchip.

SERIELLE SCHNITTSTELLEN – I²C, SPI UND 1-WIRE

In diesem Buch werden die Grundlagen der Kommunikation für die drei seriellen Schnittstellen I²C, SPI und 1-Wire vorgestellt. Anhand praxisnaher Beispiele werden die Schnittstellen anschaulich dargestellt und deren Einsatz verdeutlicht. Softwareund Hardwarebeispiele, die man in diesem Buch finden kann, wurden in Assembler für PIC-Mikrocontroller von Microchip realisiert. Die verwendeten Algorithmen und Vorgehensweisen kann man aber auf beliebige Plattform übertragen.

Miroslav Cina ist in der Tschechoslowakei geboren und hat seinen Hochschulabschluss an der Technischen Universität in Bratislava gemacht. Er lebt in der Pfalz und arbeitet seit 15 Jahren als Softwarearchitekt. Seit Ewigkeiten entwirft er verschiedenste (meistens) digitale Schaltungen. Viele davon sind inzwischen in Zeitschriften veröffentlicht worden.

Die serielle Schnittstelle dient dem Datenaustausch zwischen Mikrocontrollern und Peripheriegeräten. Bei einer seriellen Datenübertragung werden die Bits nacheinander – also seriell – über eine Leitung übertragen. Das Wissen um diese seriellen Schnittstellen erweitert die Einsatzmöglichkeiten von Mikrocontrollern und Peripheriegeräten ungemein.

SERIELLE SCHNITTSTELLEN

MIROSLAV CINA

Miroslav Cina

I²C, SPI UND 1-WIRE

SHARE

SERIELLE SCHNITTSTELLEN

DESIGN

I²C, SPI UND 1-WIRE

Miroslav Cina LEARN

DESIGN

SHARE

LEARN

LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SH ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● GN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● S ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE


Serielle Schnittstellen â—? Miroslav Cina

an Elektor Publication LEARN

Serielle Schnittstellen 170118.indd 3

DESIGN

SHARE

24-02-17 16:21



© Elektor-Verlag Aachen

1. Auflage 2017 Alle Rechte vorbehalten. Die in diesem Buch veröffentlichten Beiträge, insbesondere alle Aufsätze und Artikel sowie alle Entwürfe, Pläne, Zeichnungen und Illustrationen sind urheberrechtlich geschützt. Ihre auch auszugsweise Vervielfältigung und Verbreitung ist grundsätzlich nur mit vorheriger schriftlicher Zustimmung des Herausgebers gestattet. Die Informationen im vorliegenden Buch werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht. Die in diesem Buch erwähnten Soft- und Hardwarebezeichnungen können auch dann eingetragene Warenzeichen sein, wenn darauf nicht besonders hingewiesen wird. Sie gehören dem jeweiligen Warenzeicheninhaber und unterliegen gesetzlichen Bestimmungen. Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht vollständig ausgeschlossen werden. Verlag, Herausgeber und Autoren können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Für die Mitteilung eventueller Fehler sind Verlag und Autoren dankbar. Satz und Aufmachung: D-Vision, Julian van den Berg | Oss (NL) Druck: WILCO, Amersfoort (NL) Printed in the Netherlands

978-3-89576-318-2

Elektor ist Teil der Unternehmensgruppe Elektor International Media (EIM), der weltweit wichtigsten Quelle für technische Informationen und Elektronik-Produkte für Ingenieure und Elektronik-Entwickler und für Firmen, die diese Fachleute beschäftigen. Das internationale Team von Elektor entwickelt Tag für Tag hochwertige Inhalte für Entwickler und DIYElektroniker, die über verschiedene Medien (Magazine, Videos, digitale Medien sowie Social Media) in zahlreichen Sprachen verbreitet werden. www.elektor.de

LEARN

Serielle Schnittstellen 170118.indd 4

DESIGN

SHARE

24-02-17 16:21


Inhalt

Inhalt Kapitel 1 • Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.1. I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.2. SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3. One-Wire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Kapitel 2 • Demo-Boards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.1. DemoBoard2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.1.1 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.1.1.1 Die Einspeisung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.1.1.2 Die Tastatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.1.1.3 Das Display . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.1.1.4 I2C-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.1.1.5 SPI-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.1.1.6 OneWire-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.1.1.7 Custom Port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.1.2 Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.1.2.1 Die Initialisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.1.2.2 Menü I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.1.2.3 Menü SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.1.2.4 Menü OneWire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.1.2.5 Menü Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.2. EasyMaster2016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.2.1 Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.2.2 Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.2.3 Programmierung des EasyMaster2016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.3. Die Mechanik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Kapitel 3 • Der I2C-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.1 I2C-Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.1.1. I2C-Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.1.2. I2C-Kommunikation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.3.1. I2C-Steuerregister . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

●5

Serielle Schnittstellen 170118.indd 5

24-02-17 16:21


Serielle Schnittstellen

3.3.1.1. SSPxCON1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.3.1.2. SSPxCON2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.3.2. I2C-Initialisierung mit PIC18LF26K22 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.3.3. I2C-Initialisierung mit PIC16F1829 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.4. Daten senden und empfangen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.4.1. Kommunikation in der Monarchie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.4.1.1. i2c_start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.4.1.2. i2c_stop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.4.1.3. i2c_send . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 3.4.1.4. i2c_receive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.4.1.5. i2c_ack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.4.1.6. i2c_not_ack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.4.1.7. i2c_restart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 3.4.2. Regelkonforme Kommunikation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 3.4.2.1. Testen des Trigger-Bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.4.2.2. Testen des Interrupt-Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 3.5. Die I2C-Routinen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 3.6. GPIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.6.1. Drei Gruppen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.6.1.2. Gruppe A - quasi bidirektionale GPIOs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.6.1.3. Gruppe B - Push-Pull-GPIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 3.6.1.4. Gruppe C - Led Drivers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 3.6.2. Ăœberblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 3.6.3. Die Gruppe A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 3.6.3.1 PCF8574 als Ausgang verwenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 3.6.3.2 PCF8574 als Eingang verwenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.6.3.3 PCF8574 mit Interrupt verwenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 3.6.3.4. PCF8574 und DemoBoard2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 3.6.3.5. PCF8574 und EasyMaster2016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 3.6.3.6 PCF8575 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 3.6.3.7. PCF8575 und DemoBoard2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

â—?6

Serielle Schnittstellen 170118.indd 6

24-02-17 16:21


Inhalt

3.6.3.7. PCF8575 und EasyMaster2016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 3.6.4. Die Gruppe B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 3.6.4.1. Texas Instruments ICs der Gruppe B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 3.6.4.2. PCA6107 und DemoBoard2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 3.6.4.4. PCA6107 und EasyMaster2016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 3.6.4.5. PCF8574 mit PCA6107 und EasyMaster2016 . . . . . . . . . . . . . . . . . . . . . . . . 89 3.6.4.6. Andere Mitglieder der Familie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 3.6.4.7. Microchip ICs der Gruppe B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 3.6.4.8. MCP23008 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 3.6.4.9. MCP23009 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 3.6.4.10. MCP23016, MCP23017 und MCP23018 . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 3.6.5. Die Gruppe C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 3.6.5.1. Bedienung des Chips PCA953x / 955x . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 3.6.5.2. PCA95x3 und DemoBoard2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 3.7. LED Display Driver - MAX6959 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 3.7.1. MAX6959 mit dem EasyMaster2016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 3.8. RTC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 3.8.1. DS1307 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 3.8.1.1. Schreiben in den DS1307 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 3.8.1.2. Lesen aus dem DS1307 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 3.8.1.3. Verwenden des RAM-Speichers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 3.8.2. M41T00CAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 3.8.3. MCP7940N . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 3.8.4. ISL12022M . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 3.8.4.1. Schreiben in der ISL12022 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 3.8.4.2. Lesen aus dem ISL12022 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 3.8.5. RTC und DemoBoard2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 3.8.6. RTC und EasyMaster2016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 3.9. Temperatursensoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 3.9.1. TMP100 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 3.9.2. AT30TSE754 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

â—?7

Serielle Schnittstellen 170118.indd 7

24-02-17 16:21


Serielle Schnittstellen

3.9.3. LM76 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 3.9.4. DS1624 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 3.9.5. Temperatursensoren und DemoBoard2015 . . . . . . . . . . . . . . . . . . . . . . . . . . 154 3.10. I2C-Speicher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 3.10.1. I2C EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 3.10.2. Einen I2C EEPROM an den Bus anschließen . . . . . . . . . . . . . . . . . . . . . . . . . 161 3.10.3. Die Adressierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 3.10.4. Lesen aus der I2C EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 3.10.5. In die I2C EEPROM schreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 3.10.6. I2C EEPROM und DemoBoard2105 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 3.10.7. I2C EEPROM Beispiel für EasyMaster2016 . . . . . . . . . . . . . . . . . . . . . . . . . . 170 3.10.8. Temperatursensoren mit integriertem I2C EEPROM . . . . . . . . . . . . . . . . . . . 172 3.10.8.1. AT30TSE754 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 3.10.8.2. DS1624 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 3.10.9. I2C SRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 3.10.10. I2C FRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Kapitel 4 • Der SPI-Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 4.1 SPI-Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 4.2. SPI-Transfer-Modi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 4.3. Das Chip-Select-Signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 4.4. SPI-Einstellungen für das DemoBoard2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 4.5. SPI-Initialisierung des MSSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 4.5.1. Initialisierung des SPI-Masters mit dem PIC18LF26K22 . . . . . . . . . . . . . . . . . 193 4.5.2. Initialisierung des SPI-Masters mit dem PIC16F1829 . . . . . . . . . . . . . . . . . . . 195 4.5. Daten senden und empfangen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 4.6. Der SPI-Editor für das DemoBoard2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 4.6. GPIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 4.6.1. XRA1402/XRA1404 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 4.6.1.1. GPIOs des XRA1402/XRA1404 als Ausgang verwenden . . . . . . . . . . . . . . . . 206 4.6.1.2. GPIOs des XRA1402/XRA1404 als Eingang verwenden . . . . . . . . . . . . . . . . 210 4.6.2. XRA1403/XRA1405 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

●8

Serielle Schnittstellen 170118.indd 8

24-02-17 16:21


Inhalt

4.6.3. MCP23S08/MCP23S09 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 4.6.3.1. GPIOs des MCP23S08 / MCP23S09 als Ausgang verwenden . . . . . . . . . . . . 224 4.6.3.2. GPIOs des MCP23S08/MCP23S09 als Eingang verwenden . . . . . . . . . . . . . . 227 4.6.4. MCP23S17/MCP23S18 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 4.7. Real Time Clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 4.7.1. DS1306 - die Schaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 4.7.2. DS1306 - die Bedienung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 4.7.2.1. Lesen aus dem DS1306 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 4.7.2.2. Schreiben in den DS1306 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 4.7.3. DS1306 und DemoBoard2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 4.7.4. DS1306 und EasyMaster2016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 4.8. AMS-LED-Display-Treiber . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 4.8.1. Die Schaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 4.8.2. Die Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 4.8.4. Verwendung mit den DemoBoard2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 4.8.5. Demo mit dem EasyMaster2016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 4.9. EEPROM und Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 4.9.1. Die typische Pinbelegung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 4.9.2. Das Status-Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 4.9.3. Typische Befehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 4.9.4. Die Speicherorganisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 4.9.5. Die wichtigsten Befehle im Detail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 4.9.5.1. Lesezugriff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 4.9.5.2. Schreibzugriffe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 4.9.5.3. Löschbefehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 4.9.6. SPI-Flash und DemoBoard2015 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 4.9.6.1. Der SST25VF080B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 4.9.6.2. BR25G256-3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 4.9.6.3. AT25DF041B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 Kapitel 5 • One-Wire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 5.1. Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

●9

Serielle Schnittstellen 170118.indd 9

24-02-17 16:21


Serielle Schnittstellen

5.2. Protokoll-Konventionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 5.2.1. ROM-Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 5.2.2. Technische Ebene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 5.2.3. Kommunikationsschritte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 5.2.3. Nicht zu vergessen - CRC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 5.3. I2C-zu-One-Wire-Brücke - der Dolmetscher . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 5.3.1. Warum überhaupt einen Dolmetscher? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 5.3.2. DS2484 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 5.3.3. DS2482-100 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 5.3.4. DS2482-800 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 5.3.5. Dolmetscher - Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 5.4. One-Wire-Chips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 5.4.1. Temperatur messen mit dem DS18S20 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 5.4.2. Zugang mit dem DS2401 kontrollieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306 5.4.3. Etwas mit DS2406 schalten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 5.4.4. Ein wenig mehr zum Schalten mit dem DS2408 . . . . . . . . . . . . . . . . . . . . . . 313 5.5. Die Adressierung auf dem 1-Wire Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 5.6. Mehrere Slaves auf einem Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 5.7. One-Wire-Suche: Der Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 5.8. One-Wire-Suche: Die Implementierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 5.8.1. One-Wire Triplet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 5.8.2. Bedienung des One-Wire Search in DemoBoard2015 . . . . . . . . . . . . . . . . . . . 329 5.8.3. Die Implementierung in Assembler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 5.9. One-Wire-Suche: Die Beispielschaltung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 5.9.1. Version 1 - ROM-Code-Leser mit PIC16F1828 . . . . . . . . . . . . . . . . . . . . . . . . 348 5.9.2. Version 2 - ROM-Code-Leser mit PIC18F13K22 . . . . . . . . . . . . . . . . . . . . . . . 350 5.9.3. Version 3 - ROM-Code-Suche mit PIC18F13K22 . . . . . . . . . . . . . . . . . . . . . . 351 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354

● 10

Serielle Schnittstellen 170118.indd 10

24-02-17 16:21


Kapitel 1 • Einleitung

Kapitel 1 • Einleitung Liebe Leserin, lieber Leser, ich möchte Sie herzlich in meinem Buch willkommen heißen. Eigentlich ist das jetzt Ihr Buch, auch wenn Sie es sich vielleicht nur ausgeliehen haben. Ist aber auch egal... In diesem Buch werde ich die Grundlagen der Kommunikation für drei verschiedene serielle Schnittstellen vorstellen und anhand einiger Praxisbeispiele veranschaulichen. Diese drei Schnittstellen sind I2C, SPI und 1-Wire. Software- und Hardwarebeispiele, die man in diesem Buch finden kann, wurden in Assembler für PIC-Mikrokontroller von Microchip realisiert, die Algorithmen und Vorgehensweisen kann man aber auf beliebige Plattform übertragen. Nach diesen kurzen Erläuterungen kann es auch schon gleich losgehen. Sie können die Beispiele aus dem Buch auch herunterladen: www.elektor.de/serielle-schnittstellen. 1.1. I2C

Das I2C-Protokoll wurde vor vielen Jahren von Philips entwickelt. I2C (oder auch IIC) steht für „Inter-Integrated Circuit“. Das Protokoll zur seriellen Kommunikation zwischen typischerweise einem Master-Chip und mehreren Slave-Chips. Es handelt sich dabei um eine synchrone Kommunikation. Die I2C-Schnittstelle ist ziemlich beliebt und verbreitet. Um die einzelnen Chips miteinander zu verdrahten, benötigen wir drei Leitungen: SDA (Datenleitung), SCL (Clock-Leitung) und GND (Ground). Die SDA-Leitung dient zum Datenaustausch in beiden Richtungen. Die „typischen“ Datenübertragungsgeschwindigkeiten liegen im Bereich bis zu 400kHz oder 1MHz.

Abbildung 1-1: I2C Bus: Typische Topologie Jeder I2C-Chip besitzt eine (auf dem Bus normalerweise) eindeutige Adresse. Wenn der Master die Kommunikation startet, schickt er erst die Adresse des Chips, mit dem kommuniziert werden soll. Bei der I2C-Schnittstelle werden typischerweise Adressen mit einer Länge von 7 Bit verwendet. Es gibt einige typische I2C-Adressen, anhand derer man den Typ des ICs erkennen (oder zumindest erraten) kann. Wenn beispielsweise die Adresse mit 1010 beginnt, ist es höchstwahrscheinlich, dass es sich um einen EEPROM handelt. Eine Adresse, die mit 1001 anfängt, weist auf einen Temperatursensor hin. Dies ist so allerdings nicht immer der Fall, denn es gibt beispielsweise auch anwenderspezifische Chips, bei denen man die Slave-Logik selbst definieren kann - und hier ist dann auch die Adresse frei wählbar. Auf dem Markt sind viele verschiedene Bauteile erhältlich, die auf sehr einfache Weise einsetzbar sind und von denen ich an dieser Stelle nur folgende anführen möchte:

● 11

Serielle Schnittstellen 170118.indd 11

24-02-17 16:21


Serielle Schnittstellen

• • • • • • •

Temperatursensoren RTC (Real Time Clock)-Module (Uhren) GPIO (General Purpose Input / Output)-Bauteile ADC DAC Speicherbausteine - EEPROM, SRAM, Flash digitale Potentiometer

Hier sei kurz angemerkt, dass eine Auflistung der verfügbaren Bauteile für eine SPI-Schnittstelle fast identisch wäre. Der Unterschied liegt von allem in der Anzahl der verschiedenen Typen. Es sind zum Beispiel fast Unmengen an GPIOs für die I2C-Schnittstelle verfügbar; für die SPI aber nur sehr wenige. Interessante ADC-Bausteine sind ebenfalls verfügbar, z.B. der INA219 von Texas Instruments, der als VA-Meter sehr schnell einsetzbar ist und alle Informationen über den gemessenen Strom und die gemessene Spannung - mittels der I2C-Schnittstelle - direkt und digital liefert. 1.2. SPI

Die nächste Schnittstelle, mit der wir uns beschäftigen werden, ist SPI. Bei der SPI oder auch „Serial Peripheral Interface“ - was nicht wirklich sehr aussagekräftig ist - handelt es sich ebenfalls um eine serielle Schnittstelle für die Kommunikation zwischen einem Master und einem oder mehreren Slave-Chips. Bei einem kurzen Vergleich von SPI und I2C lässt sich Folgendes feststellen:

•S PI ist deutlich schneller als I2C (SPI weist eine Übertragungsrate von bis zu 100MHz auf, I2C bis zu 1MHz). • Bei SPI sind für die Kommunikation deutlich mehr Signalleitungen als bei I2C erforderlich (für SPI sind es 4, für I2C nur 2). • Die Adressierung auf dem SPI-Bus ist deutlich einfacher als die Adressierung auf dem I2C-Bus.

Wegen der Geschwindigkeit ist die SPI-Schnittstelle vor allem für Systeme, mit denen eine schnelle Datensammlung betrieben werden soll, aber auch für solche, bei denen relativ große externe Flash-Speicher zum Einsatz kommen, geeignet. Genau wie für die I2C-Schnittelle finden wir auch viele verschiedene Slave-Bausteine, die über SPI-Schnittstelle kommunizieren können. Hier sind vor allem folgende zu nennen:

• • • • • • •

Temperatursensoren RTC (Real Time Clock)-Module (Uhren) GPIO-Bauteile ADC DAC Speicherbausteine - EEPROM, SRAM, Flash digitale Potentiometer

● 12

Serielle Schnittstellen 170118.indd 12

24-02-17 16:21


Kapitel 1 • Einleitung

Die Flash-Speicherchips zählen sicherlich zu den größten Familien der SPI-Chips. Solche ICs unterstützen Übertragungsraten bis 100MHz. Außerdem bieten die betreffenden Bauteile z.B. der AT25DF641A von Adesto - eine Speicherkapazität von bis zu 64Mb. Im Vergleich zu I2C ist die Familie der GPIO-SPI-Chips deutlich kleiner. Auf dem Markt verfügbar sind lediglich einige wenige Typen, vor allem von Microchip (z.B. MCP23S08 - ein 8-Bit-Port-Extender) oder von Exar (z.B. XRA1402IG16-F - ebenfalls ein 8-Bit-GPIO-Bauteil. Der Auswahl an RTC-Chips ist ebenfalls deutlich geringer als für I2C (es gibt z.B. den DS1306 von Maxim Integrated). Die Familien ADC, DAC und digitale Potentiometer umfassen hingegen relativ zahlreiche Mitglieder. Das SPI-Protokoll ermöglicht im Wesentlichen die gleichzeitige bidirektionale (Full-Duplex)-Kommunikation zwischen einem Master und einem Slave-Chip. Der Bus benötigt hierfür 4 Leitungen. Davon werden immer 3 Leitungen von allen Slaves verwendet. Zusätzlich erhält jeder Slave noch eine „private“ Leitung. Alle Leitungen sind dabei „Einbahnstraßen“ (im Gegensatz zu I2C, wo SDA für die Datenübertragung in beiden Richtungen verwendet wird). Es handelt sich dabei um folgende Signalleitungen:

MOSI - g ebildet aus dem englischen „Master Out Slave In“ - ist eine Datenleitung, die für die Datenübertragung vom Master zum Slave verwendet wird (Master sendet, Slave empfängt). MISO - gebildet aus englischen „Master In Slave Out“ - ist ebenfalls eine Datenleitung, die aber für die Datenübertragung in die andere Richtung (vom Slave zum Master) genutzt wird (Master empfängt, Slave sendet). SCLK - gebildet aus dem englischen „Serial Clock“ - ist die synchronisierende Uhrenleitung. Das Signal wird immer vom Master gesendet. CS - gebildet aus englischen „Chip Select“ - ist die „private Leitung“, bei der (typischerweise) ein Draht pro Slave benötigt wird. Diese Leitung wird (in den meisten Fällen) bei 0 aktiv sein und dient eigentlich als Adressierung auf dem Bus. Der Master muss also keine „SPI Adresse“ senden, sondern nur die zugehörige CS-Leitung des gewünschten Slaves aktivieren. Dies ist nicht die einzige Möglichkeit, die Slave-Chips auf dem Bus anzusprechen, aber sozusagen die am meisten typisierte und am häufigsten verwendete.

Da wir ein Uhrensignal nutzen, handelt es sich offensichtlich um eine synchrone Datenübertragung. Die Grundschaltung eines SPI-Busses sieht folgendermaßen aus:

● 13

Serielle Schnittstellen 170118.indd 13

24-02-17 16:21


Serielle Schnittstellen

Abbildung 1-2: SPI Bus: Typische Topologie Die Datenübertragung mit dem SPI-Bus ist sehr einfach. Prinzipiell werden nur die „Netto-Daten“ übertragen, also typischerweise keine Chip-Adressen - nur Daten. Die Kommunikation beginnt damit, dass der Master eine der CS-Leitungen aktiviert. Dann werden die Daten über MOSI oder MISO in die eine oder andere Richtung übertragen (oder sogar in beiden Richtungen gleichzeitig, falls dies vom Master und vom Slave unterstützt wird), und am Ende der Kommunikation deaktiviert der Master die CS-Leitung. Das war‘s auch schon. Eine Sache ist allerdings noch zu erwähnen: Manchmal ist es doch möglich, ein CS-Signal für mehrere Slaves einzusetzen (vorausgesetzt, die Slaves unterstützen dies - was viele nicht tun). Eine Möglichkeit besteht dabei in der Kaskadierung (engl. auch „Daisy Chain“ genannt).

Abbildung 1-3: SPI Bus: Daisy Chain Schaltung Dabei fallen die Daten durch die einzelne Slaves wie das Wasser durch Wasserkaskaden.. Wenn man z.B. einem Slave 8 Bits senden soll, werden den drei Slaves insgesamt 3x8 Bits geschickt. Die andere Möglichkeit besteht dann darin, eine Art Adressierung zu verwenden, die ähnlich wie die I2C-Adressierung aufgebaut ist. Manche Chips, z.B. GPIO-Chips von Microchip, unterstützen diese Art von Adressierung auf dem SPI-Bus. 1.3. One-Wire

One-Wire, auch „Zweidraht-Schnittstelle“ genannt, wurde von Maxim Integrated entwickelt. Es handelt sich dabei um eine sagen wir sehr sparsame Art der Kommunikation - vor allem, was die Anzahl der notwendigen Leitungen betrifft. Es gibt bei der 1-Wire-Architektur zwei Besonderheiten: Abgesehen von Einspeisung ist für die bidirektionale Datenübertragung wirklich nur ein Draht (daher One-Wire) erforderlich. Außerdem benötigt man für die Slave-Chips typischerweise nicht einmal eine Einspeisung. Um den Master mit dem Slave (oder mehreren Slaves) zu verbinden, sind somit wirklich nur 2 Drähte erforderlich.

● 14

Serielle Schnittstellen 170118.indd 14

24-02-17 16:21


Kapitel 2 • Demo-Boards

Kapitel 2 • Demo-Boards Um den Inhalt des Buches nicht „zu trocken“ zu gestalten, möchte ich gleich am Anfang kurz zwei „Hauptplatinen“ vorstellen. Mit diesen Platinen ist es möglich, die später in diesem Buch beschriebenen Beispiele auszuprobieren und mit den Schnittstellen zu experimentieren. Beide Platinen basieren auf 8-Bit-PIC-Mikrocontrollern von Microchip. Warum gleich zwei Platinen? Der Grund ist einfach. Wer experimentieren möchte, muss sich eine solche Platine erst selbst bauen. Die erste – die hier als DemoBoard2015 bezeichnet wird - bietet viele Möglichkeiten. Sie verfügt über ein 2x24 LCD zum Anzeigen des Geschehens und wird über eine PS/2-Tastatur bedient. In der Firmware sind viele Bedienungselemente für verschiedene I2C-, SPI- und 1-Wire-Bauteile schon implementiert und direkt nutzbar. Die Platine ist aber dementsprechend ein wenig komplizierter. Die zweite Platine – EasyMaster2016 - ist sehr einfach und nach einer Stunde Löten auf einer Rasterplatine einsetzbar. Falls man also keine Lust hat, zunächst den Aufwand für die Herstellung einer Schnittstellen-Demo-Hauptplatine zu betreiben, aber trotzdem experimentieren möchte, kann man zu „Plan B“ greifen. 2.1. DemoBoard2015

Das Herzstück der Hauptplatine „DemoBoard2015“ ist der Mikrocontroller PIC18LF26K22 von Microchip. Für Experimente mit serieller Schnittstelle ist dieser Mikrocontroller hervorragend geeignet, weil er zwei sogenannte MSSPs besitzt. MSSP ist das Akronym für den englischen Begriffs Master Synchronous Serial Port. Jeder von diesen MSSPs lässt sich als I2C- oder SPI-Master konfigurieren, was die Implementierung der Kommunikation über diese Schnittstellen sehr vereinfacht. Der Mikrocontroller gehört zu einer MikrocontrollerFamilie, die insgesamt 16 „Mitglieder“ umfasst, deren Grundeigenschaften in der folgenden Tabelle zusammengefasst sind:

Abbildung 2-1: Übersicht der PIC-Familie PIC18(L)FxxK22 Der Grund liegt darin, dass in jeder Zeile 2 Mikrocontroller angeführt werden - einmal mit „L“ und einmal ohne „L“. Der einzige Unterschied zwischen der „L“- und der „nicht L“Version besteht in der Einspeisung. Für die Standard-Variante kann man eine Spannung von 2,3V bis 5,5V verwenden. Die „L“-Version hingegen ist schon ab 1,8V lauffähig, die

● 17

Serielle Schnittstellen 170118.indd 17

24-02-17 16:21


Serielle Schnittstellen

Obergrenze liegt aber bei 3,6V. Für die Verwendung im DemoBoard2015 sind der PIC18F26K22 und der PIC18LF26K22 gleichermaßen geeignet - die Einspeisung des Mikrocontrollers liegt hier bei 3,3V. Die einzelnen Mitglieder der Familie unterscheiden sich vor allem hinsichtlich der Größe der verfügbaren Flash-Programmspeicher (8kB bis 64kB), der Größe des SRAM-Speichers (512B - 3896B) und der Anzahl der I/Os. Für die 28-Pin-Versionen sind 25 I/O-Ports verfügbar, für die 40-Pin-Versionen dann 36 I/O-Ports. Diese Mikrocontroller sind auch sehr gut für Amateure (wie ich einer bin) geeignet, weil sie alle auch in DIP-Gehäusen verfügbar sind. Wie schon erwähnt besitzt der Chip 2 MSSPs. Im DemoBoard2015 wird der MSSP1 als I2CMaster verwendet und der MSSP2 ist als SPI Master konfiguriert. Auf diese Weise kann man gleichzeitig mit I2C und SPI experimentieren. Wenn in Beispielen das DemoBoard2015 eingesetzt wird, werden wir immer diese Icons sehen: 2.1.1 Hardware

Die Schaltung sieht auf ersten Blick relativ kompliziert aus, so schlimm ist es aber nicht.

kbd clock GND kbd data N/C Vcc N/C

X1

-

1 2 3 4 5 6

1 2 3 4 5 6

IC7 5V 8

2x10k IC3

J6

IC2 7805T

20V GND

1

C2

VI

VO

3

3

C3

1

GND 1

DIS1

TX RX

SY

2

TY RY

GND

3 2

SX

7

4

ADP3338

L2432 - LCD 24x2

VCC

1

R24

IN OUT

100n

2

100n

R23

5 6

GND

P82B96

5V - Data - GND GND - Data - GND J4 J3 1

LCD DISPLAY 16x2

1

1w

1w

C4

1

R6 5V 4k7

9

SDA SCL RST

P0 P1 P2 P3 P4 P5 P6 P7

A0 A1 A2 INT

7 8 10 11 12 13 14 15

1

100

13 2 1 8

R13 LED1 100

A2 A1 A0 GND

R14 LED2 100

PCA9546A

SD1 SC1 SD2 SC2 SD3 SC3

6 7 9 10 11 12

R11

I2C intern 3,3V

3,3V

GND

R15 LED3 100

I2C intern 3,3V

R17 LED5 100

R27 10k

R18 LED6 100 R19 LED7 100

SCK SDI SDO CS1

15 14

1 2 3 8

VCC SDA SCL

A0 A1 A2

P0 P1 P2 P3 P4 P5 P6 P7

INT

4 5 6 7 9 10 11 12

CS signals for the SPI connectors

RC5-RC6-RC7 1 2

16

SPI-1

3,3V GND

1 2

J7

J9

IC6

Custom-seriel

LED5-8: signalization of activity of CS signals for the SPI connectors

3,3V GND SCL N/C SDA

J5

R20 LED8

LED1-4: switch on/off the segments of the I2C bus

SDI = input for PIC / output Device SDO = output PIC / input device SPI-0 SCK 3,3V SDI GND SDO CS0 1 2

3,3V GND SCL N/C SDA SDA -- yellow SCL -- green

R16 LED4 100

GND PCA6107

5V GND SCL N/C SDA

J10

4k7 R12 4k7

5V GND SCL N/C SDA

J1

4 5 6

RESET

SD0 SC0

I2C-Bus1

SDA SCL

1

VCC

4 5

I2C-Bus3

3 2 16

R5

IC5 16

IC4

VCC1 VCC2

2

GND

4k7

3

17 18

6

GND 3,3V

15 14

3,3V

1W

1

J2

GND

PCT AD1 AD0

1

3

R3

PIC18LF24K22

R26

5V

VCC

SDA SCL

R9

28 27 26 25 24 23 22 21 20 19 18 17 16 15

4k7

LED10 Green

KBI3/PGD/RB7 KBI2/PGC/RB6 KBI1/PGM/RB5 KBI0/AN9/RB4 CANRX/RB3 INT2/CANTX/RB2 INT1/AN8/RB1 INT0/AN10/RB0 VDD VSS RC7/RX/DT RC6/TX/CK RC5/SDO RC4/SDI/SDA

4k7 R4

100

100 R21

R22

LED9 Red

7 8

R8

IC1 RE3/MCLR/VPP RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4/SS/HLVDIN VSS RA7/CLKI/OSC1 RA6/CLKO/OSC2 RC0/T1OSO/T13CKI RC1/T1OSI RC2/CCP1 RC3/SCK/SCL

5 4

I2C-Bus2

10k

470 R1

R2

R25 1 2 3 4 5 6 7 8 9 10 11 12 13 14

IC8 DS2482-100S

I2C extern1 - 5V

R7 4k7

I2C-Bus0

4k7

J11

47uF

2x10k

1

GND

4k7

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

47uF

R10 4k7

C1

+

+

GND VCC CONTR RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 NC NC

3,3V

5V GND 3,3V

SCK SDI SDO CS2

SPI-2

3,3V GND

1 2

J8

13

GND

PCF8574N I2C intern 3,3V

● 18

Serielle Schnittstellen 170118.indd 18

24-02-17 16:21


Kapitel 2 • Demo-Boards

Wir können sie in folgende Funktionsbereiche unterteilen:

• • • • • •

Einspeisung Tastaturanschluss Anzeige (LCD) I2C-Bus SPI-Bus OneWire-Bus

Diese einzelnen Bereiche werden nun im Folgenden beschrieben. Es sei gleich an dieser Stelle erwähnt, dass die I2C-Schnittstelle auch für die interne Steuerung verwendet wird. 2.1.1.1 Die Einspeisung

Die Hauptplatine verwendet zwei Spannungskreise: +3,3V und +5,0V. Die Notwendigkeit hierfür ergibt sich daraus, dass viele (vor allem) SPI-Chips nur bis 3,6V arbeiten, man aber anderseits für LCD und die Tastatur 5,0V benötigt. Deswegen wird der Mikrocontroller „plus Zubehör“ mit 3,3V gespeist, und die externe Tastatur plus Display mit 5,0V. Wenn zwei Spannungen zur Verfügung stehen, gibt es natürlich auch zwei verschiedene I2C Anschlüsse – einen mit 3,3V und einen mit 5,0V. Die genaue Funktionsweise wird später noch näher erläutert. Das Board geht von einer externen Stromquelle mit eine Spannung von etwa 7 bis 20V/1A aus. Man kann z.B. ein Netzteil von einem alten Notebook oder etwas Ähnliches verwenden. Die stabilisierte Spannung von +5,0V wird hier vom „Klassiker“ 7805 erzeugt. Aus dieser Spannung wird dann mit Hilfe des ADP3338-3,3 die stabilisierte 3,3V-Spannung generiert. Beide Spannungsregler sind lineare Regler; dementsprechend sollte man vor allem beim 7805 und höheren Eingangsspannungen (z.B. 20V) ein wenig auf die Kühlfläche achten. Alternativ könnte man selbstverständlich auch einen Switch-Regulator verwenden. 2.1.1.2 Die Tastatur

Das DemoBoard ist mit einer handelsüblichen PS/2-Tastatur bedienbar. Wie aber schon kurz erwähnt wurde, sind für die Tastatur 5,0V erforderlich, damit sie arbeiten kann. Der Mikrocontroller wird mit 3,3V gespeist. Das macht die bidirektionale Kommunikation nicht einfacher. Wenn man mehrere Tastaturen zur Hand hat, findet man mit ein wenig Glück auch eine, die mit 3,3V arbeiten kann - eine universale Lösung ist das aber nicht. Daher sollte man hinsichtlich der Tastatur bei 5,0V bleiben. Weil bei der PS/2-Tastatur eine synchrone, serielle Kommunikation verwendet wird, werden für den Datenaustausch zwei Leitungen benötigt: Clock und Data. Damit der Mikrocontroller beim Datenaustausch nicht beschädigt wird, müssen die Pegel auf diesen beiden Leitungen angepasst werden. Für die Mikrocontroller-Seite muss als logische Eins die Ebene mit 3,3V verwendet werden, für die Tastatur-Seite dann 5,0V. Für diesen Wechsel ist der IC7 zuständig. Es handelt sich dabei um einen P82B96 - ein I2C-Bus-Erweiterungsbauteil, das in Lage ist, auch mit unterschiedlichen Spannungen auf den jeweiligen Seiten zu arbeiten. Auch wenn die Tastatur kein I2C-Protokoll unterstützt, schafft der P82B96 diese Aufgabe anstandslos. Weil laut I2C-Hardwarespezifikation die einzelnen Leitungen über Transistoren mit offenem Kollektor bedient werden, kümmern sich um die notwendigen High-Ebenen die angeschlossene Pull-Up-Widerstände: Auf der Tastatur-Seite sind es R23 und R24 und für

● 19

Serielle Schnittstellen 170118.indd 19

24-02-17 16:21


Serielle Schnittstellen

die Mikrocontroller-Seite R25 und R26. Die Tastatur wird dann mit Hilfe des IC7 an die Ports RB6 und RB7 des Mikrocontrollers angeschlossen. 2.1.1.3 Das Display

Das LC-Display ist deutlich einfacher anzuschließen als die Tastatur. Auch wenn es mit 5,0V arbeitet, verläuft die Kommunikation nur in eine Richtung - vom Mikrocontroller zum Display. Die Ebene der logischen Eins ist mit 3,3V auch hoch genug für die Kommunikation mit dem Display, also muss man sich um den Pegelwechsel keine Gedanken machen. Das LCD kann man direkt am Mikrocontroller anschließen. Es wird ein Standard-LCD mit 2x24 Zeichen und dem „HD44780-Protokoll“ im 4-Bit Modus verwendet. Zum Anschließen des Displays sind dann insgesamt 6 Leitungen erforderlich. 2.1.1.4 I2C-Bus

Man kann sagen, dass das Basiskommunikationsprotokoll des DemoBoard2015 die I2CSchnittstelle ist. Teilweise wird I2C zur Steuerung von SPI genutzt. Genauso wird sie zum Steuern (man kann sogar sagen zum Erzeugung) von OneWire-Bus verwendet. Auch die LED-Signalisierung der Zustände erfolgt durch I2C. Damit dies alles möglich ist und man auch noch experimentieren kann, wurden mehrere I2C- Segmente definiert. Hierzu wurde der IC5 genutzt, bei dem es sich um einen I2C-Switch-Chip vom Typ PCA9546A von Texas Instruments handelt. Der Chip ist mit dem Master (Mikrocontroller) über den Upstream-Port verbunden (und zwar mit den Leitungen SDA und SCL) und stellt 4 mehr oder weniger unabhängige Downstream-Ports bereit (SD0 und SC0 bis SD3 und SC3). Damit ergibt sich ein sternförmiges Netzwerk. Jedes Segment des Sterns lässt sich softwaremäßig abschalten und kann mit einer Spannung von 1,8V oder 2,5V sowie 3,3V oder 5,0V arbeiten - und zwar unabhängig davon, welche Spannung für die Einspeisung des Chips selbst verwendet wird.

Abbildung 2-2: Vereinfachte Schaltung mit dem PCA9546A

● 20

Serielle Schnittstellen 170118.indd 20

24-02-17 16:21


Serielle Schnittstellen

Kapitel 3 • Der I2C-Bus Um Sie nicht zu langweilen, werde ich bei der Beschreibung die Schnittstellen- und I2C-Bus-Historie auslassen. Sie können heute überall zu nachlesen, dass der I2C („Inter-Integrated Circuit“)-Bus vor vielen Jahren von Philips spezifiziert und entwickelt wurde, und dass es sich - wie der Name schon verrät - um einen Bus handelt, der für die Kommunikation zwischen integrierten Schaltungen gedacht ist. Ich möchte auch die Abläufe der Start- und Stoppbedingungen nicht weiter erläutern - zum einen findet man die entsprechenden Informationen heutzutage auch „überall“ und zum anderen werden wir uns auf die modernen Mikrocontroller (man könnte aber fast auch „die guten alten Mikrocontroller“ schreiben) verlassen, die alle grundlegenden Dinge für uns erledigen... Es ist wichtig anzumerken, dass auf dem Markt viele verschiedene I2C-Chips verfügbar sind, daher ist die Schnittstelle auch sehr beliebt und wird oft verwendet. Ein paar Beispiele werden wir uns gleich ansehen. Starten wir also gleich mit der Kommunikation.

Abbildung 3-1: Topologie des I2C Buses 3.1 I2C-Grundlagen

Bei I2C handelt sich es um eine synchrone serielle Schnittstelle. Für die Datenübertragung werden zwei Leitungen benötigt: SCL - das Uhrensignal - und SDA - die Datenleitung. Selbstverständlich kommt auch noch GND hinzu. Auf dem Bus gibt es immer einen (oder mehrere) Master-Chip(s) und einen oder mehrere Slave-Chip(s). Der Master generiert immer das Uhrensignal. Die Frequenz der Clock liegt standardmäßig bei 100 kHz, im „Fast Mode“ dann bei 400 kHz. Inzwischen gibt es auch höhere Übertragungsraten, die vor allem bei der Übertragung von großen Datenmengen verwendet werden, die meisten verfügbaren Chips unterstützen aber eine Taktung von bis zu 400 kHz. Mit dem Multimaster-Mode werden wir uns hier nicht beschäftigen. Wenn wir diese Funktionalität also weglassen, sieht die I2C-Bus-Schaltung prinzipiell immer folgendermaßen aus:

● 34

Serielle Schnittstellen 170118.indd 34

24-02-17 16:21


Kapitel 3 • Der I2C-Bus

Der Master kontrolliert die Kommunikation über den I2C-Bus. Dabei wird immer ein Uhrensignal vom Master generiert - die SCL-Leitung fungiert als „Einbahnstraße“ vom Master zum Slave. Durch die SDA (Daten)-Leitung werden die Daten in beiden Richtungen (also vom Master zum Slave oder auch vom Slave zum Master) übertragen. Die I2C-Übertragungsraten pro Sekunde sind nicht unbedingt die höchsten, für die meisten Anwendung aber vollkommen ausreichend. Wenn man eine Temperaturinformation oder Zeitinformation auslesen möchte, ist es normalerweise nicht so kritisch, ob die handvoll Bytes mit einer Geschwindigkeit von 100 Bits pro Sekunde oder vielleicht mit 100 MBytes pro Sekunde übertragen werden. 3.1.1. I2C-Hardware

Hardwaremäßig werden alle Chips (Master und Slaves) mittels Open-Kollektor-Transistoren angeschlossen. Die beiden Leitungen (SDA und SCL) müssen deswegen mit Pull-Up-Widerständen mit Vcc verbunden werden. Das heißt also, dass wenn eine Eins an den Bus geschickt werden soll, der betreffende Chip nichts tut (um die logisch Eins kümmern sich die Pull-Ups). Falls aber eine Null gesendet werden soll, aktiviert der Chip seinen Open-Kollektor-Ausgangstransistor. Die Ebene Eins ist bezüglich des Spannungslevels nicht festgelegt. Dieser hängt von der Systemlandschaft und den Anforderungen ab. Es gibt Systeme, bei denen die Vcc-Spannung auf dem I2C-Bus nur 1,8V beträgt, es können aber auch die „typischen“ 3,3V oder 5,0V sein. Für manche Anwendungen könnte es sogar sinnvoll sein, den Spannungslevel noch höher zu schrauben - z.B. auf 12V. Die angeschlossen Chips müssen diesen dann aber auch selbstverständlich tolerieren können. Manchmal muss man einzelne Teilsysteme, die mit unterschiedlichen Spannungen arbeiten, integrieren. Es könnte also sein, dass einige Chips mit 1,8V arbeiten und andere mit 5,0V. Um diese auf einen Bus zu bringen, kann man speziell für diesen Zweck entwickelte Chips einsetzen. 3.1.2. I2C-Kommunikation

Für die I2C Kommunikation ist es wichtig, dass jeder Chip auf dem Bus eine I2C-Adresse besitzt. Diese Adresse kann entweder 7 oder 10 Bit lang sein. Wir werden uns mit dem „Standardfall“ - einer 7-Bit-Adresse - beschäftigen. Die I2C-Adressen sind nicht unbedingt eindeutig, es macht ja normalerweise sowieso eher Sinn, wenn sich auf dem Bus immer nur ein Slave mit einer I2C-Adresse befindet. Man kann anhand der I2C-Adresse nicht eindeutig bestimmen, um welches Gerät sich es handelt, es gibt aber einige Adressen, die von verschiedenen Chip-Arten typischerweise verwendet werden. Ein paar Beispiele kann man der folgenden Tabelle entnehmen (die drei x als LSB der Adresse deuten darauf hin, dass diese Bits in vielen Fällen bei einzelnen Chips konfigurierbar sind):

● 35

Serielle Schnittstellen 170118.indd 35

24-02-17 16:21


Serielle Schnittstellen Typische verwendete I2C-Adressen für verschiedenen Slave-Chips I2C Adresse

Typ des Chips

Kommentar

1010 xxx

EEPROM

Ein EEPROM-, SRAModer FRAM-Speicher

0100 xxx

Porterweiterung

0111 xxx

Porterweiterung

I/O-Port-Expander-Chip I/O- Port-Expander-Chip

1110 xxx

I2C Switch

spezieller Chip für die Fragmentierung des Busses oder oft auch für die Verbindung von Bus-Segmenten mit unterschiedlichen Spannungen

1101 000 oder

RTC

Real Time Clock

Temperatursensor

digitaler Temperatursen-

1101 111 1001 xxx

sor - an dieser Adresse können wir aber auch andere A/D-Chips finden 0101 xxx

digitaler Potentiometer

digitaler Potentiometer

Jede I2C-Kommunikation wird vom Master gestartet und hat einen vorgegebenen Rahmen. Die I2C-Kommunikation findet immer zwischen einem Master und einem Slave-Chip statt. Es ist nicht möglich, gleichzeitig zwei „Kommunikationskanäle“ geöffnet zu halten. Zur Veranschaulichung lässt sich hier ein Vergleich zu der Arbeit mit einem DOS-File-System ziehen. Am Anfang wird eine Datei zum Schreiben oder Lesen geöffnet, dann wird geschrieben, oder gelesen und am Ende wird die Datei wieder geschlossen. Wie bereits erwähnt, kann man aber zu jedem Zeitpunkt immer nur eine Datei geöffnet haben. Bei der I2C-Kommunikation gibt es 7 Grundbausteine. Jede Datenübertragung durch den Bus wird ausschließlich aus diesen Elementen zusammengebaut. Die sieben Bausteine der I2C-Kommunikation Name

Bedeutung

Start Condition

Die Startbedingung initialisiert die Kommunikation. Sobald der Master die Startbedingung generiert hat, warten alle Slave-Chips gespannt darauf, zu erfahren, wer „der Ausgewählte“ ist.

Stop Condition

Mit der Stoppbedingung wird die I2C-Kommunikation beendet.

Send Byte

Es wird ein Byte vom Master an den Slave geschickt. Wenn dieses Byte gleich nach der Startbedingung geschickt wird, beinhaltet es die 7 Bit lange I2C-Adresse des Chips, mit dem der Master kommunizieren möchte, und zusätzlich die Information, ob der Master schreiben oder lesen will. Diese Info ist im LSB des Bytes „versteckt“, bei dem eine Eins für die Leseoperation steht und eine Null für die Schreiboperation.

● 36

Serielle Schnittstellen 170118.indd 36

24-02-17 16:21


Kapitel 3 • Der I2C-Bus Receive Byte

Der Master empfängt das Byte vom Slave.

Send Acknowledgement

Der Master oder der Slave bestätigt den Empfang des Bytes mit ACK.

Send Not Acknowledgement

Der Master oder der Slave negiert den Empfang des Bytes mit NOT ACK.

Repeated Start Condition

Diese wird auch „restart condition“ genannt - der Master startet die Kommunikation erneut. Typischerweise erfolgt eine solche Aktion dann, wenn die Datenflussrichtung umgedreht werden soll.

Eine typische I2C Schreibkommunikation (Datenübertragung von Master zum Slave) läuft so ab: 1. Der Master schickt die Startbedingung. 2a. Der Master schickt die I2C-Adresse des Slaves mit dem Schreibindikator (das LSB des Bytes mit der Adresse ist gleich Null). 2b. Der Slave bestätigt der Empfang mit ACK. 3a. Der Master schickt das Byte, das in den Slave-Chip geschrieben werden soll. 3b. Der Slave bestätigt den Empfang des Bytes mit ACK. 3c. Falls weitere Bytes geschickt werden sollen, kann der Master mit 3a fortfahren. 4. Der Master beendet die Kommunikation mit der Stoppbedingung. Beim Lesen ist der Ablauf manchmal ein wenig komplizierter, weil wir in vielen Fällen erst angeben müssen, was gelesen werden soll. Bei einem EEPROM wird typischerweise erst die Speicherplatzadresse vom Master spezifiziert, bei einem RTC-Chip die Adresse des Registers, das gelesen werden soll. Bei einfachen Port-Expander-Chips ist hingegen keine „Adressierung“ erforderlich und man kann gleich mit dem Lesen beginnen. Eine typische I2C-Lesekommunikation (Datenübertragung vom Slave zum Master) läuft also folgendermaßen ab: Variante 1 - es ist keine Adressierung erforderlich. 1. Der Master schickt die Startbedingung. 2a. Der Master schickt die I2C-Adresse des Slaves mit dem Leseindikator (das LSB des Bytes mit der Adresse ist gleich Eins). 2b. Der Slave bestätigt den Empfang mit ACK. 3a. Der Master initialisiert die Leseoperation und empfängt das Byte. 3b. Der Master bestätigt mit ACK den Empfang des Bytes oder negiert diesen mit NOT ACK. 3c. Falls weitere Bytes gelesen werden sollen, kann der Master mit 3a fortfahren. Normalerweise wird auf den Empfang des letzten Bytes mit NOT ACK geantwortet. Dies ist für den Slave eine Vorankündigung, dass die Kommunikation bald beendet wird. 4. Der Master beendet die Kommunikation mit der Stoppbedingung.

● 37

Serielle Schnittstellen 170118.indd 37

24-02-17 16:21


Kapitel 4 • Der SPI-Bus

Kapitel 4 • Der SPI-Bus Die nächste Schnittstelle, mit der wir uns beschäftigen werden, ist SPI. Bei SPI oder auch „Serial Peripheral Interface“ - was nicht wirklich sehr aussagekräftig ist – handelt es sich ebenfalls um eine serielle Schnittstelle für die Kommunikation zwischen einem Master und einem oder mehreren Slave- Chips. Wenn man SPI sehr schnell mit I2C vergleichen möchte, lässt sich Folgendes feststellen:

• SPI ist deutlich schneller als I2C (SPI bis zu 100MHz, I2C bis zu 1MHz). • SPI benötigt für die Kommunikation deutlich mehr Datenleitungen als I2C (SPI 4, I2C 2). • Die Adressierung auf dem SPI-Bus ist deutlich einfacher als auf dem I2C-Bus.

Weil die Schnittstelle so schnell ist, lässt sie sich wunderbar für wunderbar für schnelle Anwendungen für die Datensammlung – ADC - einsetzen oder auch für die Arbeit mit externen Speicherbausteinen (vor allem Flash-Speicherbausteinen). Es sind zahlreiche verschiedene Slave-Bauteile verfügbar, die über die SPI-Schnittstelle kommunizieren können. Dabei sind vor allem folgende anzuführen:

• • • • • • •

Temperatursensoren RTC (Real Time Clock)-Bauteile GPIO-Bauteile ADC DAC Speicherbausteine - EEPROM, SRAM, Flash digitale Potentiometer

Die größte Familie der SPI-Bauteile bilden eindeutig die Flash-Speicher-Chips, die bis zu 100MHz-Übertragungsfrequenz unterstützen. Diese Bausteine erreichen eine Speicherkapazität von bis zu 64Mb - wie z.B. der AT25DF641A von Adesto. Im Vergleich zu I2C ist die Familie der GPIO-SPI-Chips deutlich kleiner. Auf dem Markt verfügbar sind lediglich ein paar Typen, vor allem von Microchip (z.B. der MCP23S08 - ein 8-Bit-Port-Extender) oder von Exar (z.B. der XRA1402IG16-F - auch ein 8-Bit-GPIO-Bauteil). Die Auswahl an RTC-Chips ist ebenfalls deutlich geringer als für I2C (es gibt z.B. den DS1306 von Maxim Integrated). Dagegen umfassen die Familien ADC, DAC und digitale Potentiometer relativ viele Mitglieder. 4.1 SPI-Grundlagen

Das SPI-Protokoll ermöglicht die gleichzeitige bidirektionale Kommunikation zwischen einem Master- und einem Slave-Chip. Der Bus benötigt hierzu 4 Leitungen, von denen 3 für alle Slaves die gleichen sind. Zusätzlich erhält jeder Slave noch eine „private“ Leitung. Alle Leitungen sind dabei „Einbahnstraßen“ (im Gegensatz zu I2C, wo SDA für die Datenübertragung in beide Richtungen verwendet wird). Es handelt sich um folgende Signalleitungen:

● 177

Serielle Schnittstellen 170118.indd 177

24-02-17 16:22


Serielle Schnittstellen

MOSI –für engl. „Master Out Slave In“ - ist eine Datenleitung, die für die Datenübertragung vom Master zum Slave verwendet wird (der Master sendet, der Slave empfängt). MISO – für engl. „Master In Slave Out“ - ist ebenfalls eine Datenleitung, die aber für die Datenübertragung in die andere Richtung (vom Slave zum Master) zuständig ist (der Slave sendet, der Master empfängt). SCLK – für engl. „Serial Clock“ - ist die synchronisierende Uhrenleitung. Das Signal wird immer vom Master gesendet. CS – für engl. „Chip Select“ - ist die „private Leitung“, bei der man (typischerweise) einen Draht pro Slave benötigt. Diese Leitung wird (in den meisten Fällen) bei 0 aktiv sein und dient eigentlich zur Adressierung auf dem Bus. Statt also eine „SPI-Adresse“ zu verschicken, muss der Master nur die zugehörige CS-Leitung des gewünschten Slaves aktivieren. Dies ist nicht die einzige Möglichkeit, die Slave-Chips auf dem Bus anzusprechen, aber sagen wir die am meisten typisierte und am meisten verwendete Möglichkeit. Weil wir ein Uhrensignal nutzen, handelt es sich offensichtlich um eine synchrone Datenübertragung. Die Grundschaltung eines SPI-Busses sieht folgendermaßen aus:

Abbildung 4-1: Grundschaltung eines SPI-Busses Die Datenübertragung mit dem SPI-Bus ist sehr einfach. Prinzipiell werden nur die „Netto-Daten“ übertragen – also typischerweise keine Chip-Adressen - nur Daten. Die Kommunikation startet damit, dass der Master eine der CS-Leitungen aktiviert. Dann werden die Daten über MOSI oder MISO in die eine oder Richtung übertragen (oder sogar in beide Richtungen gleichzeitig - falls dies vom Slave unterstützt wird). Am Ende der Kommunikation deaktiviert der Master die CS-Leitung. Das war‘s auch schon. Es ist allerdings noch eine Sache zu erwähnen. Manchmal ist es doch möglich, ein CS-Signal für mehrere Slaves einzusetzen (vorausgesetzt, die Slaves unterstützen dies - was viele nicht tun). Eine Möglichkeit ist dabei die Kaskadierung (im Englischen auch „Daisy Chain“ genannt):

● 178

Serielle Schnittstellen 170118.indd 178

24-02-17 16:22


Kapitel 4 • Der SPI-Bus

Abbildung 4-2: Kaskadierung Dabei werden die betreffenden Daten durch die einzelnen Slaves geschrieben. Wenn man also z.B. für einen Slave 8 Bits senden soll, werden für die 3 Slaves insgesamt 3x8 Bits geschickt. Die andere Möglichkeit besteht dann darin, eine Art von Adressierung zu verwenden, die ähnlich wie die I2C-Adressierung aufgebaut ist. Manche Cips, z.B. GPIO-Chips von Microchip, unterstützen diese Adressierung auf dem SPI-Bus. 4.2. SPI-Transfer-Modi

Gewisse Komplikation bei SPI sind dadurch bedingt, dass es vier verschiedene Kommunikationsmodi gibt. Diese werden durch zwei Parameter festgelegt: Parameter CPOL (für engl. „Clock Polarity“) definiert den „Idle-Wert“ der Uhrenleitung. Es ist wichtig, dass Master und Slave den den gleichen Pegel für aktiv und inaktiv auf der Clock-Leitung erwarten. Dieser kann entweder 0 oder 1 sein - die beiden Pegel müssen aber „abgestimmt“ sein. Parameter CPHA (für engl. „Clock Phase“) definiert den Zeitpunkt, wann die Datenleitungen stabil sind. Oder anders ausgedrückt: Mit dem CPHA wird festgelegt, wann sich die Daten auf den Datenleitungen ändern sollen - entweder beim Clock-Übergang vom inaktiven in den aktiven Zustand oder umgekehrt. Was wiederum „aktiv“ und „inaktiv“ ist, wird durch CPOL definiert. Normalerweise finden wir im Datenblatt zum SPI-Slave immer die Information, welche Einstellungen für die Kommunikation erforderlich sind, und der Master muss entsprechende Anpassungen vornehmen. Wenn wie mehrere Slaves auf dem SPI-Bus haben, für die verschiedene Einstellungen erforderlich sind, müssen wir diese im Laufe des Programms immer „umschießen“, damit es passt... Es ist auch wichtig, zu erwähnen, dass die einzelnen Signalleitungen des SPI-Busses in verschiedenen Quellen auch unterschiedlich gekennzeichnet sein könnten. Die Daten-Leitungen MOSI und MISO erhalten ihre Bezeichnung oft aus Sicht des Chips. Bei dieser Konvention würde man die ausgehenden Daten immer als SDO (für engl. „Serial Data Out“) bezeichnen, und die eingehende Daten als SDI (für engl. „Serial Data In“). Manchmal werden diese drei Buchstaben nochmal abgekürzt: SDO = SO (Serial Output) und SDI = SI (Serial Input). An dieser Stelle ist es wichtig zu beachten, dass die Leitung „über Kreuz“ angeschlossen werden müssen - also der SDO des Masters an den SDI des Slaves und der SDI des Masters an den SDO des Slaves. Unsere „SPI-Grundschaltung“

● 179

Serielle Schnittstellen 170118.indd 179

24-02-17 16:22


Serielle Schnittstellen

würde also demnach so aussehen:

Abbildung 4-3: SPI-Grundschaltung Ich persönlich finde die Bezeichnung MISO und MOSI deutlich einfacher - dabei muss man nämlich nicht überlegen, von welcher Seite man gerade schaut... Aber man muss wie bereits erwähnt beide Alternativen kennen... Beim Clock-Signal ist es eigentlich einfacher. Außer SCLK finden wir manchmal auch die Bezeichnung SCK (wieder ein Buchstabe gespart) - weil das Signal aber immer von Master ausgeht, muss man sich keine Gedanken über die Richtung machen... Das CS (Chip Select)-Signal wird manchmal auch als SS (vom englischen „Slave Selection“) oder auch STE (vom englischen „Slave Transmit Enable“) bezeichnet. In 90% der Fälle ist die aktive Ebene des Signals die Null. Es gibt aber auch Ausnahmen - der Uhrenchip DS1306 z.B. erwartet eine Eins als aktive Ebene... Jetzt aber zurück zu den SPI-Modi. Wie schon kurz erwähnt, gibt es zwei Parameter (CPOL und CPHA), die man beliebig kombinieren kann. Davon können 4 verschiedene Modi abgeleitet werden. Diese werden dann auch wirklich Mode 0, Mode 1, Mode2 und Mode 3 genannt. Manchmal werden die Zahlen binär dargestellt - also als Mode 00, Mode 01, Mode 10 und Mode 11. Die PIC-Mikrocontroller von Microchip unterstützen selbstverständlich alle 4 Arten der Kommunikation. Wir finden zwar keine CPOL- und CPHA-Bits, aber CKP-Bits (engl. „Clock Polarity Select Bits“) und CKE-Bits (engl. „SPI Clock Edge Select Bits“), die auf gewisse Art und Weise den CPOL- und den CPHA-Parameter darstellen. Das CKP-Bit ist im Register SSP2CON1 zu finden und repräsentiert den Parameter CPOL: CKP = 0 – die inaktive Ebene des Uhrensignals ist die Null. CKP = 1 – die inaktive Ebene des Uhrensignals ist die Eins. Das CKE-Bit finden wir im Register SSP2STAT. Es stellt den negativen Wert des Parameters CPHA dar: CKE = 0 - Datenübertragung findet bei der Flanke inaktiv -> aktiv statt. CKE = 1 - Datenübertragung findet bei der Flanke aktiv -> inaktiv statt. Es geht dabei um die Datenübertragung vom Mikrocontroller (Master) zum Slave - also um die MOSI-Leitung (oder aus der Sicht des Mikrocontrollers die SDO-Leitung).

● 180

Serielle Schnittstellen 170118.indd 180

24-02-17 16:22


Kapitel 5 • One-Wire

Kapitel 5 • One-Wire Lieber Leser, inzwischen sind Sie auf Seite 120 gelandet und haben schon einiges hinter sich. Daher ist es Zeit für eine Abwechslung. In diesem Kapitel werden wir einen Ausflug machen. Wir bewegen uns dabei allerdings nicht allzu weit fort, damit wir uns nicht verlaufen. Wir werden den (nach den 119 vorangegangenen Seiten schon bekannten) Bereich der I2C-Kommunikation aber durchaus verlassen und uns bei den Nachbarn umschauen. Diese verwenden auch serielle Kommunikation, doch sie sprechen eine andere Sprache als die, die im I2C-Land verwendet wird. Sie nutzen bei der Sprache auch keine Synchronisation (also kein Clock-Signal) und - was noch merkwürdiger ist - keine Einspeisung. Aus diesem Grund ist diese Kommunikation sehr strikt und sparsam. Die entsprechende Verbindung ist hardwaremäßig sehr einfach aufzubauen. Dieses Land nennt sich „One-Wire“, was ein Versprechen zum Ausdruck bringen soll, nämlich dass man für die Kommunikation nur einen Draht benötigt. Eigentlich stimmt das auch, aber wie es mit Versprechen manchmal so ist, so ganz wiederum doch nicht. Man braucht 2 Leitungen: „die eine“ plus GND. „Die eine“ Leitung dient dann zum beidseitigen Datenaustausch und zur Einspeisung der einzelnen Peripherien gleichzeitig. Im Vergleich zu I2C (wo wir 4 Leitungen brauchen: SDA, SCL, Vcc und GND) kommt man im One-Wire-Land mit der Hälfte aus. Aber keine Sorge - auf unserem Ausflug werden wir von einem Dolmetscher begleitet, damit wir uns verständigen können... 5.1. Überblick

Vor der Reise ist es schon sinnvoll, einen Blick in entsprechende Reisebegleiter zu werfen. Dort finden wir ungefähr folgende Informationen: One-Wire-Bus oder auch „1-Draht Bus“ ist eine serielle Schnittstelle der Firma Dallas Semiconductor Corp. - heutzutage Maxim Integrated. Es kommuniziert immer ein Master mit einem Slave, wobei sich auf dem Bus mehrere Slaves gleichzeitig befinden können. Zur Datenübertragung wird nur eine Leitung verwendet, wobei keine Synchronisation erfolgt. Das Interessanteste hierbei ist, dass die Datenleitung auch zur Stromversorgung des Slaves dient. Daher benötigt man für die Verbindung zwischen Master und Slave(s) wirklich nur GND und eine Leitung. Das typische One-Wire-Land könnte man so darstellen, wie in Abbildung 02-01 zu sehen ist.

Abbildung 5-1: Typische 1-Wire-Landschaft In anderen Worten: Beim 1-Wire Bus oder auch „Eindraht-Bus“ handelt es sich um ein System für die serielle Kommunikation zwischen einem Master und einem oder mehreren

● 273

Serielle Schnittstellen 170118.indd 273

24-02-17 16:22


Serielle Schnittstellen

Slave-Chips unter Verwendung von nur zwei Leitungen. Die erste Leitung ist die Datenleitung, gekennzeichnet als „DQ“, manchmal auch „Data“ oder auch „OWIO“ (engl. One Wire Input Output). Die zweite Leitung ist GND. Manchmal begegnen wir auch der Bezeichnung OWRTN (engl. One Wire ReTurN). Egal wie die Benennung auch sein mag – DQ sorgt für den beidseitigen Datenaustausch und stellt außerdem auch die sogenannte parasitische Stromversorgung für die Slaves bereit. GND ist „einfach GND“. Die DQ-Leitung wird immer mit einem Open-Collector-Ausgang verbunden, das heißt, wenn die Leitung „still“ ist, ist sie auf der Ebene der logischen 1 und zwar wegen des externen Pull-Up-Widerstandes. Um die Stromversorgung des Slaves kümmert sich prinzipiell das System der parasitären Stromversorgung (das System ist fester Bestandteil jedes Slaves). Wenn sich die DQ-Leitung auf „1“ befindet, ist dieses System dafür zuständig, genug Energie aus der Leitung „zu klauen“, um den Slave für eine Weile lauffähig und kommunikationsfähig zu halten. Manche Chips aber benötigen für aufwändigere Operationen mehr Energie, als die parasitäre Stromversorgung liefern kann. Das ist z.B. bei der Temperaturmessung mit Temperatursensoren der Fall oder beim EEPROM-Speicher, wenn Daten vom EEPROM-Puffer wieder in den EEPROM geschrieben werden, usw. Bei diesen Operationen muss der Master die Kommunikation auf dem Bus für die notwendige Zeit unterbrechen und die Leitung „künstlich“ auf „1“ halten, damit der Bus für die Stromversorgung des Slaves genutzt wird und der Slave somit die Operation erfolgreich beenden kann. Weil die Datenübertragung nicht mit einem Uhrensignal synchronisiert werden kann, ist es äußerst wichtig, die vorgeschriebenen „Formate“ und Zeiten bei der Datenübertragung einzuhalten. Typische oder die vielleicht am meisten verbreiteten One-Wire-Chips sind Temperatursensoren, dann folgen ROM- und EEPROM-Speicherbausteine - man findet hierunter aber auch RTC-Module. Der größte Vorteil dieser Temperatursensoren gegenüber z.B. I2C-Temperatursensoren liegt zweifellos in der Anzahl der erforderlichen Leitungen. Vor allem, wenn man die Temperatur an verschiedenen Stellen, die weiter voneinander entfernt liegen, mit eine Anwendung messen muss, macht es sicherlich einen Unterschied, ob man für die Verbindung zu den Sensoren 4 oder nur 2 Drähte benötigt. Die wahrscheinlich bekannteste Verwendung von One-Wire-ROM-Bausteinen (auch „Registration Number“ genannt) ist die Eingangskontrolle, wie sie oft bei Mehrfamilienhäusern erfolgt. In dieser Ausprägung sind die Chips mechanisch so ausgefertigt, dass sie direkt als Schlüssel verwendet werden können oder aber mit rein mechanischen Schlüsseln ohne Zerstörungsgefahr zusammen aufbewahrt werden können. Im letzteren Fall nennt man sie „iButton“.

● 274

Serielle Schnittstellen 170118.indd 274

24-02-17 16:22


Kapitel 5 • One-Wire

Abbildung 5-2: iButton EEPROM- oder EPROM-Chips finden z.B. oft in Tonerkartuschen für Laserdrucker Verwendung - als Kopienzähler. Wichtig ist in diesem Zusammenhang wieder die einfache mechanische Schnittstelle.

Abbildung 5-3: 1024-Bit-EEPROM-Speicher DS2431 In der One-Wire-Welt ist das Timing sehr wichtig - eigentlich kann man sogar sagen „kritisch“. Hierfür gibt es zwei einfache Gründe: Erstens gibt es (wie schon erwähnt) kein Uhrensignal für die Datensynchronisation, also muss schon „vor dem Gespräch“ eindeutig geklärt werden, wie man ein Gesprächs startet, wie lange eine Null und eine Eins dauern usw... Zweitens gibt es keine Einspeisung für die Endgeräte. Das bedeutet, dass es klar sein muss, auf welche Art und Weise und wie lange der Bus für die Stromübertragung genutzt werden darf und was die maximal erlaubte Dauer der Kommunikation ist, damit der Slave über genügend Energie für die Gespräche verfügt.

● 275

Serielle Schnittstellen 170118.indd 275

24-02-17 16:22


Serielle Schnittstellen

Damit wir in Lage sind, im One-Wire-Land zu kommunizieren, müssen wir uns noch kurz mit der Begrüßung befassen. Ähnlich, wie wir es von der I2C-Kommunikation her kennen, hat auch im One-Wire-Land jeder Slave seine Adresse. Wie wir bereits wissen, ist dies im I2C-Land (jedenfalls in unseren Praxisbeispielen) immer eine Sequenz von 7 Bit, wobei bei manchen Chips ein Teil dieser Adresse hardwaremäßig eingestellt werden kann (durch Verbinden von Ax-Eingängen mit Vcc oder GND). Diese Adresse ist dann möglicherweise für den einen oder anderen Bauteiltyp eindeutig. Für den RTC-Chip DS1307 beispielsweise lautet die I2C-Adresse 1101000 - jeder DS1307 ist über diese Adresse erreichbar. In der OneWire-Welt sieht dies ein wenig anders aus. Hier hat nicht jeder Bauteiltyp, sondern jeder Bausteil seine eigene Adresse. Oder anders ausgedrückt: Zwei Bauteile eines Typs haben zwei verschiedene Adressen. Wenn wir also zwei Temperatursensoren vom Typ DS18S20 haben, kann einer z.B. die One-Wire-Adresse DA*00-08-02-C0-3D-9B--10 besitzen und der andere 88*00-08-02-C0-75-9C--10 (es handelt sich hierbei um meine beiden Exemplare). Diese eindeutige Identifikationsnummer müssen wir verwenden, wenn wir den einen oder den anderen Chip ansprechen möchten. Eine Vereinfachung ergibt sich nur dann, wenn das gesamte One-Wire-Land ausschließlich von einem Einwohner bewohnt wird, auf dem Bus also nur ein Master und ein Slave vorhanden sind. In diesem Fall können wir ohne Anrede mit der Kommunikation beginnen... 5.2. Protokoll-Konventionen 5.2.1. ROM-Code

Wie wir schon wissen, weist jeder One-Wire-Chip eine eigene eindeutige serielle Nummer auf. Man kann sagen, dass diese der MAC-Adresse in der Welt der Ethernets ähnelt. Diese Serial Nummer heißt ROM-Code und ist 64-Bit lang. Der ROM-Code hat 3 Teile: • Der Family-Code ist 1 Byte lang und in der LSB des ROM-Codes gespeichert. Er sagt uns, was der eine oder anderer Chip so treiben kann (z.B. Temperatur messen oder auch etwas anderes). • Die serielle Nummer ist 6 Bytes lang und befindet sich „in der Mitte“ - es ist die eindeutige ID des Chips. • Der CRC (Cyclic Redundance Check)-Code ist 1 Byte lang und als MSB des ROMCodes gespeichert. Dieses Byte wird aus den ersten 7 Bytes (oder 56 Bits) berechnet und kann zum Prüfen der Kommunikation genutzt werden.

Der ROM-Code ist deshalb so interessant, weil es One-Wire-Chips gibt, die nur den ROMCode beinhalten und sonst nichts tun. Ein Beispiel dafür ist der DS2401 - „Silicon Serial Number“. Ein solcher Chip lässt sich als Schlüssel für verschiedenste Anwendungen einsetzen. Bei der Datenübertragung von mehreren Bytes wird immer als Erstes das LSB übertragen und das MSB als Letztes. Bei der ROM-Code-Übertragung wird der Family-Code also als erstes Byte auf dem Bus angezeigt, gefolgt von den 6 Bytes der Seriennummer und abschließend der CRC (als MSB).

● 276

Serielle Schnittstellen 170118.indd 276

24-02-17 16:22


Serielle Schnittstellen

Index Symbols 24LC00 24LCxx

162 162

A Acknowledgement 43 AS1100 27 AT30TSE752 149 AT30TSE758 149 B Basic Circuits

25

D Datenaustausch über I2C 42 DS18S20 27 DS2406 27 DS2482-100S 27

P Parasite Power Circuit 15 PCF8574 66, 68 PCF8575 65 PIC16F1829 28 PIC18LF26K22 28 S Setup 27 Special Circuits 26 SPX2945M3-L-3-3 28 SSP1ADD 39 SSP1CON1 39 SSPxCON1 39 SSPxCON2 40 T TMP100

144

E EasyMaster2016 28 G Grundbausteine 36 Grundfunktionen 25 I I2C-Adresse I2C-Kommunikationsbausteine I2C-Übertragungsraten ICSP

35 43 35 30

J JDEC-Code

26

L LM76

149

M MAX6959A 117 MAX6959B 117 MSSP 39 MSSP1 28 MSSP-Modi 39

● 354

Serielle Schnittstellen 170118.indd 354

24-02-17 16:22


ISBN 978-3-89576-318-2

Elektor-Verlag GmbH 52072 Aachen www.elektor.de

Um den Inhalt des Buches ansprechend zu gestalten, demonstriert der Autor den Buchinhalt an zwei Platinen. Mit diesen Platinen ist es möglich, die in diesem Buch beschriebenen Beispiele auszuprobieren und mit den Schnittstellen zu experimentieren. Beide Platinen basieren auf 8-Bit-PIC-Mikrocontrollern von Microchip.

SERIELLE SCHNITTSTELLEN – I²C, SPI UND 1-WIRE

In diesem Buch werden die Grundlagen der Kommunikation für die drei seriellen Schnittstellen I²C, SPI und 1-Wire vorgestellt. Anhand praxisnaher Beispiele werden die Schnittstellen anschaulich dargestellt und deren Einsatz verdeutlicht. Softwareund Hardwarebeispiele, die man in diesem Buch finden kann, wurden in Assembler für PIC-Mikrocontroller von Microchip realisiert. Die verwendeten Algorithmen und Vorgehensweisen kann man aber auf beliebige Plattform übertragen.

Miroslav Cina ist in der Tschechoslowakei geboren und hat seinen Hochschulabschluss an der Technischen Universität in Bratislava gemacht. Er lebt in der Pfalz und arbeitet seit 15 Jahren als Softwarearchitekt. Seit Ewigkeiten entwirft er verschiedenste (meistens) digitale Schaltungen. Viele davon sind inzwischen in Zeitschriften veröffentlicht worden.

Die serielle Schnittstelle dient dem Datenaustausch zwischen Mikrocontrollern und Peripheriegeräten. Bei einer seriellen Datenübertragung werden die Bits nacheinander – also seriell – über eine Leitung übertragen. Das Wissen um diese seriellen Schnittstellen erweitert die Einsatzmöglichkeiten von Mikrocontrollern und Peripheriegeräten ungemein.

SERIELLE SCHNITTSTELLEN

MIROSLAV CINA

Miroslav Cina

I²C, SPI UND 1-WIRE

SHARE

SERIELLE SCHNITTSTELLEN

DESIGN

I²C, SPI UND 1-WIRE

Miroslav Cina LEARN

DESIGN

SHARE

LEARN

LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SH ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● GN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● S ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.