TWI Bus Error

Gast #1836248
Lesenswert?
• ▲
▼
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren