Forum: Mikrocontroller und Digitale Elektronik 8051 - I2C-Bus lesen und schreiben


von guest123 (Gast)


Lesenswert?

Hallo,

ich soll mal 2 funktionen entwerfen die halt lesen und schreiben vom I2C 
Bus bzw. von z.B. einen RTC-Baustein etc., aber jetzt gehts nur ums 
lesen und schreiben.

Das Ganze muss ich in C programmieren, hier mal meine Ansätze: 
http://pastebin.com/xmg9B2nt

Also beim Schreiben ist es ja so das bei SCL=0, SDA ändern darf, also 
wenn SCL=0, soll man Daten auf SDA-Leitung übertragen.

start condition brauch ich ja hier nicht, weil ich das ja dann außerhalb 
später vom unterprogramm machen, also bevor ich das aufrufe, die 2 
Unterprogramme sollen nur readByte und WriteByte können.

Wenn jetzt das Ack kommt vom Empfänger, wie soll ich da mit dem Takt 
weiter machen? Muss da SCL auch 0 sein, wenn das ACK kommt? Oder wie ist 
das?


Jetzt zum Lesen:

Naja wie ist es hier mit dem SCL? Muss ich da SCL auch 0 sein, wenn ich 
einen Zustand/Bit von SDA lesen will? Und hier bekomm ich ja ein 
Acknowledge, was soll ich mit dem anfangen?

Wenn ACK=1, dann nix mehr senden und wenn ACK=0, dann weitere Daten 
senden richtig? Aber wie hängt das alles zusammen, ich weiß nicht was 
ich mit dem ACK bei der write und read funktion machen soll.

Könnt ihr mir bitte helfen? Und überbrüft eventuell auch den Code, also 
ob das stimmt wie ich das rausschreiben bzw. lese dann.

Danke!

mfg

guest123

von Joerg L. (Firma: 100nF 0603 X7R) (joergl)


Lesenswert?


von guest123 (Gast)


Lesenswert?

Danke, dass auf Deutsch kenne ich und hab ich mir schon durchgelesen.

Trotzdem ist mir das nicht klar und meine Fragen sind noch offen. Bitte 
kann mir jemand helfen.

von 80C51 (Gast)


Lesenswert?

guest123 schrieb:
> Bitte
> kann mir jemand helfen.

Welchen µC verwendest du und wie sieht dein vollständiges Progrann aus 
(bitte hier posten)?

von IIC (Gast)


Lesenswert?


von guest123 (Gast)


Lesenswert?

uC: AT89S8253

Hier das Programm:
void IIC_init() //schaut das beide leitungen auf high und vlt in der 
reihenfolge das eine stopkondition entsteht.
{
  SDA=1;
  SCL=1;
}

/**
* Wartet 5us
* @param
* @return
*/
void wait5us()
{
  _nop_(); // ein NOP dauert 0.5us
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}

/**
* Start Condition
* @param -
* @return -
*/
void startCond()
{
  SDA=0;
  wait5us();
  SCL=0;
}

/**
* Stop Condition
* @param -
* @return -
*/
void stopCond()
{
  SCL=1;
  wait5us();
  SDA=1
}

/**
* Datenbyte lesen
* @param bAck
* @return uchData
*/
unsigned int IIC_read_byte(bit bAck)
{
  unsigned char x = 0;
  unsigned char uchData = 0;

  while(x < 8)
  {
    uchData = (uchData<<1) | (unsigned char)SDA;

  }
  SDA=bAck;

  return(uchData);
}

/**
* Datenbyte rausschreiben(fängt mit msb an)
* @param uchData
* @return bAck
*/
bit IIC_writeByte(unsigned char uchData)
{
  unsigned char x = 0;
  bit bAck = 0;

  while(x < 8)
  {
    SCL=0;
    wait5us();
    SDA=(uchData & AND_MASK)>>7;
    uchData=uchData<<1;
    SCL=1
    wait5us();
    x++;
  }
  bAck=SDA;

  return(bAck);
}

von 80C51 (Gast)


Lesenswert?


von guest123 (Gast)


Lesenswert?

Naja, inwiefern wir dein Interrupt verwendet/ausgelöst bei I2C Bus?

von guest123 (Gast)


Lesenswert?

Danke, aber naja das ist asm code, wenn ich mich jetzt da auch noch 
hinein denke etc., dann komme ich nie zu einer Lösung, ich muss das in C 
programmieren, wie schon gepostet oben.

von 80C51 (Gast)


Lesenswert?

guest123 schrieb:
> das ist asm code, wenn ich mich jetzt da auch noch
> hinein denke
Dein Code ist von der Struktur im gleichen Stil.

Alle notwendigen Teile sind im Atmel Code enthalten, Start Stop Ack 
Nack.
Die Umsetzung nach C ist trivial.

Und Interrupts nehme ich bei allen zeitabhängigen Dingen. NOP uns andere 
Dinge ums aktive Warten sind böse, sehr böse.

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.