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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.