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.