Forum: Projekte & Code I2C Lib für LPC2000 Controller (ARM)


von Ppp M. (sanic)


Angehängte Dateien:

Lesenswert?

Hallo,

im Anhang findet ihr die modifizierte Library von Mike Schaub
(http://www.mikrocontroller.net/forum/read-4-251127.html).
Es wurden noch die fehlenden Read Funktionalitäten hinzugefügt.

Grüße,
Patrick

von Frank (Gast)


Lesenswert?

Hallo! Zum angefügten Codeauszug hätte ich eine Frage: warum muß das 
Flag SI auch im Pollingbetrieb vor oder zusammen mit START gesetzt 
gesetzt werden? Im Datenblatt ist hierzu nichts angegeben.


//Send "START" condition
int i2c_start(int addr){
  I2C_I2CONCLR = 0x14;                //  clear STO, AA
  I2C_I2CONSET = 0x28;                //  set STA, SI
  wait_for_SI();
  I2C_I2CONCLR = 0x20;                //  clear STA
  if (I2C_I2STAT > 0x10) return(-1);        //  bus is busy
  I2C_I2DAT = addr;                  //  set address
  wait_for_SI();
  return (I2C_I2STAT != 0x40 && I2C_I2STAT != 0x18);  //  no acknowledge

von Ppp M. (sanic)


Lesenswert?

Hallo Frank,

ich bastel schon länger nicht mehr mit den ARMs (der Code war so 
ziemlich das letzte was ich veröffentlichen konnte) und weiß daher 
nichts genaues.
Ich glaube aber, dass ohne das setzen von SI die Start Condition nicht 
gesendet wurde oder etwas ähnliches.
Was passiert denn wenn du das SI Flag nicht setzt?

Grüße,
Patrick

von Frank (Gast)


Lesenswert?

Vielen Dank für die Antwort!

Setze ich SI zusammen oder vor START, geht der Bus korrekt auf Start. 
pegel sind dann LOW und die Daten werden korrekt gesendet.

Wenn ich SI nicht vor oder zusammen mit START setze, wird die 
Startbedingung nicht gesendet. Das Datenwort erscheint dann völlig 
unkenntlich auf dem Bus. Aus der Bitfolge 10110000 wird dann 00000010.


Laut Datenblatt jedoch:

STA, STO, and SI must be reset.
The master transmitter mode may now be entered by setting the STA bit. 
The I2C logic will now test the I2C-bus and generate a start condition 
as soon as the bus becomes free. When a START condition is transmitted, 
the serial interrupt flag (SI) is set, and the status code in the status 
register (I2STAT) will be 0x08.

von Ppp M. (sanic)


Lesenswert?

Hallo Frank,

ich glaube ich bin in der Hinsicht auch nicht schlauer geworden als du.
Steht dazu vielleicht etwas im Errata von deinem LPC?

Grüße,
Patrick

von znil06 (Gast)


Lesenswert?

Hey leute,
falls ihr noch enie Ahnung habt....folgende Frage:
Für was brauche ich das Timeout wait_for_SI()? Warum muss ich hier 
überhaupt warten?Das SI bit müsste doch gelöscht werden und danach muss 
ich doch gleich mir der Übertragung fortfahren können....wenn jemand 
dazu was weiß, bitte um Antwort

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.