Hallo zusammen,
aaaalso ich habs geschafft dem PCM3070 Daten zu übermitteln, wie Steffen
geschrieben hat geht es ganz einfach so:
- Start
- Device-Adresse
- Page-Adresse
- Data-Byte
- Stop
In Code ausgedrückt sieht das dann so aus:
1 | void TWI_send (add, reg, val) {
|
2 |
|
3 | TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // send START condition
|
4 | while (!(TWCR & (1<<TWINT))); // wait for response
|
5 | if ((TWSR & 0xF8) == TW_START) // if START was successful
|
6 | {
|
7 | TWDR = (add & 0xFE); // put slave address+WRITE to TWDR
|
8 | TWCR = (1<<TWINT)|(1<<TWEN); // and start transmission
|
9 | while (!(TWCR & (1<<TWINT))); // wait for response
|
10 | if ((TWSR & 0xF8) == TW_MT_SLA_ACK){ // if acknowledge ok
|
11 | PORTB |= (1<<PINB0);
|
12 | TWDR = reg; // put regbyte to TWDR
|
13 | TWCR = (1<<TWINT)|(1<<TWEN); // and start transmission
|
14 | while (!(TWCR & (1<<TWINT))); // wait for response
|
15 | if ((TWSR & 0xE8) == TW_MT_DATA_ACK){ // if acknowledge ok
|
16 | TWDR = val; // put valbyte to TWDR
|
17 | TWCR = (1<<TWINT)|(1<<TWEN); //start transmission
|
18 | while (!(TWCR & (1<<TWINT))); // wait for response
|
19 | if ((TWSR & 0xE8) == TW_MT_DATA_ACK){ // if acknowledge ok
|
20 | PORTB |= (1<<PINB0);
|
21 | }
|
22 | else
|
23 | {
|
24 | PORTB &= ~(1<<PINB0); //LED leuchtet bei Fehler.
|
25 | }
|
26 | }
|
27 | else
|
28 | {
|
29 | PORTB &= ~(1<<PINB0); //LED leuchtet bei Fehler.
|
30 | }
|
31 | }
|
32 | else
|
33 | {
|
34 | PORTB &= ~(1<<PINB0); //LED leuchtet bei Fehler.
|
35 |
|
36 | }
|
37 | }
|
38 | else
|
39 | {
|
40 | PORTB &= ~(1<<PINB0); //LED leuchtet bei Fehler.
|
41 | }
|
42 | while (!(TWCR & (1<<TWINT))); // wait for response
|
43 | TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN); // transmit STOP condition
|
44 | _delay_ms(10);
|
45 | }
|
Der Code funktioniert, man sieht am Oszi wie jede Übertragung mit ACK
bestätigt wird. Soweit so gut.
Ich sende nun also mit
meine Befehle nacheinander ab.
Die TruePath Software gibt mir nun eine Datei aus wie ich sie schon
vorher angehängt habe.
Dort sehen die Befehle folgendermaßen aus:
# # reg[0][84] = 0
w 30 54 00
# # reg[0][94] = 32
w 30 5e 20
# # reg[0][95] = 254
> fe
# # reg[0][96] = 0
> 00
# # reg[0][97] = 104
> 68
# # reg[0][98] = 168
> a8
# # reg[0][99] = 6
w steht für write, ein TWI Befehl würde dann für die erste Zeile also
wie folgt aussehen:
1 | TWI_send(0x30, 0x54, 0x00);
|
Das funktioniert auch, hab ich getestet.
Bei den Befehlen mit dem > Zeichen muss man die Register hochzählen,
hier im Beispiel also 95/96/97/... und in Hex eben 5f/60/61/...
Soweit ja alles klar aber ich brauch irgend eine Routine die mir das
macht, also die Werte aus der Datei nimmt und mir in meine TWI_send();
Funktion bastelt.
Kennt jemand einen einfachen Weg das zu machen? Die Datei ist einfach zu
groß um die ganzen Befehle per Hand zu ändern.
Bis vor ein paar Tagen wusste ich noch gar nicht wie I2C überhaupt
funktioniert, bin jetzt echt froh soweit gekommen zu sein und alles
verstanden zu haben aber ich habe leider keinen Ansatz wie ich hier nun
weiter komme.
Vielen Dank für die Hilfe,
Gruß
Bernhard