mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TWI Initialisierungsproblem


Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, ich stell die Frage anders....

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?fa...

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.

Autor: Mark (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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ß

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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+...
und darin Beitrag "Re: Xmega 128a1 TWI Schnittstelle"

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann mal viel Glück!

> AVR1308: Using the XMEGA TWI
> http://www.atmel.com/dyn/products/app_notes.asp?fa...

Im Seitentext AVR1308 suchen und dort auf das CD-Symbol neben dem 
Texteintrag klicken.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.