Hallo,
ich möchte an meinem ATmega1284p die I2C-Schnittstelle verwenden. Wenn
ich den nachfolgenden Code verwende, funktioniert alles super und ich
kann auch die Signale messen.
In meinem Projekt verwende ich allerdings zusätzlich einen Code, der
vorher ebenfalls das TWI verwendet und dessen Code ich nicht
einsehen/ändern kann (binaryfile). Ich kann jedoch ausschließen, dass
dieser Code ein weiteres mal auf TWI zugreift.
Ich füge nun also den gleichen Code (zum späteren Zeitpunkt) erneut aus.
Jedoch "hängt" er sich dann immer an der Zeile
1 | while(!(TWCR & (1<<TWINT))); // wait until transmission completed
|
auf. Ich weiß leider nicht mehr weiter, was ich falsch machen könnte.
In der Hoffnung das es hilfreich ist, füge ich noch ein screenshot vom
debuggen mit in den Anhang. Er ist zum Zeitpunkt wo das Programm hängen
bleibt.
1 | void i2c_init(void)
|
2 | {
|
3 | TWBR = 0x20;
|
4 | }
|
5 |
|
6 | unsigned char i2c_start(unsigned char address)
|
7 | {
|
8 | uint8_t twst;
|
9 | // send START condition
|
10 | TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
|
11 |
|
12 | // wait until transmission completed
|
13 | while(!(TWCR & (1<<TWINT)));
|
14 |
|
15 | // check value of TWI Status Register. Mask prescaler bits.
|
16 | twst = TW_STATUS & 0xF8;
|
17 | if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
|
18 |
|
19 | // send device address
|
20 | TWDR = address;
|
21 | TWCR = (1<<TWINT) | (1<<TWEN);
|
22 |
|
23 | // wail until transmission completed and ACK/NACK has been received
|
24 | while(!(TWCR & (1<<TWINT)));
|
25 |
|
26 | // check value of TWI Status Register. Mask prescaler bits.
|
27 | twst = TW_STATUS & 0xF8;
|
28 | if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
|
29 |
|
30 | return 0;
|
31 | }
|