Forum: Mikrocontroller und Digitale Elektronik HCS12 und I²C


von Peter (Gast)


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

von Christian G. (christiang)


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/message?board.id=16BITCOMM&message.id=1477&query.id=32153#M1477

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

Grüße,
Christian

von Bastian Göricke (Gast)


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:
1
  TxPacket[0] = 0x01;
2
  TxPacket[1] = 0x02;
3
  TxPacket[2] = 0x03;
4
  TxPacket[3] = 0x04;
5
  TxPacket[4] = 0x05;
6
  TxPacket[5] = 0x06;
7
  TxPacket[6] = 0x07;
8
  TxPacket[7] = 0x08;    
9
  MasterTransmitPacket2Slave(0b10010000);
bleibt er dann immer im
1
  while(TxBufferemptyflag == CLEAR)  /* wait while message is transmitted */
2
  {
3
  }
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

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.