Forum: Mikrocontroller und Digitale Elektronik TWI Initialisierungsproblem


von Mark (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?


von Mark (Gast)


Lesenswert?

ok, ich stell die Frage anders....

Hatte das schonmal jemand ? ...und hat auch eine Lösung dafür?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Mark (Gast)


Angehängte Dateien:

Lesenswert?

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ß

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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"

von Mark (Gast)


Lesenswert?

#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.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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).

von Mark (Gast)


Lesenswert?

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 ?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Mark (Gast)


Lesenswert?

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...

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.