Hallo, ich hab ein Problem mit meinem Xmega und dem TWI. (SCL und SDA sind mit 4,7k auf Vcc) wenn der Bus Initialisiert wird, durch: TWI_MasterInit(&twiMaster,&TWID,TWI_MASTER_INTLVL_LO_gc,TWI_BAUDSETTING) ; fällt meine SCL auf Low und kehrt nicht mehr zurück auf High! Deshalb kommt auch keine Clock und nix aus dem Controller raus. Hatte das schonmal jemand ? Gruß Mark
Mark schrieb: > Hatte das schonmal jemand ? Ja: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=89928
ok, ich stell die Frage anders.... Hatte das schonmal jemand ? ...und hat auch eine Lösung dafür?
Hast du selbstgeschriebenen Quellcode? Wenn ja könnte es helfen, wenn du den Code zeigst. Oder hast du das Beispiel aus der AVR1308: Using the XMEGA TWI http://www.atmel.com/dyn/products/app_notes.asp?family_id=607 abgeändert (TWIC => TWID erkenne ich bereits)? Dann wäre 1. die Zeile #define SLAVE_ADDRESS 0x55 in twi_example.c interessant. Welche Adresse hat dein Slave-I2C-IC? Und 2. ob die Hardwareinitialisierungen (PORTD for inverted input) entfernt wurden.
Hi Stefan, das mit der Slaveadresse müsste stimmen, aber Stefan B. schrieb: > Und 2. ob die Hardwareinitialisierungen (PORTD for inverted input) > entfernt wurden. ..bin ich mir nicht sicher Gruß
Formale Kontrolle des Quelltextes // #1 PORTC.DIRSET |= PIN0_bm; // Als Ausgang TWI SDA PORTC.DIRSET |= PIN1_bm; // Als Ausgang TWI SCL // #2 PORTD.PIN0CTRL=PORT_OPC_WIREDAND_gc | PORT_ISC_BOTHEDGES_gc; PORTD.PIN1CTRL=PORT_OPC_WIREDAND_gc | PORT_ISC_BOTHEDGES_gc; PORTD.OUT=0x03; // #3 TWI_MasterInit(&twiMaster,&TWID,TWI_MASTER_INTLVL_HI_gc,TWI_BAUDSETTING) ; Hardware In #1 nimmst du an, dass TWI an PORTC angeschlossen ist. Bei #3 benutzt du aber TWID. Wie ist die Hardware wirklich angeschlossen? In #2 konfigurierst du PORTD und in #3 benutzt du PORTD für TWI. Beissen sich die Einstellungen oder sind das andere Pins? Mit externen Pullups brauchst du nichts an den TWI Pins zu konfigurieren (lt. Atmel Beispiel) In #3 initialisierst du TWI mit einer Baudrate, für 32 MHz berechnet ist. Dein µC läuft zu diesem Zeitpunkt noch mit 2 MHz. Die Umstellung auf 32 MHz kommt später. Ist das im TWI Modul erlaubt? Passt die Hardwarebeschaltung des PCFPCF8574P zu der SLAVE_ADDRESS_1? Sind die richtigen Pins am IC auf LOW/HIGH gezogen? Debugging Kannst du den Hänger genauer einkreisen? Passiert es beim TWI_MasterInit() oder beim TWI_MasterWrite() oder in der anschliessenden Warteschleife (while (twiMaster.status !=TWIM_STATUS_READY){})? Siehe auch http://www.mikrocontroller.net/search?query=xmega+twi&forums[]=1&forums[]=2&max_age=-&sort_by_date=0 und darin Beitrag "Re: Xmega 128a1 TWI Schnittstelle"
#1 Der TWI ist an Port D angeschlossen, ich hab kurz bevor ich die Frage gestellt habe, Port C ausprobiert um einen Fehler PORTD-seitig auszuschließen. Hätt ich sehen müssen, mein Fehler. Aber daran liegts nicht. #2 dann hab ich das wohl Falsch verstanden, ich dachte die Pins müssten auf WIRED_AND konfiguriert sein, unabhängig vom von eternen Pullups . #3 klingt logisch, ob das erlaubt ist weis ich nicht, ich hab den Befehl jetzt unter die Umstellung auf 32 MHZ gesetzt. Die Hardwarebeschaltung müsste ok sein, ich hab beim PCF alle 3 Adressbits auf Low gelegt, allerdings müsste der Master ja trotzdem irgendwas senden, wenigsten eine Clock, bei mir kommt gar nichts. Ich hab noch ein bischen rumprobiert und bin noch auf folgendes gestoßen: wenn: TWI_MasterInit(&twiMaster,&TWID,TWI_MASTER_INTLVL_LO_gc,TWI_BAUDSETTING) ; oder TWI_MasterWrite(&twiMaster,SLAVE_ADDRESS_1,&data,1); auskommentiert sind, dann bleibt SCL auf High, könnte es auch am dem &twiMaster liegen? Stefan B. schrieb: > Siehe auch > http://www.mikrocontroller.net/search?query=xmega+... > und darin Beitrag "Re: Xmega 128a1 TWI Schnittstelle" kann ich schon auswendig :) ...leider die einzigst gut Quelle die ich gefunden habe.
Mark schrieb: > Die Hardwarebeschaltung müsste ok sein, ich hab beim PCF alle 3 > Adressbits auf Low gelegt, allerdings müsste der Master ja trotzdem > irgendwas senden, wenigsten eine Clock, bei mir kommt gar nichts. Edit: Atmel (LSB = R/W-Bit) hat eine andere Definition der slave address als TI (LSB = A0). Die 0x40 passen in deinem Code. http://focus.ti.com/lit/ds/symlink/pcf8574.pdf Wie untersuchst du SCL? Wenn das wie eingestellt mit 100 kHz arbeitet, müsste man schon mit einem Oszi oder einem LA rangehen, um den Sendevorgang zu sehen. > Ich hab noch ein bischen rumprobiert und bin noch auf folgendes > gestoßen: > wenn: > TWI_MasterInit(&twiMaster,&TWID,TWI_MASTER_INTLVL_LO_gc,TWI_BAUDSETTING) ; > > oder > > TWI_MasterWrite(&twiMaster,SLAVE_ADDRESS_1,&data,1); > > auskommentiert sind, dann bleibt SCL auf High, Das ist klar. Wenn du nicht mit TWI_MasterInit() initialisierst, arbeitet das TWI Modul auch nicht. SCL muss dann unverändert bleiben und wenn es anfangs HIGH ist bleibt das dann auch HIGH. Anderer Fall - wenn du nix mit TWI_MasterWrite() schreibst, muss SCL auch nicht klappern, denn das TWI Modul muss ja nix senden. > könnte es auch am dem &twiMaster liegen? Denke nicht. Das übergibt den TWI Funktionen nur eine Arbeitsadresse (die der Variablen twiMaster).
Stefan B. schrieb: > Wie untersuchst du SCL? Wenn das wie eingestellt mit 100 kHz arbeitet, > müsste man schon mit einem Oszi oder einem LA rangehen, um den > Sendevorgang zu sehen. Ich hab ein uraltes "Voltcraft" Digital Scope, das eben auch als Oszi arbeiten kann, aber bis auf 0V und 3,3V hab ich bis jetzt noch nicht gesehen. Einstellungen sollten auch stimmen 5V/div. und kann bis runter auf 5 µs/div. ..wie wäre eigentlich die optimale Zeiteinstellung ?
Mark, schau dir mal im Atmel Beispiel diesen Passus nach den Initialisierungen und vor der großen while-Schleife an: /* Enable LO interrupt level. */ PMIC.CTRL |= PMIC_LOLVLEN_bm; sei(); Ist es möglich, dass du das für dein TWI auf PORTD entsprechend umschreiben musst? Letztendlich hängt ja alles davon ab, dass in deinem Programm ISR(TWID_TWIM_vect) { TWI_MasterInterruptHandler(&twiMaster); } aufgerufen wird, um darüber twiMaster.status zu manipulieren. Ohne ein Enable des Interrupts und ein sei() so wie in deinem Programm wird das nicht der Fall sein.
Es geht was, zwar noch nicht so wie gewünscht, aber er sendet was. Danke Stefan für deine Hilfe, jetzt kann ich weiterarbeiten! eine Frage noch, woher hast du denn die Beispiele ? Ich find sie nicht auch der Atmel Seite...
Dann mal viel Glück! > AVR1308: Using the XMEGA TWI > http://www.atmel.com/dyn/products/app_notes.asp?family_id=607 Im Seitentext AVR1308 suchen und dort auf das CD-Symbol neben dem Texteintrag klicken.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.