Problem bei I2C mit Tiva von TI

OP #3738736
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
Angehängte Dateien:
#3740129
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren