Atom Nieuws 1999 nummer 1 |
|
pagina 4 t/m 17 |
Atomic Windows
I2C bus
Geschiedenis:
De I2C bus in in de beginjaren 80 ontwikkeld door Philips semiconductors. Het doel was om een eenvoudige manier te bedenken om een CPU met diverse IC’s in een TV-toestel te laten communiceren. Normale computersystemen hebben meestal een bus die byte-breed is om deze taak te verrichten. Dit betekent veel kopersporen op printplaten om de adres- en datalijnen met de diverse IC’s te verbinden. Ook moet elk IC zijn eigen adres-decoder hebben. In massaproducten, zoals TV’s, videorecorders en audioapparatuur is dit een te dure oplossing. De vele kopersporen hebben ook nog eens het nadeel dat de apparatuur veel gevoeliger is voor storingen. Het onderzoek bij Philips Lab in Eindhoven resulteerde in een 2 draads communicatie bus, genaamd I2C.
I2C staat voor Inter-IC bus. De naam zegt het al, een communicatie tussen diverse IC’s.
Heden ten dage wordt de bus voor meer toepassingen gebruikt dan alleen maar audio- en video apparatuur. De bus is algemeen geaccepteerd in de industrie. Er worden nu toetsenborden, muizen, printers, monitoren, enz meer bestuurd. De I2C bus is ook geaccepteerd door diverse grote chipsfabrikanten zoals Xicor, SGS-Thomson, Siemens, Intel, TI, Maxim, Atmel, Analog Devices.
Principe:
In pricipe bestaat de bus uit 2 draden, een SDA (data)- en een SCL (clock) lijn. Over de SDA lijn wordt alle data verzonden en op de SCL lijn worden pulsen gegeven om aan te geven wanneer de data op de SDA lijn geldig is. In de praktijk zal de bus meestal als 4 draads uitgevoerd worden, een SDA lijn, een SCL lijn en 2 voedingslijnen. De SDA- en SCL lijnen zijn beide bi-directioneel omdat de apparaten die aan de bus gekoppeld kunnen zitten zowel data kunnen verzenden en/of ontvangen.
Het IC wat de dataoverdracht start, wordt volgens het I2C protocol als Master gezien en vanaf dat moment zijn alle andere IC's Slaves. In het protocol is ook rekening gehouden met meerdere Masters maar daar ga ik niet verder op in omdat ik hier uitga van de enige echte Master: de Atom!! Alle I2C IC's hebben een uniek adres vast volgens het protocol is hardwarematig is vastgelegd in het IC (in het hoofdstuk 'Adressering' kom ik hierop terug).
Data overdracht:
Dit is te splitsen in 2 delen, nl. data verzenden en data ontvangen. Als eerste zal ik data verzenden nader beschrijven. We kunnen data verzenden in het volgende blokschema samenvatten:
S |
: Start cyclus, reset alle Slaves,
|
Adres |
: Slave adres waarnaar de data verzonden moet worden,
|
WA |
: Wait Acknowledge, de Master wacht op een bevestiging van de Slave,
|
Data |
: 8 Bits data,
|
P |
: Stop cyclus, einde oefening.
|
Niet alle IC's geven na het versturen van de laatste byte een Acknowledge. Dit zal dus gecontroleerd moeten worden met de specificaties van het IC.
Data ontvangen wordt volgens het protocol als volgt samengevat:
S |
: Start cyclus, reset alle Slaves,
|
Adres |
: Slave adres waarnaar de data verzonden moet worden,
|
WA |
: Wait Acknowledge, de Master wacht op een bevestiging van de Slave,
|
Data |
: 8 Bits data,
|
GA |
: Nu geeft de Master een Acknowledge aan de Slave dat de data ontvangen is,
|
NA |
: De Master geeft bij de laatste byte een Not Acknowledge ten teken dat hij gereed is met het lezen van de data,
|
P |
: Stop cyclus, einde oefening.
|
Het is ook mogelijk om zenden en ontvangen te combineren. Dit ziet er volgens het protocol als volgt uit:
Adressering:
Alle I2C IC's hebben een uniek adres wat gedeeltelijk hardwarematig in het IC vastgelegd is. Elk adres bestaat uit 8 bits. Elk van deze bits heeft een betekenis.
Bit 0 |
: |
wordt gebruikt om aan te geven of er data verzonden (Bit 0 = 0) of data ontvangen (Bit 0 = 1) moet worden, |
Bit 1-3 |
: |
worden gebruikt als apparaat nummer, dwz wanneer men meerdere IC's van hetzelfde type wil gebruiken, kan men deze toch een uniek adres geven door er een ander apparaat nummer aan toe te kennen, |
Bit 4-7 |
: |
deze liggen vast en bepalen tot welke functiegroep een IC behoort. |
Samengevat ziet het adres er als volgt uit:
Op de volgende blz staat een overzicht van de meest gebruikte I2C IC's en op de blz daarna de adressering van deze IC's ingedeeld per functiegroep.
Meest gebruikte I2C IC's:
Philips: | LCD Drivers: | PCF 8566 | 96 segment LCD driver |
| | PCF 8568 | LCD Row driver for dot matrix displays. |
| | PCF 8569 | LCD Column driver for DOT matrix displays |
| | PCF 8576 | 160 segment LCD driver |
| | PCD 8577 | 64 Segment LCD driver |
| | PCF 8578 | LCD Row driver for Dot matrix LCD's |
| | PCD 8579 | Column driver for Dot matrix LCD's |
| | SAA 1064 | 4 Digit Led driver |
| I/O expanders: | PCF 8574 | 8 Bit I/O port |
| | PCF 8574A | 8 Bit I/O port different address. |
| | SAA 1300 | 5 Bit high current driver |
| Data convertors: | PCF 8591 | 4 channel ADC + One DAC (all 8 bits) |
| | TDA 8442 | Quad 6 bit DAC |
| | TDA 8444 | Octal 6 bit DAC |
| Memories: | PCF 8570 | 256 byte static ram |
| | PCf 8571 | 128 byte static ram |
| | PCF 8581 | 128 byte EEprom |
| | PCF 8582 | 256 byte EEprom |
| | PCF 8583 | 256 byte RAM + Realtime clock and calendar |
| | PCF 8594 | 512 byte EEprom |
| | PCF 8598 | 1K byte EEprom |
| Clocks: | PCF 8573 | Clock/Calendar |
| | PCF 8583 | Clock/Calendar with 256 byte Ram |
| Master devices: | 8xCL410 | Low power 8051 cpu |
| | 8xC528 | 8051 Compatible CPU with 32Krom 512 byte ram |
| | 8xC552 | 8051 Compatible CPU with 8Krom/UART/ADC/PWM |
| | 8xC751 | 8051 Compatible CPU 24 pin 300 mil's DIL |
| | 8xC752 | 8051 Compatible CPU 28 pin DIL |
| | 68070 | 68000 CPU with MMU/UART/DMA/TIMER |
| Audio / Video: | PCD3311/3312 | DTMF / Tone generator |
| | PCF8200 | Voice synthesizer |
| | SAA1136 | PCM interface |
| | SAA524x | Teletext processor |
| | SAA7191 | S-VHS decoder |
| | SAA7192 | Digital color space convertor |
| | SAA7199 | Digital encoder |
| | SAA9020 | Field memory controller |
| | SAA9051 | Digital TV decoder |
| | SAA9068 | PIPCO Picture in picture system |
| | SAB3035/3037 | Tuning interface |
| | SAF1135 | VPS decoder |
| | TDA4670 | Picture improvement circuit |
| | TDA4680 | Video processor |
| | TDA8421 | HiFi stereo audio processor |
| | TDA8425 | Audio processo rwith loudspeaker channel |
| | TDA8440 | Video switch |
| | TDA8442 | Color decoder interface |
| | TDA8443 | YUV to RGB unit |
| | TDA8461 | PAL / NTSC color decoder |
| | TEA6100 | Fm tuning interface |
| | TEA6300/6310 | Sound fader control |
| | TSA551x | TV Pll synthesizer |
| | TSA6057 | Fm Pll synthesizer |
| Miscellanious: | SAA1300 | 5 bit high current driver |
| | UMF1009 | Frequency synthesizer |
Siemens: | Audio Video: | SDA3312 | TV PLL synthesizer |
| | SDA2121 | TV PLL synthesizer |
| Memories: | SDA2516 | 1K bit EEprom |
| | SDA2526 | 2K bit EEprom |
| | SDA2546 | 4K bit EEprom |
| | SDA2586 | 8K bit EEprom |
| | SDA3526 | 2K bit EEprom with write protection |
| | SDA3546 | 4K bit EEprom with write protection |
| | SDA3586 | 8K bit EEprom with write protection |
Xicor: | Memories: | X24X00 | 128 bit EEprom |
| | X24001 | 128 bit EEprom |
| | X24C01 | 1k bit EEprom |
| | X24012 | 1k bit EEprom |
| | X24C02 | 2k bit EEprom |
| | X24022 | 2k bit EEprom |
| | X24C04 | 4k bit EEprom |
| | X24042 | 4k bit EEprom |
| | X24C08 | 8k bit EEprom |
| | X24C16 | 16k bit EEprom |
| | X24164 | 16k bit EEprom |
De adressering van I2C IC's is opgebouwd uit 2 nibbles, een Low- (bit 0-3) en een High nibble (bit 4-7).
Een paar adressen zijn gereserveerd voor speciale functies.
Low | 000x | 001x | 010x | 011x | 100x | 101x | 110x | 111x |
High
0000 0001 | 0000 general call address
|
0010 |
SAA5240 SAA4700 SAF1134 SAF1135 SAA5245 SAA5246 SAA9041 SAA4700 SAF1134 SAF1135 |
SAA5240 SAA5241 SAA5253 SAA5244 |
SAA5240 SAB9070 SAF1134 SAF1135 |
SAF1134 SAF1135 |
SAA5252 SAA9020 |
SAA9020 |
SAA9020 |
SAA9020 |
0011 |
SAA7250 PCB5020 PCB5021 PCB5032 |
SAA7250 PCB5020 PCB5021 PCB5032 |
SAA1136 PCF1810 |
PCF1810 SAA1770 |
PCF1810 |
|
|
|
0010 |
SAA1137 PCD4430 SAA7194 PCF8574 TDA8444 |
SAA1137 PCD4430 SAA7194 PCF8574 TDA8444 |
PCA1070 PCD3312
PCF8574 TDA8444 |
PCA1070 PCD3312
PCF8574 TDA8444 |
PCD3311
PCF8574 TDA8444 |
PCD3311
PCF8574 TDA8444 |
SAB3028
PCF8574 TDA8444 |
PCD5002
PCF8574 TDA8444 |
0101 0110 0111
|
PCF8576 SAA1064 PCF8574A |
PCF8576 SAA1064 PCF8574A |
PCF8577 SAA1064 PCF8574A |
PCF8577A SAA1064 PCF8574A |
PCF8578 PCF8579 PCF8574A |
PCF8578 PCF8579 PCF8574A |
PCF8566
PCF8574A |
PCF8566
PCF8574A |
1000 |
TEA6320 TEA6320 TDA8526 TDA8420 TDA8421 TDA9860 NE5751 TDA8480 |
TDA8424 TDA8425 TDA8416 TDA8420 TDA8421 TDA9860 NE5751 TDA8480 |
TDA8405 TDA8415
TDA9840 TDA9840T TDA8417 TDA6360 |
TDA6360 |
|
|
|
|
1001 |
TDA8440 TDA8540 PCF8591 |
TDA8440 TDA8540 PCF8591 |
TDA8440 TDA8540 PCF8591 |
TDA8440 TDA8540 PCF8591 |
TDA8440 TDA8540 PCF8591 |
TDA8440 TDA8540 PCF8591 |
TDA8440 TDA8540 PCF8591 |
TDA8440 TDA8540 PCF8591 |
1010 |
PCF8570 PCF8571 PCF8580 PCF8582 PCF8581 PCF8582 PCF8583 |
PCF8570 PCF8571 PCF8580 PCF8582 PCF8581 PCF8582 PCF8583 |
PCF8570 PCF8571 PCF8580 PCF8582 PCF8581 PCF8582 |
PCF8570 PCF8571 PCF8580 PCF8582 PCF8581 PCF8582 |
PCF8570 PCF8571 PCF8580 PCF8582 PCF8581 PCF8582 |
PCF8570 PCF8571 PCF8580 PCF8582 PCF8581 PCF8582 |
PCF8570 PCF8571 PCF8580 PCF8582 PCF8581 PCF8582 |
PCF8570 PCF8571 PCF8580 PCF8582 PCF8581 PCF8582 |
1011 |
SAA7199 SAA7152 PCF8570C |
SAA7191 SAA7186 PCF8570C |
TDA8416 PCF8516 PCF8570C |
TDA2518
PCF8570C |
PCA8510
PCF8570C |
SAA7186
PCF8570C |
SAA9065
PCF8570C |
PCF8570C |
1100 |
TSA5510 TSA5511 TSA5512 TSA5514 TSA5519 SAB3035 SAB3036 SAB3037 UMA1010
UMA1009 TEA6000 TEA6100 TSA6060 TSA6061 |
TSA5510 TSA5511 TSA5512 TSA5514 TSA5519 SAB3035 SAB3036 SAB3037 UMA1010
UMA1009 TSA6057 PCA8516 TSA6060 TSA6061 |
TSA5510 TSA5511 TSA5512 TSA5514 TSA5519 SAB3035 SAB3036 SAB3037 UMA1010
UMA1009 TSA6057 PCA8516 |
TSA5510 TSA5511 TSA5512 TSA5514 TSA5519 SAB3035 SAB3036 SAB3037 UMA1010
UMA1009 |
TSA5510 TSA5511 TSA5512 TSA5514 TSA5519 SAB3035 SAB3036 SAB3037 UMA1010
UMA1009 |
TSA5510 TSA5511 TSA5512 TSA5514 TSA5519 SAB3035 SAB3036 SAB3037 UMA1010
UMA1009 |
TSA5510 TSA5511 TSA5512 TSA5514 TSA5519 SAB3035 SAB3036 SAB3037 UMA1010
UMA1009 |
TSA5510 TSA5511 TSA5512 TSA5514 TSA5519 SAB3035 SAB3036 SAB3037 UMA1010
UMA1009 |
1101 |
TDA8443 PCF8573 TDA1551 |
TDA8443 PCF8573 PCD4440 |
TDA8443 PCF8573 PCD4440 |
TDA8443 PCF8573 |
TDA8443 UMA1000 |
TDA8443 UMA1000 |
TDA8443 UMA1000 |
TDA8443 UMA1000 |
1110 |
SAA7192 |
SAA7192 |
|
|
|
|
|
|
1111 |
1xxx reserved for 10 bits addressing |
Condities op de bus:
Hieronder worden een aantal unieke condities op de bus beschreven:
Start conditie:
Deze conditie initialiseert (reset) alle IC's op de bus. In elk I2C-IC is hardwarematig een schakeling ingebouwd wat het IC reset bij een Start conditie op de bus.
SDA H
L
SCL H
L
|
|
Het IC wat de start-conditie begint, trekt eerst de SDA (data)- en daarna de SCL (clock) lijn laag. Dit IC wordt op dat moment de bus-MASTER. |
Data op de bus:
Deze conditie kent 2 nivo's, hoog (bit=1) of laag (bit=0).
SDA H
L
SCL H
L
|
|
Eerst zet de Master het juiste nivo op de SDA lijn door deze wel of niet laag te trekken. Daarna wordt de SCL lijn vrijgegeven voor een bepaalde periode. Dan wordt de SCL lijn weer laag getrokken voordat het nivo van de SDA lijn weer verandert. |
Dataoverdracht kan er als volgt uitzien:
SDA H
L
SCL H
L
|
|
Stop conditie:
Wanneer deze conditie door de Master op de bus gezet wordt, stoppen alle IC's met dataoverdracht. De conditie ziet er als volgt uit:
SDA H
L
SCL H
L
|
|
De bus-MASTER geeft eerst de SCL- en daarna de SDA lijn vrij. |
Acknowledge:
Deze conditie is een handshake van een IC waarnaar data gestuurd is. Wanneer de Master data verstuurd zal hij wachten op een Acknowledge signaal van de Slave ter bevestiging dat de data aangekomen is. Wanneer de Slave data verstuurd zal de Master een Acknowledge- of Not-Acknowledge signaal geven, afhankelijk of dat er nog meer data verstuurd moet worden. De Acknowledge conditie ziet er als volgt uit:
SDA H
L
SCL H
L
|
|
De SDA lijn wordt laag getrokken voordat de SCL lijn vrijgegeven wordt. De SCL lijn wordt daarna een bepaalde tijd vrijgegeven. Dan wordt de SCL lijn weer laag getrokken voordat het nivo van de SDA lijn weer verandert. |
Not Acknowledge:
De Not-Acknowledge conditie ziet er als volgt uit:
SDA H
L
SCL H
L
|
|
De SDA lijn wordt vrijgegeven voordat de SCL lijn vrijgegeven wordt. De SCL lijn wordt daarna een bepaalde tijd vrijgegeven Dan wordt de SCL lijn weer laag getrokken voordat het nivo van de SDA lijn weer verandert. |
Hardware:
In dit gedeelte wil ik 4 schema's bespreken welke gebouwd en getest zijn, nl. de I2C Interface, een PCF 8573 (Klok/kalender), een PCF 8574 (8 Bits I/O poort) en een SAA 1064 (4 Digit LCD driver).
I2C Interface:
Dit is de koppeling tussen de Atom en de I2C componenten, de daadwerkelijke I2C bus. De opbouw is zeer eenvoudig, alle open-collector lijnen worden met een 74LS05 gemaakt. De SDA en SCL lijnen zijn bi-directioneel en laten we als aparte bitjes op de Atom binnenkomen. Dit zijn dus 2 Input en 2 Output bitjes op de VIA. Verder nog wat pullup weerstanden en de interface is compleet.
Als extra controle kunnen er 2 flip-flops gemaakt worden die de Start- en Stop conditie detecteren. Deze kunnen dan als triggersignaal voor een scoop worden gebruikt waardoor er exact te zien is wat er aan bitjes over de bus gestuurd wordt. De bus wordt 4 draads uitgevoerd, een SDA lijn, een SCL lijn, +5V en de 0V. Het schema staat hieronder.
PCF 8573 (Klok/kalender):
Dit is een IC wat verder alleen maar een kristal en een condensator nodig heeft om te kunnen functioneren. Er zit een klok in waarvan de uren en minuten uit te lezen zijn en een kalender waarvan de maand en datum te lezen zijn. Verder kunnen er alarmen gezet worden voor de maand, datum, uren en minuten. Dit is een comperator die de werkelijke tijd vergelijkt met het ingestelde alarm en als deze gelijk zijn een uitgang stuurt. Verder zit er nog een detectiebitje in voor stroomuitval. Om het klokje door te laten lopen wanneer de spanning uitgezet wordt, is er een mogelijkheid om een batterij/accu aan te sluiten. Het schema staat hieronder:
PCF 8574 (8 Bits I/O poort):
Dit IC bevat 8 bits die zowel als Input als als Output gebruikt kunnen worden. Wanneer er een Input gemaakt wordt, wordt de Interrupt uitgang aangestuurt. Om optimaal gebruikt te maken van dit IC, is het wenselijk om een 5e draad op de bus te hebben,nl. een Interrupt lijn. Dit IC heeft verder geen hardware nodig om te kunnen functioneren. Het schema staat hieronder.
SAA 1064 (4 Digit LCD driver):
Met dit IC kunnen 4 stuks 8-segment displays aangestuurt worden. De helderheid van de displays is ook in te stellen. Verder zit er ook een bitje in om stroomstoringen te detecteren. Dit IC is bv. te combineren met het klok IC waardoor de tijd van de PCF8573 op de LCD display uit te lezen is. Het schema staat hieronder.
|
Bij het testen van de I2C bus hebben we een printje gebruikt waarop een 8 bits I/O expander PCF8574, met 4 drukknoppen en een LED, en een LCD driver SAA1064 met 4 displays geplaatst zijn. Dit is een bestaand printje wat in de industrie gebruikt wordt. Deze printjes maken deel uit van een zogenaamd order-pick systeem. In een magazijn hangt boven elke bak met artikelen zo'n printje. Wanneer er een order verzameld moet worden, wordt dit in het systeem ingegeven. Boven de bakken met de te verzamelen artikelen gaat nu een LED branden en worden de juiste aantallen aangegeven. Wanneer de artikelen uit de bak gehaald zijn, wordt dit bevestigd met een drukknop. Wanneer er meer of minder artikelen uit de bak gehaald worden, wordt dit dmv een '+' en een '-' drukknop ingegeven en daarna bevestigd.
Het systeem werkt met een aantal I2C bussen want op elke I2C bus kunnen maar 8 van deze printjes geplaatst worden. Dit komt omdat de I/O expander maar 3 adreslijnen heet.
Software:
Om I2C hardware te kunnen testen en gebruiken heb ik een aantal programma's geschreven.
Klok/kalender programma:
Het eerste programma is geschreven voor de PCF 8573 Klok/kalender. Hiermee kan men de tijd/datum instellen en uitlezen. De dag wordt berekent uit het jaar, de maand en de datum. De scherm layout is als volgt:
Display programma:
Het volgende programma is bedoeld om via een I/O expander PCF8574 en een display driver SAA1064, een display aan te sturen, een 4-tal drukknoppen teruglezen en een LED aansturen. De lay-out ziet er als volgt uit:
Algemeen besturingsprogramma:
In het algemene I2C besturingsprogramma kan men 10 verschillende apparaten definieren. Voor elk apparaat kan men 10 verschillende commando's van elk 8 bytes opgeven. Bij elke byte is op te geven of het om een Write/Read instructie gaat, een Start/Stop conditie gegenereerd moet worden en of dat er op een Acknowledge gewacht moet worden of een Acknowledge/Not Acknowledge gegeven moet worden. De scherm layout ziet er als volgt uit:
Toekomst:
In de lijst van I2C IC's is misschien opgevallen dat er een tussen staat voor DTMF, nl. de PCD 3311/3312 DTMF/Tone generator. Misschien dat dit iets is om gebruikt te worden voor het DTMF project wat stilligt?
Misschien is het ook wel mogelijk om een netwerk te maken via de I2C bus.
Voor diegene die interesse hebben in print lay-outs van de schema's, of voor eventuele vragen kun je contact opnemen.
Sjaak Geene en Kees van Oss
|