Forum: Mikrocontroller und Digitale Elektronik Problem mit dem Empfangen von Daten auf dem I²C Bus.


von Jan H (Gast)


Lesenswert?

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 ?

von Jetzt (Gast)


Lesenswert?

Weshalb mit I2C? UART, oder SPI waere einfacher...

von Oliver (Gast)


Lesenswert?

Da das senden der Startbedingung keine Antwort erfordert, ist da von 
Anfang an etwas faul.

Weils hier gerade rumgeister, hilft das hier weiter:

Beitrag "Problem mit I2C Programm"

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.