mikrocontroller.net

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


Autor: Ppp Mmm (sanic)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ppp Mmm (sanic)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ppp Mmm (sanic)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: znil06 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.