I²C Adressen prüfen

Gast #521780
Lesenswert?
• ▲
▼
Hallo,

Ich möchte das mein mega8 I2C Master beim einschalten guckt welche 
Slaves eingeschaltet sind. Dazu soll er einfach nur alle Adressen von 
0x10 bis 0x1F prüfen.

Mein Problem ist das wenn ich folgenden Code ausführe fängt ein Slave an 
zu spinnen und hängt sich bei jedem zweiten mal auf auf (Zieht dabei 
beide Signalleitungen auf low).
1
uint8_t i;
2
for(i = 0x10; i <= 0x1F; ++i)
3
{
4
  temp_buffer[0] = (i<<TWI_ADR_BITS)|(0<<TWI_READ_BIT);
5
  TWI_Start_Transceiver_With_Data(temp_buffer, 1);
6
  while(TWI_Transceiver_Busy());
7
  _delay_us(50);
8
}

Das ist noch minimal Code, er hängt sich direkt beim ersten Durchlauf 
bei TWI_Transceiver_Busy() auf weil die Leitungen auf low sind.

Wenn ich den Code mitten im Betrieb laufen lassen (taster/uart) 
funktioniert alles wunderbar.

Der Slave der den Fehler verursacht hat TWAR = 0x10 (Addrese).

Ich verwende den Code aus App note AVR311 und AVR315.
Gast #521812
Lesenswert?
• ▲
▼
1
/****************************************************************************
2
Call this function to send a prepared message. The first byte must contain the slave address and the
3
read/write bit. Consecutive bytes contain the data to be sent, or empty locations for data to be read
4
from the slave. Also include how many bytes that should be sent/read including the address byte.
5
The function will hold execution (loop) until the TWI_ISR has completed with the previous operation,
6
then initialize the next operation and return.
7
****************************************************************************/
8
void TWI_Start_Transceiver_With_Data( unsigned char *msg, unsigned char msgSize )
9
{
10
  unsigned char temp;
11

12
  while ( TWI_Transceiver_Busy() );             // Wait until TWI is ready for next transmission.
13

14
  TWI_msgSize = msgSize;                        // Number of data to transmit.
15
  TWI_buf[0]  = msg[0];                         // Store slave address with R/W setting.
16
  if (!( msg[0] & (TRUE<<TWI_READ_BIT) ))       // If it is a write operation, then also copy data.
17
  {
18
    for ( temp = 1; temp < msgSize; temp++ )
19
      TWI_buf[ temp ] = msg[ temp ];
20
  }
21
  TWI_statusReg.all = 0;      
22
  TWI_state         = TWI_NO_STATE ;
23
  TWCR = (1<<TWEN)|                             // TWI Interface enabled.
24
         (1<<TWIE)|(1<<TWINT)|                  // Enable TWI Interupt and clear the flag.
25
         (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|       // Initiate a START condition.
26
         (0<<TWWC);                             //
27
}
Gast #522161
Lesenswert?
• ▲
▼
Nur so aus Neigierde:
- du benutzt auch den IAR-Compiler (für den ist das Code-Beispiel)?
- du hast auch die Interrupts aktiviert? (der Code arbeitet 
Interruptbasiert, und du "pfuschst" da irgendwie dazwischen)
- warum fragst du diese Adresen ab, ohne irgendeine Auswertung, d.h. 
ohne zu kontrollieren OB ein slave antwortet? (da gibt's eine "union..." 
mit dem aktuellen TWI-Status....)

also meine Tipps sind RTFM! sowohl vom AVR als auch von Compiler und 
App-Note

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.