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
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 auchhttp://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...