Moin,
ich habe zwei AVRs, einer soll Daten bereit stellen, der andere
auslesen.
Auf dem Slave nutze ich diesen Code:
http://www.rn-wissen.de/index.php/TWI_Slave_mit_avr-gcc#Slave_Testprogramm
Auf dem Master kommt die Lib von P.Fleury zu Einsatz.
Ich versuche nun mit folgender Funktion die Daten auszulesen:
1 | get_data() {
|
2 | if (!i2c_start(SLAVE_ADDRESS + I2C_WRITE)) {
|
3 | uint8_t data;
|
4 | i2c_write(0x00);
|
5 | i2c_rep_start(DEPTH_SENSOR_ADDRESS + I2C_READ);
|
6 |
|
7 | temp = i2c_readNak();
|
8 | i2c_stop();
|
9 | }
|
In die if-Bedingung kommt er jedoch gar nicht mehr rein, da er sich beim
i2c_start schon an der ersten while-Schleife verschluckt.
1 | unsigned char i2c_start(unsigned char address)
|
2 | {
|
3 | uint8_t twst;
|
4 |
|
5 | uart_puts("1");
|
6 | // send START condition
|
7 | TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
|
8 |
|
9 | // wait until transmission completed
|
10 | while(!(TWCR & (1<<TWINT)));
|
11 | uart_puts("2");
|
12 |
|
13 | // check value of TWI Status Register. Mask prescaler bits.
|
14 | twst = TW_STATUS & 0xF8;
|
15 | if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
|
16 |
|
17 | uart_puts("3");
|
18 | // send device address
|
19 | TWDR = address;
|
20 | TWCR = (1<<TWINT) | (1<<TWEN);
|
21 |
|
22 | // wail until transmission completed and ACK/NACK has been received
|
23 | while(!(TWCR & (1<<TWINT)));
|
24 |
|
25 | uart_puts("4");
|
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 |
|
32 | }
|
Die START-Bedingung kann also wohl nicht abgesendet werden, ziehe ich
den Slave ab, funktioniert es bis dahin aber. Andererseits lässt sich
der Slave bspw. mit einem anderen Gerät (RPi) ansprechen. Weiß jemand
woran das liegen könnte ?