Hallo. Ich möchte ein serielles 256 Byte EEPROM über I2C per random read (beliebige Speicherzelle) mit dem ATMEGA8 auslesen. Das Schreiben funktioniert soweit. Der Lesevorgang klappt allerdings nur ein einziges mal. Starte ich einen zweiten Lesevorgang, um ein weiteres Byte zu lesen, "hängt" der uC. Soweit ich das beurteilen kann, müsste das Problem in der while-Schleife beim Senden der Start-Bedingung i2c_start() liegen. Stimmt das? Wie lässt sich das Problem lösen? Im folgenden der Code:
1 | void i2c_start(void) |
2 | {
|
3 | |
4 | TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN); |
5 | while((TWCR & _BV(TWINT)) == 0); |
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 Data) |
15 | {
|
16 | TWDR = Data; |
17 | TWCR = _BV(TWINT) | _BV(TWEN); |
18 | while ((TWCR & _BV(TWINT)) == 0); |
19 | }
|
20 | |
21 | uint8_t i2c_receive(uint8_t ack) |
22 | {
|
23 | if(ack ==1) |
24 | TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN); |
25 | else
|
26 | TWCR = _BV(TWINT) | _BV(TWEN); |
27 | while((TWCR & _BV(TWINT)) == 0); |
28 | return TWDR; |
29 | }
|
30 | |
31 | //###################################################
|
32 | |
33 | uint8_t ReadRandomByte(uint16_t addr) |
34 | {
|
35 | PORTD |= (1 << DDD3); //Status LED auf High |
36 | uint8_t wert; |
37 | i2c_start(); |
38 | i2c_send(BASEADR | TW_WRITE); |
39 | i2c_send(addr); |
40 | i2c_start(); |
41 | i2c_send(BASEADR | TW_READ); |
42 | wert = i2c_receive(1); |
43 | i2c_stop(); |
44 | PORTD &= ~(1 << DDD3); //Status LED auf Low |
45 | return wert; |
46 | }
|