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