TWI_Start bringt hin und wieder fehler

Gast #4037550
Lesenswert?
• ▲
▼
Servus,

ich hab hier einen Atmega328 und über I2C einen SL030 (MIFARE 
Kartenleser) angeschlossen.

das auslesen der Karten geht auch, hin und wieder tritt aber ein fehler 
auf
1
uint8_t TWI_Start(uint8_t Adresse)
2
{
3

4
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);                    // In das Register TWCR (Control) Startbedingungen Schreiben bzw. senden
5
  while (!(TWCR & (1<<TWINT)));                        // Warten Bis die interrupt flag eine 1 zurück gibt Senden abgeschlossen
6
  if ((twst != TWI_START) && (twst != TWI_REP_START)) LEDRED_AN();      // Prüfe ob TWSR den "Start-Erfolgt-Wert" hat
7
  TWDR = Adresse;                                // Setze die Adresse und die des I2C in das Register
8
  TWCR=(1<<TWINT)|(1<<TWEN);                          // Sende den Inhalt des TWDR über den Bus
9
  while (!(TWCR & (1<<TWINT)));                        // Warte bis das Senden abgeschlossen ist                            // Setze twst auf Wert des TWSR ohne die TWSP
10
  if ((twst != TWI_MTX_ADR_ACK) && (twst != TWI_MRX_ADR_ACK)) LEDYEL_AN();  // Prüfe ob TWSR den Status "Gesendet und Bestätigung erhalten" hat
11
  return 0;
12
}


beim Starten des buses
kommt dann bei Prüfe ob TWSR den Status "Gesendet und Bestätigung 
erhalten" hat meine Gelbe LED was einem fehler gleich kommt danach geht 
es dann logischerweise auch nicht weiter wenn der fehler auftritt muss 
man den atmega aus und wieder einschalten nach dem neustart geht es dann 
wieder

hatte jemand schonmal das problem oder kann mir sagen was ich falsch 
gemacht habe?

ich gebe auch gerne noch infos zum code raus wenn ihr mir sgt was ihr 
braucht.

TWBR = 255 TWPS = 0
das sind dann so ca 2kbit
der schaltungsaufbau ist recht simpel an dem antmega sind nur der I2C, 
ISP und an PD2 der SL030_OUT (der eine 1 liefert wenn kein und eine 0 
wenn eine Karte da ist) angeschlossen und natürlich noch die C für die 
spannungsversorgung
pullups am I2C sind auch dran. je 4,7kohm

schonmal danke.
#4038277
Lesenswert?
• ▲
▼
Marco schrieb:
> while (!(TWCR & (1<<TWINT)));

Endlosschleife

Marco schrieb:
> wenn der fehler auftritt muss
> man den atmega aus und wieder einschalten

wegen oben, kein Wunder, wie wäre es mit einem Timer einen Zähler 
mitlaufen lassen der nach Zeit X die Schleife verlässt?

Marco schrieb:
> pullups am I2C sind auch dran. je 4,7kohm

können auch mal kleinere bis 2k probiert werden und sie sollten stets am 
Ende der LEitung beim letzten Teilnehmer sitzen, nicht am Master

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.