Hallo,
ich versuche gerade die RealTimeClock DS1307 mit einem ATMEGA16 per TWI
anzusteuern. Dazu ist erst ein Schreibzugriff notwendig, um dem DS1307
die Register-Adress mitzuteilen. Dann können ab dieser Adresse
fortlaufend die Daten gelesen werden. Der Schreibzugriff funktioniert
auch, wie er soll. Nur beim anschließenden Lesen der Werte bekomme ich
ständig einen Bus-Error. Allerdings werden trotz Fehler die richtigen
Werte aus dem DS1307 gelesen. Das verstehe ich nicht. Habe gestern schon
den ganzen Tag nach dem Fehler gesucht, aber kann ihn nicht finden :(.
Ich hoffe ihr könnt mir weiterhelfen.
Hier noch meine Quell-Code:
1 | twiInit(); debug(); // TWSR = 0x18
|
2 | twiStart(0b11010000, 0); debug(); // TWSR = 0x18
|
3 | twiWriteByte(0x00); debug(); // TWSR = 0x28
|
4 | twiStop(); debug(); // TWSR = 0x18
|
5 |
|
6 | _delay_ms(500);
|
7 |
|
8 | twiStart(0b11010000, 1); debug(); // TWSR = 0x40
|
9 |
|
10 | twiReadByte(); debug(); // TWSR = 0x00 <- Bus error
|
11 | twiReadByte(); debug(); // TWSR = 0x00
|
12 | twiReadByte(); debug(); // TWSR = 0x00
|
13 | twiReadByte(); debug(); // TWSR = 0x00
|
14 | twiReadByte(); debug(); // TWSR = 0x00
|
15 | twiReadByte(); debug(); // TWSR = 0x00
|
16 | twiReadByte(); debug(); // TWSR = 0x00
|
17 | twiStop(); debug(); // TWSR = 0x18
|
Das debug(); gibt mir den Wert des TWSR auf einem LCD aus (siehe
Kommentare).
1 | void twiInit(void) {
|
2 | TWSR = 0x00;
|
3 | TWBR = 255;
|
4 | TWCR = (1 << TWEN); // enable TWI
|
5 | }
|
6 |
|
7 | void twiStart(uint8_t address, uint8_t readMode) {
|
8 | TWCR = (1 << TWSTA) | (1 << TWINT) | (1 << TWEN); // send start condition
|
9 | while (!(TWCR & (1 << TWINT)));
|
10 |
|
11 | if (readMode) twiWriteByte(address | 0x01);
|
12 | else twiWriteByte(0xfe & address);
|
13 | }
|
14 |
|
15 | void twiStop(void) {
|
16 | TWCR = (1 << TWSTO) | (1 << TWINT) | (1 << TWEN); // send stop condidtion
|
17 | }
|
18 |
|
19 | void twiWriteByte(uint8_t data) {
|
20 | TWDR = data;
|
21 | TWCR = (1 << TWINT) | (1 << TWEN);
|
22 | while (!(TWCR & (1 << TWINT)));
|
23 | }
|
24 |
|
25 | uint8_t twiReadByte(void) {
|
26 | TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA);
|
27 | while (!(TWCR & (1 << TWINT)));
|
28 |
|
29 | return TWDR;
|
30 | }
|
Ich bedanke mich schonmal im Vorraus für eure Mühe.
Willi