mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik HCS12 und I²C


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich habe hier einen HCS12 und versuche per I2C Bus ein EEPROM zu 
schreiben/lesen. Das Schreiben scheint zu funktionieren. Beim Lesen hab 
ich das Problem, dass ich nur an der aktuellen Position Lesen kann. 
Immer wenn ich zu erst die Adresse schreibe und danach per repeated 
start lesen will, klappt es nicht. Ich vermute, mein Problem liegt an 
dem START und STOP signal. Ich weiß zwar, wie ich dies per SDA und SLC 
lösen kann, nur meinen durch meinen µC hab ich auf die Leitungen direkt 
ja keinen Zugrif.. :(

Aktuell sieht es so aus, was aber nicht stimmen kann. Denn würde ich 
nach dem 1. start und dem Sender der slave adresse nochmal start 
aufrufen, wäre ja IBCR_MS_SL und auch IBCR_TX_RX bereits gesetzt - 
sprich meine Routine würde effektiv garnichts machen??

// internal - generates a START condition
void iic_send_start(UINT8 address)
{
  // wait for bus to be free
  if (iic_status.no_stop == false)
  {
    while (IBSR_IBB == 1);
  }

  IBCR_IBIE = 0;  // disable interrupts

  // generate START condition
  IBCR_TX_RX = 1;  // set transmit mode
  IBCR_MS_SL = 1;  // select master mode (send start bit)
  IBDR = address; // send selected slave address

  // wait for bus to be busy (by us)
  while (IBSR_IBB == 0);

  IBCR_IBIE = 1;  // enable interrupts
}

// internal - generates a STOP condition
void iic_send_stop(void)
{
  IBCR_MS_SL = 0;
}


Ich freue mich über jegliche Hilfe. Vielleicht hat ja sogar schon jemand 
einen fertigen I2C "Treiber" fürn HCS12 in C fertig? :)

Peter

Autor: Christian Gärtner (christiang)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

schau am besten mal auf der Freescale Webseite vorbei und besorg dir die 
Application Note AN2318 samt Code.
Da wird beispielhaft die I2C Ansteuerung per Hardware gezeigt.
Noch ein kleiner Tipp, in dem Treiber selbst ist noch ein Fehler 
enthalten, siehe dazu
http://forums.freescale.com/freescale/board/messag...

Einen fertigen Treiber kann ich dir (im Moment noch) nicht bieten, ich 
arbeite selbst erst daran.

Grüße,
Christian

Autor: Bastian Göricke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin auch grade dabei, auf dem 9S12DG den I2C Bus mit dem Code der 
AN2318 zum Laufen zu bringen. Leider habe ich das Problem, dass die ISR 
nie aufgerufen wird.
z.B. beim Senden mit:
  TxPacket[0] = 0x01;
  TxPacket[1] = 0x02;
  TxPacket[2] = 0x03;
  TxPacket[3] = 0x04;
  TxPacket[4] = 0x05;
  TxPacket[5] = 0x06;
  TxPacket[6] = 0x07;
  TxPacket[7] = 0x08;    
  MasterTransmitPacket2Slave(0b10010000);
bleibt er dann immer im
  while(TxBufferemptyflag == CLEAR)  /* wait while message is transmitted */
  {
  }
der MasterTransmitPacket2Slave hängen, da das TxBufferemptyflag nie 
gesetzt werden kann.
Warum der Interrupt nicht ausgelöst wird kann ich mir leider nicht 
erklären, aktiviert sollte er durch Iic.ibcr.byte = (IBEN|IBIE); ja 
sein.
Hat jemand eine Idee dazu?

@Christian und Peter: Wie weit ist euer I2C Quelltext momentan?

Grüße,
Bastian

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.