I2C 24c Code Optimierung Atmega32

Gast #2190008
Lesenswert?

Hallo,

ich möchte ein 24C64 Eeprom mit 200-400 aufeinander folgenden Bytes 
beschreiben. Der unten stehende Code funktioniert soweit, jedoch dauert 
das Schreiben um die 2-3s aufgrund dieses Befehls _delay_ms(EWAIT); 
(5ms).
Wenn ich die Zeile weg lasse kommt es zu Fehlern. Kann ich stattdessen 
irgendwie TWINT abfragen?
Achja ich möchte nicht seitenweise beschreiben.

Viele Grüße
1
void i2c_start(void) 
2
  {
3
  TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);   
4
  while ((TWCR & _BV(TWINT)) == 0) ;       
5
  }
6

7

8
void i2c_stop(void) 
9
  {
10
  TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);          
11
  {
12

13

14
void i2c_send(uint8_t DataByte) 
15
  {
16
  TWDR = DataByte;
17
  TWCR = _BV(TWINT) | _BV(TWEN);           // clear interrupt to start transmission
18
  while ((TWCR & _BV(TWINT)) == 0) ;         // wait for transmission
19
  }
20

21

22
void EEPROM_ByteWrite(uint16_t addr, uint8_t wert) 
23
  {
24
  again:
25
    i2c_start();
26
    i2c_send(BASEADR | TW_WRITE);
27

28
    if ((TWSR & 0xF8) != 0x18)
29
      {
30
      i2c_stop();
31
      goto again;
32
      }
33

34
    i2c_send(addr>>8);              
35
    i2c_send(addr);
36

37
    i2c_send(wert);
38
    i2c_stop();
39
    _delay_ms(EWAIT);              // warten fuer 24Cxx
40
  }

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