Atom Nieuws 1999 nummer 1                      ../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif                       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:

i2c-1.png

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:

i2c-2.gif

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:

i2c-3.gif

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:

i2c-4.gif

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 856696 segment LCD driver
  PCF 8568LCD Row driver for dot matrix displays.
  PCF 8569LCD Column driver for DOT matrix displays
  PCF 8576160 segment LCD driver
  PCD 857764 Segment LCD driver
  PCF 8578LCD Row driver for Dot matrix LCD's
  PCD 8579Column driver for Dot matrix LCD's
  SAA 10644 Digit Led driver
 I/O expanders:PCF 85748 Bit I/O port
  PCF 8574A8 Bit I/O port different address.
  SAA 13005 Bit high current driver
 Data convertors:PCF 85914 channel ADC + One DAC (all 8 bits)
  TDA 8442Quad 6 bit DAC
  TDA 8444Octal 6 bit DAC
 Memories:PCF 8570256 byte static ram
  PCf 8571128 byte static ram
  PCF 8581128 byte EEprom
  PCF 8582256 byte EEprom
  PCF 8583256 byte RAM + Realtime clock and calendar
  PCF 8594512 byte EEprom
  PCF 85981K byte EEprom
 Clocks:PCF 8573Clock/Calendar
  PCF 8583Clock/Calendar with 256 byte Ram
 Master devices:8xCL410Low power 8051 cpu
  8xC5288051 Compatible CPU with 32Krom 512 byte ram
  8xC5528051 Compatible CPU with 8Krom/UART/ADC/PWM
  8xC7518051 Compatible CPU 24 pin 300 mil's DIL
  8xC7528051 Compatible CPU 28 pin DIL
  6807068000 CPU with MMU/UART/DMA/TIMER
 Audio / Video:PCD3311/3312DTMF / Tone generator
  PCF8200Voice synthesizer
  SAA1136PCM interface
  SAA524xTeletext processor
  SAA7191S-VHS decoder
  SAA7192Digital color space convertor
  SAA7199Digital encoder
  SAA9020Field memory controller
  SAA9051Digital TV decoder
  SAA9068PIPCO Picture in picture system
  SAB3035/3037Tuning interface
  SAF1135VPS decoder
  TDA4670Picture improvement circuit
  TDA4680Video processor
  TDA8421HiFi stereo audio processor
  TDA8425Audio processo rwith loudspeaker channel
  TDA8440Video switch
  TDA8442Color decoder interface
  TDA8443YUV to RGB unit
  TDA8461PAL / NTSC color decoder
  TEA6100Fm tuning interface
  TEA6300/6310Sound fader control
  TSA551xTV Pll synthesizer
  TSA6057Fm Pll synthesizer
 Miscellanious:SAA13005 bit high current driver
  UMF1009Frequency synthesizer
Siemens:Audio Video:SDA3312TV PLL synthesizer
  SDA2121TV PLL synthesizer
 Memories:SDA25161K bit EEprom
  SDA25262K bit EEprom
  SDA25464K bit EEprom
  SDA25868K bit EEprom
  SDA35262K bit EEprom with write protection
  SDA35464K bit EEprom with write protection
  SDA3586 8K bit EEprom with write protection
Xicor:Memories:X24X00128 bit EEprom
  X24001128 bit EEprom
  X24C011k bit EEprom
  X240121k bit EEprom
  X24C022k bit EEprom
  X240222k bit EEprom
  X24C044k bit EEprom
  X240424k bit EEprom
  X24C088k bit EEprom
  X24C1616k bit EEprom
  X2416416k 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.

Low000x001x010x011x100x101x110x111x
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
i2c-5.gif 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
i2c-6.gif 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
i2c-7.gif

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
i2c-8.gif 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
i2c-9.gif 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
i2c-10.gif 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.

i2c-11.gif

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:

i2c-12.gif

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.

i2c-13.gif

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.

i2c-14.gif

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:

i2c-15.gif

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:

i2c-16.gif

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:

i2c-17.png

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

../../../images/back.gif ../../../images/exit.gif ../../../images/forward.gif