Problem mit dem Empfangen von Daten auf dem I²C Bus.

Gast #3548148
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 ?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.