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 | }
|