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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.