PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C verstehen... ein Beispiel?



Vinter
13.04.2005, 14:40
Salute,

bin momentan dabei, eine ganz simple I2C-Testplatine aufzubauen: PCF8574P mit 8 LEDS und Vor-Rs (leuchten beim Einschalten), verbunden zu einer simplen pseudo-OpenCollector-Schaltung, bei der zwei Oeffner die Funktion der Transistoren uebernehmen und zwei Leds an entsprechenden Schlieszern den Status zeigen. Pullups vorhanden, laeuft einwandfrei, liegen jeweils 0 oder 5 V an SDA bzw SCL, wen ich einen Taster betaetige. Soweit ganz simpel, wenn die 5V schaltbar sind, duerften die richtigen Voraussetzungen ja wohl gegeben sein.

Nun habe ich aber noch keine Verbindung zum Slave herstellen koennen, wohl kommunikationstechnisch irgendein Fehler. Dummerweise finde ich immer nur das gleiche Schema aus den Phillips-Datenblaettern im Netz, nie ein Beispiel einer funktioierenden Uebertragung. Haette evtl. jemand so etwas da? Bin besonders unsicher bei den ACKs, wie muss da SDA (von mi kommend) aussehen?

Falls es interessiert: Schlussendlich will ich per uC so diverse Platinen steuern, auf denen das Signal ausgelesen wird und in Servobewegungen umgesetzt - ja, es liegt ein weiter Weg vor mir :)

Grusz und Danke,
David

shadow-netz
13.04.2005, 16:01
für ack muss sda low sein. für nack muss sda high sein.

Data is transferred between a Master and a Slave synchronously to SCL on the SDA line
on a byte-by-byte basis. Each data byte is 8 bits long. There is one SCL clock pulse for
each data bit with the MSB being transmitted first. An acknowledge bit follows each
transferred byte. Each bit is sampled during the high period of SCL; therefore, the SDA
line may be changed only during the low period of SCL and must be held stable during
the high period of SCL. A transition on the SDA line while SCL is high is interpreted as a
command (see START and STOP signals).

frage damit beantwortet?!?!

Vinter
13.04.2005, 16:07
Das ist mir ja klar, findet man auch ueberall im Netz... Trotzdem funktioniert es nicht, und deshalb wuerde ich gerne mal ein Beispiel sehen :/

Und die Frage zu SDA bezog sich darauf, wie der Master die Leitung zu handhaben hat bei ACK, dass der Slave auf 0 zieht ist mir klar.

shadow-netz
13.04.2005, 16:12
If the
slave signals a No Acknowledge, the master can generate a STOP signal to abort the data
transfer or generate a Repeated START signal and start a new transfer cycle.
If the master, as the receiving device, does not acknowledge the slave, the slave releases
the SDA line for the master to generate a STOP or Repeated START signal.

dann dieses? ;)

tobimc
13.04.2005, 16:24
HI

Im Roboternetz WIKI gibts auch Informationen, sogar mit Oszillogramm.

Grüße,
Tobi

shadow-netz
13.04.2005, 16:30
http://www.opencores.org/cvsget.cgi/i2c/doc/i2c_specs.pdf?do_download=now

oder das da.

Gerhard
13.04.2005, 17:14
Hallo David,

evtl. hilft Dir ja das folgende kleine Progr.
Mega8 + PCF8574 + 8 LED's an dessen Port's.



$regfile = "m8def.dat" 'ATmega8-Deklarationen
$crystal = 3686400 'Quarz: 3,6864 MHz
$baud = 9600 'Baudrate zum PC: 9600 Baud
'
Config Sda = Portc.4 'ist für I2C erforderlich
Config Scl = Portc.5 'dito

'................................................. ..............................

Const Pcfled = &H40 'Adresses PCF8574 0.0.0


'BITMUSTER LED
Const Led_0 = &B00000001 'PCF Port 0 ein
Const Led_1 = &B00000010 'PCF Port 1 ein
Const Led_2 = &B00000100 'PCF Port 2
Const Led_3 = &B00001000 'PCF Port 3
Const Led_4 = &B00010000 'PCF Port 4
Const Led_5 = &B00100000 'PCF Port 5
Const Led_6 = &B01000000 'PCF Port 6
Const Led_7 = &B10000000 'PCF Port 7
Const Led_blank = &B00000000 'alle LED aus


' --- Programmoperationen ------------------------------------------------------

I2cinit 'I2C Bus initialisieren

Do
I2cstart 'Bus starten
I2cwbyte Pcfled 'Addresse PCF senden

I2cwbyte Led_0 'LED-Bitmuster senden
Wait 2

I2cwbyte Led_1 'LED-Bitmuster senden
Wait 2

I2cwbyte Led_2 'LED-Bitmuster senden
Wait 2

I2cwbyte Led_3 'LED-Bitmuster senden
Wait 2

I2cwbyte Led_4 'LED-Bitmuster senden
Wait 2

I2cwbyte Led_5 'LED-Bitmuster senden
Wait 2

I2cwbyte Led_6 'LED-Bitmuster senden
Wait 2

I2cwbyte Led_7 'LED-Bitmuster senden
Wait 2

I2cwbyte Led_blank 'LED-Bitmuster senden
Wait 2

I2cstop 'Bus wieder freigeben
Loop

End 'end program


mfg Gerhard

Vinter
13.04.2005, 17:19
Vielen Dank erstmal, genau das hab ich gesucht. Und rausgefunden, dass ich alles richtig gemacht habe... funktionieren will es trotzdem nicht. grade nachgemessen - kommt kein ACK, auch nicht bei der Addresse Der Slave muesste Data runterziehen, wenn ich D und C loslasse, oder? Das passiert jedenfalls nicht... Darum ein paar Fragen zu Addressierung: 0100 bei PCFs + bei direkt mit Vss verbundenen A0-A2 000 als Addresse, oder?
Sonst weisz ich echt nimmer weite, evtl mal nen Plan zeichnen :( Muesste halt bis Morgen spaetestens laufen, das ganze Projekt muss in 2 Wochen stehen *ARGH*

Gerhard
13.04.2005, 17:34
... die 3 Adressbits auf GND legen !!

Gerhard

Elektronik-Max
13.11.2005, 12:46
Ein fröhliches Hallo an die Fachmänner.
Ich bin in Sachen I2C noch ein großer Neuling...
Kann mir einer von euch vielleicht verraten wo ich ne I2C-Library (i2c.lib) her bekomme? Ich arbeite mit dem ATmega16 und da wird die Library verlangt.
Vielleicht könnt Ihr mir ja helfen.
Vielen Dank.
:|

Pascal
13.11.2005, 13:15
welche Programmiersprache verwendest du? Bascom?

Elektronik-Max
13.11.2005, 14:18
Hi Pascal

Ich programmiere in BASCOM. Ich hab nun noch ein Problem mit der DLPortIO.dll von BASCOM. Gibts da eine Installations Datei um die zu installieren oder gibt es da im Internet eine Seite wo ich das finden kann?
Danke Schön

raptor_79
06.12.2005, 22:12
tja, die wirst wohl für 14,95€ oder so kaufen müssen. steht bei mir wohl auch an.