|
|
|
|
|
(c) 1995-2000 V.Himpe
This article is a collection of information sources on the I2C Bus. The document exists as a HTML file and as a iSilo document for Palm (tm) based organisers. You are free to use , copy , distribute and disclose the contents of this faq to anyone provided no money is asked for the copy. Use of information in this faq is solely at the users risk. No liability will be accepted for any damage or loss resulting from the use or abuse of information contained in this document.
Hi and welcome to the latest edition of the I2C FAQ. Over the years I have been supporting people in their attempt to master this bus. I have collected a total of over 500 e-mails with questions ranging from beginner level to things that even I could not solve in 1-2-3. I Will try to summarize the knowledge I obtained in this revision of the FAQ. I Would like to thank all the people who have bombarded me with interesting stuff and questions about I2C. I am also happy that my little knowledge could help. Vincent September 1st 2000.
I put this FAQ together in response to my own frustration in searching for information about I2C. I have been playing with the bus for some time and, although I am not an expert on this matter, i think my, and other people's, experiences with the I2C BUS can solve common problems. Back to Main Index
How can I contribute to this FAQ? If you have any suggestions or additions please inform me or the future maintainer of the FAQ.You can contact me by e-mail : vincent.himpe@pi.be ( valid until 1 Jan 2001 ) after that E-mail will most likely no longer be possible. I hope that those of you who know of interesting items for this FAQ
will share with everyone. A good amount of stuff is turning up thanks to
everyone's help. If you have a website you can put the FAQ or a link to
the FAQ online there.
What newsgroups will it be posted in? This FAQ has been posted a last time to the following newsgroup: sci.electronics.design Back to Main Index
May I distribute this FAQ ? I am putting no restrictions on the use of this FAQ except - It must be distributed in its entirety with the copyright notice, and no financial gain may be realized from it. After all, I have spent, and lot of time on this. The only thing that I intend to gain from it is more information on I2C. For this reason I have appended a copyright statement to the end of this FAQ. I feel pretty silly doing this, but I just want to protect myself. The copyright does not limit the use of this FAQ for noncommercial purposes. I hereby give my permission to one and all to pass this FAQ around and post it wherever you want - as long as it is not for financial gain. You are allowed to distribute portions of the FAQ as long as you incorporate
the following note. 'Taken from The I2C FAQ' and provide
a link to its storage on the internet.
The I2C bus was developed in the early 1980's by Philips semiconductors.Its purpose was to provide an easy way to connect a CPU to peripherial chips in consumer applications (radio's, TV-sets etc). Normal Computer systems use ByteWide buses to accomplish this task. This results in lots of copper tracks on PCB's to route the Address and datalines. Not to mention a bunch of address decoders and glue logic to connect everything. In mass production items such as TV-sets, VCR's and audio equipment this is not acceptable. Complex circuits often need multilayer boards, and these are simply too expensive for household goods. Furthermore lots of control lines implies that the systems is more susceptible to disturbances by EMC and ESD.The research done by Philips Labs in Eindhoven (The Netherlands) resulted in a 2 wire communication bus called the I2C bus. I2C is an acronym for Inter-IC bus. Its name literally explains its purpose: to provide a communication link between Integrated Circuits. Nowadays the extent of the bus goes much further than Audio and Video equipment.The bus is generally accepted in industry. Offsprings like D2B and ACCESS have made an attempt to find their ways into computer peripherals like keyboards, mice, printers, monitors, etc... . However they have been successed by the USB bus. Amazingly the USB bus steals some technology frmo I2C. The basic communication idea and adressing scheme is based on I2C. The I2C BUS has been adopted by several leading chip manufacturers like
Xicor, SGS-Thomson, Siemens, Intel, TI, Maxim, Atmel, Analog Devices.
I2C Bus protocol The BUS physically consists of 2 active wires and a ground connection. The active wires, SDA en SCL, are both bidirectional. Where SDA is the Serial DAta line and SCL is the Serial CLock line. Every component hooked up to the bus has its own unique address whether it is a CPU, LCD driver, memory, or complex function chip.Each of these chips can act as a receiver and / or transmitter depending on its functionality. Obviously an LCD driver is only a receiver ,while a memory or I/O chip can both be transmitter and receiver. Furthermore there may be one or more BUS MASTER's. The BUS MASTER is the chip issuing the commands on the BUS. In the I2C protocol specification it is stated that the IC that initiates a data transfer on the bus is considered the BUS MASTER. At that time all the others are regarded to as the BUS slaves. As mentioned before, the IC bus is a Multi-MASTER BUS. This means that more than one IC capable of initiating data transfer can be connected to it. As MASTERs are generally microcomputers let's take a look at a general 'inter-IC chat' on the bus. Lets consider the following setup :
The CPU will issue a START condition (see further on for description of all these conditions). This acts as an 'ATTENTION' signal to all of the connected ic's. ALL IC's on the bus will listen to the bus for incoming data. Then the CPU sends the address of the device he wants to address.This takes 8 clock pulses. At this moment in time all IC's will compare this address with their own.If it doesn't match they simply do nothing and wait until the bus is released by the STOP condition.If the address matches however the chip will produce a responce on the ACKNOWLEDGE signal of the CPU. The ACKNOWLEDGE signal is issued by the CPU.When the chip whose address matches sees the ACKNOWLEDGE on the bus it Pulls the data line LOW. This is an indication to the CPU that there is a chip with the wanted address on the bus. Now the CPU can start transmitting or receiving data In our case the CPU will transmit data.When all is done the CPU will issue a STOP condition. This is a signal that the bus has been released and that the IC's may expect another transmission to start any moment. We have had several states on the BUS right now : START, address
,ACKNOWLEDGE ,DATA ,STOP. These are all unique conditions on the BUS. Before
we take a closer look into these I will talk about the hardware of the
BUS. This is necessary to understand what is physically going on.
Hardware layout of the I2C bus. As stated before the BUS consists of 2 active signal lines and a ground potential. Internally in the chip the bus looks like this :
The bus interface is built around an input buffer and an open drain or open collector transistor. When nothing happens the bus lines are in the logic HIGH state. Note here that an external PULL-UP resistor is neccessary. This is an error that most beginners make. To put something on the BUS the chip drives its output transistor, thus pulling the BUS to a LOW level. When the bus is IDLE ( nothing going on ) both lines are HIGH. The HIGH state is defined as NOT LOW (obvious isn't it). What i mean here is that you cannot set a voltage on the HIGH Level. It depends on the supply voltage of the connected IC's.However as this is mostly 5 Volts you can say that HIGH is 5 volts and LOW 0 volt. Nowadays the 3.3 volt ic's are emerging rapidly. It's clear that in this case the high level will be 3.3 volts. The latest revision of I2C provides a means of interfacing mixed voltage circuits. The nice thing about this concept is that it has a 'built-in' bus mastering technique. If the bus is 'occupied' by a chip that is sending a 0 then all other chips loose their comm's capability. More will be explained about this further on in the Faq. However the open collector technique has a drawback too. If you have
a long bus this will have a serious effect on the speed you can obtain
. The higher this RC constant the slower you can go. This is due
to the effect that it influences the 'sharpness' of the edges on the I2C
bus . At a certain point the chip will not be able to distinguisch clearly
between a logic 1 and 0.
To overcome this problem , Philips has developed an Active I2C terminator. This consists of twin charge pumps. You can look at this device as a dynamic resistor. The moment the state changes it provides a large current (low dynamic resistance) to the bus. Doing this it can charge the parasitic capacitor very quickly. Once the voltage has risen above a certain level the high current mode cuts out and the output current drops sharply.
I Have already mentioned some things like START, STOP, ACKNOWLEDGE, SLAVE, MASTER and so on. In this section these things get explained. When reading this you must keep the following 2 things in mind.
Start And Stop condition. A START condition looks like this:
The bus is in idle mode when both Data and Clock line are high. The chip issuing the Start condition ( the bus MASTER ) first pulls the SDA (data) line low and then pulls the SCL (clock) line low. A STOP condition is just the mirror of the above.
The start condition acts as a signal to all connected IC's that something
is about to be transmitted on the BUS. All the devices on the bus will
go to listen mode and check the incoming data for a match against their
address on the bus. The Stop condition tells the connected chips
that the message has been completed and that the bus is free to use.
Putting something on the BUS Putting a bit of any kind on the bus looks like this : First the MASTER sets the data line to the appropriate level by pulling or not pulling the SDA line low. Then it releases the SCL line for some time and pulls it low again. Now it can change the state of the SDA to the level required for the next bit and the process continues all over again. The DATA must stay valid during the HIGH level of the CLOCK pulse. If the data chenges while the clock line is high this will bee seen as either a START or STOP condition occurring ! ( depending on the direction of change ). Using the above information ,a transfer could look like this :
Your cpu is in the middle of a transaction and gets an interrupt. It
can process the interrupt first and continue its message later on without
any problem. (try doing that on RS232 !). Since there is no minimum clock
speed set you can have the communication running at whatever speed you
can handle.
Addressing a SLAVE. EVERY byte put on the BUS MUST be 8 bits long. (8 clock pulses).
A byte is always sent with the MSB first. The number of bytes that can be transmitted in one data 'telegram' is unrestricted. ('Data telegram' is everything going on on the bus between a START and STOP condition). However it is allowed to end a transmission any time by sending a STOP condition. Even when you are only 4 bits far in your telegram. Actually what happens is that the STOP condition resets the bus control logic of all connected chips. They start looking for a START condition again. Back to Main Index
Waiting for ACKNOWLEDGE. When a chip is being addressed or has received data it will issue an ACKNOWLEDGE pulse. Therefore the MASTER must first (1) release the DATA line (set it to high level). The Slave performing an ACQ will pull the DATA line low (2) Shown as the fat line on the image below.
The MASTER will now send a clockpulse over the SCL line(3). When the clock pulse has been completed ( SCL goes low again ) the slave will release the DATA line(4). Now that the MASTER knows that the SLAVE is actually there it can continue. Generally the MASTERs (mainly CPU's running software) use a timeout value. When no chip is responding after some time they issue a STOP and then continue with their work. This prevents your software from locking up if for some reason the addressed chip is not replying. Concerning the SLAVE pulling low the SDA line it is so that generally the addressed IC will already have pulled the SDA line low even before the MASTER has set the clock HIGH. It is the falling edge of the last clockpulse that triggers the slave. In the real life it is good practice to actually look during the high level of the CLOCK if the SDA is being pulled LOW or is LOW. Some chips need some time to process the address before they can respond by pulling the SDA low. This can be the fact when the addressed SLAVE is another CPU or an EEprom. Suppose the following : You address a SLAVE CPU. But just before the SLAVE CPU can pull the SDA low it has to process some interrupt occuring.If the transfer issuing CPU would look to the SDA line immediately it would see a HIGH level. Thus it would look like the SLAVE is not responding. The Same goes for EEproms. Since storing data to EEprom cells takes some time the ACKNOWLEDGE is used to indicate that the programming has been completed. So after the last bit has been transferred the EEprom starts writing the received data into its array. It leaves the SDA line in the LOW state until this action has been completed. this means that after the ACQ clockpulse the slave keeps the SDA line LOW !. It is the task of the masdter to wait now until SDA becomes high before continuing. this process might seem to violate the I2C bus spec but actually it doesn't. This process is called synchronisation. ( see the topic explaining this process ). I have once spend a whole day figuering this one out !.The system once in a while did not work like it should have because the addressed device was not capable of generating an ACKNOWLEDGE in time. The best way to do an ACKNOWLEDGE , in my humble opinion,is like this:
Put the SCL high, wait some time (your TIMEOUT value), then check if SDA
is LOW. If it is LOW - > The chip is there. If it is HIGH -> The chip isn't
there. When removing the ACQ clockpulse check if the SDA line effectively
goes high. If not : the chip is in process of writing internally.
What happens next ? Now that the SLAVE has been addressed and responded to the ACKNOWLEDGE the rest of the telegram (until we issue a STOP) depends solely on the addressed chip. You can just send one or more bytes to the chip or receive one or more bytes from the chip. It can even be that you first write something and then read something from the chip. Back to Main Index
Writing One or More Byte's to a Slave. After the Device has responded with an ACKNOWLEDGE (see above) you just send another 8 bits on the bus. Now you have to wait again for the SLAVE to ACKNOWLEDGE. If you are through you issue a STOP command and then the bus is released again. If you need to send more then you just send another 8 bits and wait for an ACKNOWLEDGE. And so on and on and on. I figuered out in real life that on the last transmitted byte you do not have to wait for the ACKNOWLEDGE. You can directly issue a STOP command. Apparently there are some chips that do not generate an ACKNOWLEDGE here !. Theoretically they should generate an ACKNOWLEDGE but for some reason they don't. The best way is as follows : after you have transferred your last byte just to set the SCL high , wait some time , take it low and then issue a STOP command. There is an exception though. Devices like serial EEproms use the ACKNOWLEDGE for storing the information
in the Memory array.They do not pull the SDA line low until the programming
has been completed.In that way the MASTER has a way to know if the data
has been written succesfully.Storing data in EEprom memory is rather slow.So
by monitoring the SDA line the CPU knows when the chip has completed the
WRITE to its memory array.
Looks kind of the same as a byte write. The difference is the handling of the SDA line and the ACKNOWLEDGE. The MASTER generates a START , transmits the device address and waits for an ACKNOWLEDGE. So far so good. Now the MASTER has to RELEASE the SDA (data) line. The SLAVE will pull it low when needed. On every clock pulse , that the MASTER generates ,the SDA line will be in the state set by the SLAVE. When all 8 bits have been read the MASTER must GIVE the ACKNOWLEDGE or to the SLAVE or stop the transmission. To give an acknowledge to a slave the master holds the SDA line low and gives a clockpulse on SCL. To stop stransmission you simply issue a stop condition on the bus : Keep SCL and SDA low. Now make SCL high , and then make SDA high. If you give an ACQ pulse to the slave you have to read another byte. Immediately after the ACQ the slave will take hold of the SDA line and you might no longer be able to give a stop before clocking out the next 8 bits. Note: Here the FAQ has been greatly modified. In the previous FAQ the text caused a lot of confusion.
Determining the SLAVE Access mode Now there is one thing i haven't told you yet. How does your SLAVE know whether you want to read from or write to it ? Thats an easy one. This is beeing determined by the SLAVE address. Each byte consists of 8 bits. The 8th bit in the SLAVE address has a special meaning. When it is set to 0 it means you want to write to your SLAVE. When it is set to 1 it means that you you want to READ. You could see this as follow. The Even addresses are WRITE addresses, the ODD addresses are READ addresses. Each device has a consecutive WRITE and READ address. Example : a PCF8574 General purpose 8 BIT I/O port.
Back to Main Index
The Combined data format. This is a format generally used by memory devices. Suppose you have an 128 byte deep memory on the bus and you want to read the 84th byte. Normally you would have to read the first 83 bytes before getting what you want. This takes too much time and occupies the bus. In this case there are two possibilities. You first write to the SLAVE address a byte which tells it on which location you want to read. Then you start a read operation. That is one way of doing it. A more elegant way to do this is using a combined mode telegram. --------------------------- |S|AS WRITE|WA|SEND BYTE|.. --------------------------- ------------------------- ..WA|S|AS READ|WA|READ|P| ------------------------- To start this sequence you access the chip in write mode. AS WRITE = Address Slave in WRITE mode (even address). Wait for ACKNOWLEDGE and WRITE a byte. This byte is beeing treated by the memory as the location pointer. (that is how i2C memories work). Then you wait for an ACKNOWLEDGE by the SLAVE and you generate another START condition. Now you send the SLAVEs READ address ( ODD address ) Wait for ACKNOWLEDGE and you receive the data byte. From now on you are in standard READ mode. So you can now either send a STOP or continue reading from your SLAVE by giving an ACQ to the slave and clocking out the next byte. All memory devices auto-increment their location pointer. Now you can even go one step further and generate another START and then address the SLAVE as write. Send a new Data byte (which acts on the location pointer), send another start, enter read mode etc ...... This combined mode is really a very flexible means of addressing complex components. This may look very messy. But it has its pro's and con's: PRO: If you have 2 CPU's on your bus which could want to take the bus this will assure you that you will be able to continue your actions on the bus without interference from the other CPU. Remember that when you have generated a START and have sent the SLAVE address the other CPU too will be waiting until a STOP appears on the bus. So he will not try to put something on the bus.There could be a risk involved using normal READ and WRITE operations Picture this situation : CPU 1 accesses the MEMORY and sets the location pointer to 84 and issues a STOP condition. Now the BUS is FREE. CPU 2 sees this and thinks : okay my turn. He sets the location pointer to 92 because he wants to do something at that location. Now the bus is free again. CPU 1 says : aha ! the bus is free. Time to write for me. Now the data will land on location 92 and not on location 84 as it should have been. So : If you are dealing with memories on a Multimaster bus always use this last method. It keeps you out of trouble. CON: If you have lots of operations to do you can create a bottleneck situation. The other CPU could be waiting and waiting for a chance to have his turn on the bus. But is you don't have a MultiMaster environment this all is not necessary. Congratulations you have reached the EXPERT grade. :-)
When CPU 1 issues a START and sends an address the other one will back off. Because of the fact that if the address does not match his own address he has to wait until the bus is free. (STOP condition). So far no problem. But as Murphy is, as usual ,always around. It's when you least expect it that it goes wrong.Fortunately the BUS setup helps us out here. When you (as a MASTER ) change the state of a line to HIGH , you MUST always check that it has gone to the HIGH level. If it hasn't : BACKOFF ! it's occupied !. Wait for a STOP to occurr and then retry. What could happen is that the TWO CPU's start communication on the same moment in time.Since it is an open collector/drain bus they can only PULL the line low. They cannot force it HIGH. (they can only leave it HIGH by not turning on their output transistor). So they start transmitting. And all goes well as long as they both are
asserting the same levels. (during START it's okay.They are doing the
same) Then they start transmitting data. for the first couple of bits all
goes well until suddenly diaster strikes. Bit 3 is different !. CPU1 wants
to send a 0 while CPU2 wants to send a 1.
Now CPU 1 has pulled SDA LOW. CPU 2 leaves SDA open. Remeber that you cannot force the Line HIGH It is the job of the pull-up resistor to do that. Since they are both running clean and good written code they are testing what they have put on the BUS. CPU 1 sees that he has written a 0 and says 'okay for me'.. CPU 2 on the other hand sees that the line is LOW while he has left it HIGH ! so he knows that by now someone else has taken control. Time to BACK OFF !. Now in an ideal world CPU2 would do even more !. When he knows for sure
that this is the first byte after the START generation he will switch from
tranmist to receive mode !. Why ? Well simple: CPU1 might be trying to
talk to CPU2 !
So from the above story we can conclude that is the one that has its line LOW that always wins. The One wich wanted the line to be HIGH when it is beeing pulled low by the other looses the BUS.We call this a 'loss of arbitration' or BACK-OFF. When a BACKOFF situation is generated it is good practice to have the cpu, that has to BACKOFF, wait for a STOP condition to appear on the bus.The other one is still busy transmitting. The above example showed a situation where the two CPU's were in perfect sync with each other. In most situations this will not be the case. But even then the arbitration will still work. Suppose one of the CPU's missed the START condition and still thinks nothing is going on ... , or it came just out of reset and wants to start talking on the bus. These are real-life cases that WILL happen in a mulitmaster environment. ( remember Murphy's Law !) . Consider a multimaster system that has just been powered up. You will not know which cpu will come out of reset first. So actually this mechanism does not only do arbitration , it is also very effective at ensuring that the information beeing sent is not lost or corrupted !. The message from the winning CPU is not distorted in any way. If you struggled trough all of this , and the previous chapters then
you are ready to face the world of MultiMaster I2C
Bus synchronisation The i2c protocol also includes a synchronisation mechanism. This can be used between masters. However to my knowledge there are no chips that use this mechanism. This must be implemented in software. When a slower slave is attached to the bus then problems may rise. Suppose
the following : The master reads a byte from a slave. Lets say an A/D convertor.
The slave needs some time to make a conversion. The master adresses the
slave in read mode
In a normal ACQ sequence the slave will pull the ACQ line low immediately after the 8th clock pulse and before the ACQ clockpulse. The master will send a clockpulse , and sample the SDA line during this pulse. If SDA is low it means that the slave aknowledges the information sent. When the ACQ clockpulse is removed the slave releases the SDA line. Now lets suppose that the slave has detected his home adress. It starts a conversion and waits until this conversion is done before giving acknowledge.That way the master can read the result immediately after the Acknowledge sequence. Of course the master would have timed out and considered the slave not to be present on the bus. Now the synchronisation meachanism can come in handy. The Slave can pull the SCL low as long as needed. The master is then not able of giving the ACK clockpulse because it cannot raise the SCL line.Of course the master software must check this state. This is the routine the master must execute for a synchronisation aware Wait_for_ack sequence What happens is this : (in our theoretical model) The master has sent the last bit of the slave adress on the bus. The slave recognises its adress and pulls the SDA line low. ( it wants to acknowledge because it has detected its adress ). At the same time it starts the A to D conversion and pulls the SCL line low. The master now wants to start the Wait_for_ack sequence. So it makes SDA high.( Never minding the Slave holding it low ) Now the master releases the SCL line.When testing the level of the SCL line the master will see that it is still low.This is due to the fact that the slave is holding the SCL low.So the master enters a loop that runs until the SCL line effectively turns high. The moment the slave has completed the conversion it releases the SCL line. The master detects that the SCL has become high and checks the SDa line. Since the slave turned it low long ago it sees a valid acknowledge. The master will now begin to read the result of the conversion. This technique is used by the serial EEproms on I2C. There are a number of drawbacks involved when implementing this. If the bus gets stuck due to an electrical failure of a circuit the master can go into deadlock.Of course this can be handled by timeout counters. Another drawback is speed.The BUS is locked at that moment. If you have rather long delays (long conversion time in our example above) then this penalizes the total bus speed a lot. The existing A/D convertors do not use this synchronisation system. They use the following technique :
The Synchronisation mechanism is nothing else than a sort of handshaking. In a multimaster environment there is the risk that , when the 2 masters are talking to each other,using this handshake routine, they go into deadlock. Master 1 attemps to adress master 2. He succeeds.But during the ACK sequence master 2 has to service an interrupt therefore he keeps SCL low. Master 1 will now wait for the SCl line to come high. Master 1 times out (because for some reason master 2 is still busy). Master 1 completes transaction and starts a retry. In the mean time master 2 came on line again and released the SCL line but is still pulling the SDa line low. Result Master 1 cannot start a new transmission. Because it will get a backoff situation ( bus is not free ).Master 1 will get stuck in an endless retry routine. While master 2 will be endlessly waiting for master 1 completing the ACK. Result : System in complete deadlock. When using the synchronisation mechanism you must take care to avoid
all possible causes of a deadlock.This makes the interface driver very
complex.
address R/W
This implements that all addresses below 16 are reserved for special
purposes. The reason behind this is that there are other buses around.
Using this scheme you can connect device that uses a different bus to the
I2C bus !. It is possible to put SPI, I2C, uWIRE and CBUS devices on the
same I/O pins of your CPU. Since all buses different to I2C use 3 lines
you can
How this exactly works would lead us too far. Maybe in the future someone will explain this. If somebody out there has experience with these other buses ? Could be interesting.
The general call address is received by all IC's on the bus. If there is an IC out on the bus that can process this address it will respond by generating an ACKNOWLEDGE. See Datasheets for info on which IC use them and why. You could use this to invoke some special command in a MultiMASTER environment. (Like reboot all CPU's or whatever. Since all chips will respond to it ,it can be used for this purpose. However take care not to mess up anything else.) There have been determined some actions on receipt of the General call address. When the second Byte in a telegram containing a general call is :
------------------------- |S|00000000|A|yyyyyyy1|.. ------------------------- ---------------- .. A|Databyte|P| ---------------- Where yyyy yyy is its own address. What will happen is that the MASTER CPU will see the General call address and see that the device with address yyyy yyy has something to tell to the CPU. It will read the next byte. In our case the CPU will know that keyboard controller yyyyyyy has detected a key and that the scancode of this key is contained in the received databyte. All other codes have not been assigned. All I2C ic's are designed to ignore them. So you are free to use them for whatever. (I generally use them to debug MultiMASTER modes).
As the chips designed for an I2C bus can function on different Supply voltages the following levels have been set.
Back to Main Index
In the FAST mode the physical bus parameters are not altered. The protocol,Bus levels,Capacitive load etc.. remain unchanged. However the datarate has been increased to 400 Kbit/s. To accomplisch this task a number of changes have been made to timing. Since all CBUS activities have been canceled ,there is no compatibility anymore with CBUS timing.The development of IC with CBUS interface has been stopped. The existing CBUS ic's are being taken out of production. The input of the FAST mode devices all include Schmitt triggers to suppress noise. The output buffers include slope control of the falling edges of the SDA and SCL signals.If the power supply of a FAST mode device is switched off the BUS pins must be floating so that they do not obstruct the bus. The pullup resitor must be adapted. For loads up to 200 pf a resistor is sufficient.For loads between 200pf and 400pF a current source is preferred.
Due to the increasing popularity of the I2C bus the address space is nearly exhausted.This starts posing problems for people currently in the phase of designing a new I2C compatible IC. Therefore the I2C standard has been adapted. A chip that conforms to the new standard receives 2 address bytes. The
first consists of 5 * a ONE ,the 2MSB's of the address and the Read/Write
bit. The second byte contains the LSB's of the address.
Q&A section
What is the maximum distance of the bus ? This depends on the load of the bus and the speed you run it at. In typical applications a few meters (3 to 4). Better: The maximum capacitive load has been specified (electrical Spec's in this FAQ). If you run at a lower clock frequency then you could go further. If you are careful in routing your PCB's and cabling then you can take it further.I once had an application that had a total of about 100 meter cable in it. The entire system was clocked on something like 500 Hz. I used twisted pair cable and twisted SCL with GND and SDA with VCC. No problem.The systems is now up and running for over 5 years. If you need to go far at high speed then you can use an active current
source . Philips has a standalone product for this purpose. Or you could
build one yourself. Another thing to be taken into account is the amount
of noise picked up by long cabling. This
A last thing to be taken care of is the bus termination. Long lines will cause refelections. These reflections can cause 'ghost signals' to appear.This kan be overcome by using a charge pump mechanism like the Philips device has. See also next topic. I want to extend it ''by the book''. Is there something like a Buffer for I2C ? Yes indeed this exists. Philips manufactures a special chip to buffer the bidirectional lines of the I2C bus. Typically this is a current amplifier. What it does is force current into the wiring (a couple of mA). That way you can overcome the capacitance of long wiring. Philips P87B715
However You will need this component on oth sides of the line.The charge pump in this devices can deliver currents up to 30mA. And that is way too much for a normal I2C chip to handle.With these buffers you can handle loads up to 2nF. The charge amplifier 'transforms' down this load to a 200pF load which is still acceptable by I2C components. Another possibility is to make such a charge pump yourself. This is fairly easy and can be accomplished by 1 chip and a few resistors. See a bit further on for details. Can i isolate an I2C bus ? (using optocoupler or whatever) This is possible. The circuit is rather complex due to the bidirectional
nature of the I2C BUS. Actually there are a number of solutions here. One
has appeared in electronic design new , one is included in the elektor
book on i2c and yet another one has been published in an issue of Elektor.
See the end of this FAQ for information on these books.
1: 270 Ohm
A couple of remarks. Since the speed of the I2C bus can be rather high it is reommended to use a fast optocoupler.However this circuit will not work on speeds higher then 10KHz.A 6N139 will do the job in all cases. The 2 PNP and 2 NPN transistors can be any standard type. Like 2N2219 and 2N2222 (USA) or BC547 and BC557 (EUROPE). How does it work ?
Now lets look what will happen if we send a 0. The first transistor
5 will be turned on. Thus the led connected to it will start emitting light.This
results in the fact that it's matching transistor will turn on . The transistor
connected to the Emittor of will be turned on too. The output line is now
beeing pulled low via resistor 3' . This low level would turn on the PNP
transistor. This would result in The other optocoupler to light , it's
transistor to turn on etc etc .. The circuit would go into a lock-up.
What if i don't want to emulate the bus by software or if i don't have an I2C interface on my system ? Is there something like an I2C controller ? Yes indeed. There is a special chip to do the I2C interfacing. The PCD8584 or PCF8584 incorporate a complete I2C interface. These chips are designed in such way that they can interface to almost any microcontroller or computer around. I am puzzled on how to generate a repeated start condition. I make the SCK high and my device pulls SDA low to acknowledge. So far no problem but how do i make a new start now ?. The device is pulling SDA low. ! First you have to complete you ACK cycle. To do this you must make SCL low again. The slave will release the dataline when it detects that SCL went logic low. Now you can issue a stop command. To do this you make the SCK high again and then pull low the SDA line. This is the confusing part of the procedure. Normally one would suspect that by making the clock high again you will be clocking in the first bit of a new byte. As a matter of fact that is the case. But since the chip will detect a START condition this operation gets cancelled. Is it okay to abort an on-going transmission any time. According to the specification this !should! work. It depends on the
layout of the component. A real I2C compatible ic will be able to
handle this. You should test this before you use it.
When a START is detected all internal operations are cancelled and the chip will compare the incoming data with its own address. When a STOP is detected ALL chip's on the bus will reset their internal logic to IDLE mode. This is also used to cut power consumption. When a STOP is detected all logic is shut down except for the START detector. When a start is issued on the bus the START detector will 'wake-up' the rest of the internal logic. Do i need to give the ack in read mode on the
last byte.
This is a question that got me puzzled .Indeed this is a bit strange. Normally if you have read the last byte in a chip and generate an ACK the chip should do nothing anymore. So the bus is clear for you to create a STOp condition. Apparently there are some chips that start transmitting data again. Digging in to to spec showed an error in my FAQ. On the Last byte READ you must generate a NACK (NOT Acknowledge). Check out the description of the READ mode I read the SDA and SCL are bidirectional.Why does the clock line need to be bidirectional ? The clock line needs to be directional when using a MULTIMASTER protocol and when using synchronisation protocol. When you are using only one Master then this is not required since the clock will always be generated by the Master and you only have one on the BUS. If you run Multimaster then this changes.The Master must be able to receive data from the other master. At that time it must be able to check the Clock line too. For more information about bus synchronisation check out the topic dedicated to it. Can i monitor an I2C bus in some way ? This is possible. There are a few commercial I2C monitor / debuggers around that can do this.Information on these cards can be found elsewhere in this Faq There is another possibility to do this. By using the PCF 8584 chip from philips. This is a universal CPU to I2C interface. This chip has a certain mode in which it takes not part in the real I2C action but unly records what is going on. It listens to all adresses but does not generate an acknowledge.Using some software routines and a small cpu you could make a universal I2C data logger. Is there a way to test/debug I2C buses ? There is no general way to Debug an I2C bus. However a few guidelines
might help to get it running.
If the high level is not high enough or does not rise fast enough then you can try to lower the value of the pull up resistor. You must take care however not to surpass the maximum allowable current in the I2C driver stage . The minimum allowable resistor for a 5 volt drive I2C bus is 5volts / 3mA = 1600 Ohms. A typical value of 4700 ohm should do fine. Make sure the bus is not 'stuck' . This could be the result of a bad
power supply (chips go into latch up during power-on) or a bad chip .
I want to experiment with I2C .Are there demokits available.? Philips has at least 1 board ( i know of two different boards) for these purposes. It features a bunch of different I2C devices such as EEprom ,digital I/O ,A/D D/A , controllable switch , Real time clock , Ram , Display driver (led and LCD with even an alphanumeric LCD) and also can host a number of their 8051 compatible CPU's. For people wanting to control I2C from their pc they can either buy a card or build one themselfves. A number of Programs is available to control I2C devices from this interfaces. You can use the Philips / signetics software or use the driver i wrote to control the I2C bus from within your programs. Are there plug in board available for IBM Pc to emulate I2C ? There are a number of debugging tools out there which can monitor an
I2C bus .
Micro Computer Control Corporation
Calibre ICA-90 I2C Adapter as IBM PC Plug-in Board
In USA you can also contact Saelig Co.
I have problems with long buses. Can i make an active pull-up ? Absolutely. If you need to go off board however then you should use
the P87B715 device from philips.
First of all Rs. This is a series resistor used to minimize cross talk and undershoot .It also protects the I/O drivers of the I2C devices against overvoltages and overcurrent injection. These resistors are advised if you run a long bus on high speed ( such as in enhanced I2C mode). When the bus becomes free all output stages on the bus are turned off and SCL (or SDa for that matter) become high. This will not happen immediately , but the voltage will rise during a certain time. Now Suppose the switch is not there. The charge time of the bus capacitor is determined by the value of R1 only . The higher one of them is the longer it will take for the bus to reach a sufficient stable High level. We can't make the Series resistor too small because then we will go out of spec on the maximum allowable current into one I2C device when it turn's it's output driver on. When we calculate for a current of 3ma we end up at approx 1800 ohms
for the series resistance. 5volts / 3ma = 1666 Ohms .
When the output stage is turned off this current slightly drops due to the fact that the voltage on the bus is rising. The moment our switch kick's in you see the current double. The same effect is then present as before the switch closed: the current drops as the bus voltage rises.When the switch opens again the current drops a little to charge the capacitor up to 5 volts. But at that time all chips already detect a logic one and are well withing the 300nS. Rise time.
It is written in PseudoCode which is an imaginary programming language that any programmer should be capable of porting to his/her favorite language. First we will define a set of basic interface routines. All text between / / is considered as remark. Following variables are used : n,x = a general purpose BYTE
Driver functions
HighLevel functions |
DECLARE N,SIZE,BUFFER,X Byte
SUBroutine I2C_INIT
SUBroutine READ
Device_addr=
CALL START
Device_addr=
CALL START
Device_addr=
CALL PUTBYTE(Device_addr)
Device_addr=
CALL START
Some notes about the high level routines. The READ and WRITE routine read/write one or more byte(s) from/to a slave device. Generally this will be used only with Number_of_bytes set to 1. An example : PCD8574=(0100.0000)b
will read the status of the 8 bit input port of a PCD8574. DATA(0)=(0110.01010)b
will write 0110.0101 to the 8 bit port of the PCD8574 When do you need a multiread ? Consider a PCF8582 EEPROM. You want to read its contents in one time. PCF8582=(1010.0000)b
You can do the same with WRITE for the EEprom with the restriction that Number_of_bytes is not larger than 4. You will have to check the components datasheets. The most useful instructions are RANDOMREAD and RANDOMWRITE.
DATA(0)=(1010.0011)b
The same goes for reading 16 bytes from the eeprom starting at adress 42h CALL RANDOMREAD(PCF8582,(42)h,15) The results are stored in DATA. All you have to do is read them out
of the array to process. When you give the devices adress to
these routines you don't have to care about the R/W flag. It will be automatically
set to the right state inside the routines.
Debugging tools.
So you have an I2C bus and you want to monitor activity. Using a regular scope this is rather tough. When you are in control then you can easily generate a trigger for the scope. If you are not in control ( in a TV set or other equipment ) then things get more complicated. The tools described in this section should provide some easy means to solve these problems. I2C trigger generator.
I2C interfacing system for IBM-PC.
This section covers a complete I2C experimenting system for the IBM PC. In this section i will set up an environment to experiment with I2C.
Hardware section. The schematic is almost the same as the Schematic provided by Philips. As a matter of fact it is the same.A little addition has been made. However it is 100% compatible with the philips driver schematic. This was done so you can use it both with tools like TV400 from Philips and with my driver.
SCL and SDA speak pretty much for themselves. The trig Output is an
addition i made to the original schematic. When used with the driver
described below it is able to trigger an oscilloscope. Each time
a Start condition occurs the trig output generates a pulse.This will make
it easier to monitor bus activity when experimenting wth the system. You
can write a loop that keeps doing the same over and over again. When you
connect SCL and SDa to channels X1 and X2 of the scope and the TRIG
Software This module can be used with the programs developed by philips and available from their FTP site or from the internet. Programs are TV400.ZIP and RAD216.ZIP. These contain a complete bus
control terminal. You can monitor bus activity
This describes a set a routines written Basic that allow you to run an I2C bus over a standard printerport. The program is written in such a way that it can be run on different platforms without ( or with minor ) modifications. ' ****************************
DIM ICdta(10)
' powerbasic users must replace
hold = .001
' $$$$$$$$$$$$$$$$
I2Copen 0, 1
I2Cinit 10
CLS I2Cwrite 192, 12
a = I2Cread(193)
I2Cwwsend 200, 1, 7
a = I2Cwwread(201, 1)
I2Cmultiread 200, 3
FOR a = 0 TO 3
FOR a = 0 TO (count * 1000)
|