Hallo,
ich möchte meine LiIonen-Akku über die I2C-Schnittstelle mit einem
ATmega16 verbinden und dessen Register auslesen. In der
Akkuschutzschaltung wurde ein GAS-GAUGE-IC von der Firma TI verwendet.
Typ ist der BQ27200. Auf der Seite 25 und 26 wird das Protokoll
beschrieben (im Anhang).
Nun habe ich entsprechend diese Seite meine Routine aufgebaut. Das
Ergebnis kann leider nicht stimmen, da der interne Speicher des BQ27200
von 0x00-0x7F geht und meine Werte wiederholen sich bei 0x47.
Schaut mal bitte über meinen c-Code und vergleicht es mit dem Protokoll:
putchar() übergibt dem UART das gelesene Zeichen aus dem TWDR-Register
von der TWI-Schnittstelle
Protokoll b) quick-read
1 | void READ_BYTE_LiIO(void)
|
2 | {
|
3 | //Startbedingung
|
4 | TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // Startbedingung
|
5 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
6 |
|
7 | //ADDR[6..0]-ADDR.7=0
|
8 | TWDR = 0xAB; // Adresse
|
9 | TWCR = (1 << TWINT) | (1 << TWEN); // senden
|
10 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
11 |
|
12 | //Umschalten auf Daten-Empfangen
|
13 | TWCR = (1 << TWINT) | (1 << TWEN); // senden
|
14 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
15 |
|
16 | //Daten aus Register lesen und speichern
|
17 | putchar(TWDR); // Daten aus Register übernehmen
|
18 |
|
19 | //Stoppbedingung
|
20 | TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); // Stoppbedingungtodo=0;
|
21 | }
|
Protokoll c) 1-byte read
1 | void READ_BYTE_ADRESS_LiIO(void)
|
2 | {
|
3 | //Startbedingung
|
4 | TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // Startbedingung
|
5 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
6 |
|
7 | //ADDR[6..0]-ADDR.7=0
|
8 | TWDR = 0xAA; // Adresse
|
9 | TWCR = (1 << TWINT) | (1 << TWEN); // senden
|
10 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
11 | //CMD[7..0]
|
12 | TWDR = 0x03; // Daten
|
13 | TWCR = (1 << TWINT) | (1 << TWEN); // senden
|
14 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
15 |
|
16 | //Startbedingung
|
17 | TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // Startbedingung
|
18 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
19 |
|
20 | //ADDR[6..0]-ADDR.7=0
|
21 | TWDR = 0xAB; // Adresse
|
22 | TWCR = (1 << TWINT) | (1 << TWEN); // senden
|
23 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
24 |
|
25 | //Umschalten auf Daten-Empfangen
|
26 | TWCR = (1 << TWINT) | (1 << TWEN); // senden
|
27 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
28 |
|
29 | //Daten aus Register lesen und speichern
|
30 | putchar(TWDR); // Daten aus Register übernehmen
|
31 |
|
32 | //Stoppbedingung
|
33 | TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); // Stoppbedingungtodo=0;
|
34 | }
|
Protokoll d) incremental-raed Start Adresse: 0x00
1 | void READ_RAM_LiIO(void)
|
2 | {
|
3 | unsigned char i;
|
4 | //Startbedingung
|
5 | TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // Startbedingung
|
6 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
7 |
|
8 | //ADDR[6..0]-ADDR.7=0
|
9 | TWDR = 0xAA; // Adresse
|
10 | TWCR = (1 << TWINT) | (1 << TWEN); // senden
|
11 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
12 |
|
13 | //CMD[7..0]
|
14 | TWDR = 0x80; // Daten
|
15 | TWCR = (1 << TWINT) | (1 << TWEN); // senden
|
16 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
17 |
|
18 | //Startbedingung
|
19 | TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); // Startbedingung
|
20 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
21 |
|
22 | //ADDR[6..0]-ADDR.7=0
|
23 | TWDR = 0xAB; // Adresse
|
24 | TWCR = (1 << TWINT) | (1 << TWEN); // senden
|
25 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
26 |
|
27 | //Empfang starten
|
28 | //Umschalten auf Daten-Empfangen
|
29 | TWCR = (1 << TWINT) | (1 << TWEN); // senden
|
30 | while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
31 |
|
32 | // es folgen Adressen bis 0x2C
|
33 | for(i=0; i<=0x7F; i++)
|
34 | {
|
35 | //Daten aus Register lesen und speichern
|
36 | putchar(TWDR); // Daten aus Register übernehmen
|
37 | if(i<0x7F)
|
38 | {
|
39 | TWCR = (1 << TWINT) | (1 << TWEN) | (1<<TWEA); // ACK senden
|
40 | //while(!(TWCR & (1<<TWINT))); // warte bis fertig
|
41 | }
|
42 | }
|
43 | //Stoppbedingung
|
44 | TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); // Stoppbedingungtodo=0;
|
45 | }
|