Forum: Mikrocontroller und Digitale Elektronik Problem bei I2C mit Tiva von TI


von Michael W. (mt1)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

habe ein Problem mit dem HW-Treiber für den Tiva C Controller von TI. 
Benutze das "Tiva C Series LaunchPad" von TI und will im Endeffekt per 
I2C eine Nachricht mit 3 Nutzdatenbytes verschicken. Bedeutet Addresse + 
R/W und anschließend die drei Bytes.

Nutze hiefür die mitgelieferte TreiberLib TivaWare.

Der Codeabschnitte um den es geht sieht folgendermaßen aus:
1
  // address + dlc + crc
2
  I2CMasterSlaveAddrSet(I2C2_BASE, SLAVE_ADDRESS, false);
3
4
  I2CMasterDataPut(I2C2_BASE, 0x01);
5
6
  I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_START);
7
8
  while(I2CMasterBusBusy(I2C2_BASE)); //Loop until the bus is no longer busy
9
10
11
  // command
12
  I2CMasterDataPut(I2C2_BASE, 0x01);
13
14
  I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
15
16
  while(I2CMasterBusBusy(I2C2_BASE)); //Loop until the bus is no longer busy
17
18
19
  // state
20
  I2CMasterDataPut(I2C2_BASE, iRelPos.all);
21
22
  I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
23
24
  while(I2CMasterBusBusy(I2C2_BASE)); //Loop until the bus is no longer busy

Das ist eigentlich genau so wie es sein soll und auch in den Beispielen 
die es im Internet zu finden gibt genauso gemacht.

Die Adresse wird noch ohne Probleme raus geschickt und auch vom Slave 
mit einem ACK bestätigt. (Bild1)

Danach wird das nächste Byte aber nicht mehr geschickt. Ich kann mir 
nicht erklären warum das so ist. Es werden keine Fehler eingetragen und 
die Interruptroutine zur Fehlerbehandlung wird auch nicht angesprungen. 
Es passiert einfach nichts. Das I2C-Modul bleibt aber im BUSY-Mode und 
deshalb bleibt dass Programm dann auch in der while-Schleife hängen.

Kann mir von euch evtl. einer einen Tip geben woran das liegen könnte. 
Ich weis das die Signale jetzt nicht super aussehen, aber der Slave 
erkennt alles richtig und von daher sollte das funktionieren. Evtl. 
reduziere ich noch den Pullup-Widerstand, damit es nicht mehr ganz so 
nach einem Sägezahsignal aussieht.

Komisch ist noch, dass das letzte Byte wieder gesendet wird. Das 
allerdings nur, wenn ich das Programm ohne Breakpoint laufen lasse. 
Warum das so ist habe ich bisher auch nicht verstanden. Der Controller 
sollte nach meiner Einschätzung dann eigentlich für immer in der 
while-Schleife hängen bleiben.

Hoffe es kann mir einer helfen.

Mfg
Michael

von Gerhard G. (g_g)


Lesenswert?

Hallo,

du hast deinen Code aus der Function I2CReadData() übernommen.

Hast du die Function im Original schon probiert?

Funktioniert bei mir bestens.

zum Beispiel:
I2CReadData(I2C1_MASTER_BASE,SLAVE_ADDRESS,0x0,rtc_buf.write_buffer,19);

Empfange 19 Byte aus einer RTC.


Gruß G.G.

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.