|
Message
From: Matt Ettus<matt@e...>
Date: Thu Apr 12 01:07:52 CEST 2007
Subject: [oc] recent i2c questions
I just joined the list, but looked over the recent i2c discussion. I have a related question which I don't believe was answered.
The directions in the I2C documentation say to use a tri-state pin for SCL and SDA, but I thought that an open-drain was necessary. My thinking is this:
I2C is not collision-free by design. The intention is that you can detect when there is a collision if you intend to send a 1 and the bus looks like a zero because someone else is driving it low.
In the case where there are 2 devices driving the bus, if they both drive low, there is no problem. If they both "drive" high (really disconnected since they are open-drain, letting the pull-up do the weak driving) then there is no problem. If one drives low and one "drives" high, the one driving high detects a collision, but nobody's outputs are shorted since you don't actually drive the bus high, you just let the bus be pulled up.
However, if you use a plain tri-state output, then when you drive high, you are really driving the bus high, and someone else driving the bus low will result in a short.
Am I missing something here? The only other option I can see is to de-assert the OE signal when you want to send a 1, thus turning off the drive and simulating an open drain, but I don't know if that works in practice. Most FPGAs don't have real open-drain outputs, do they?
Thanks, Matt
|
 |