mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SMBus0 Kommunikation zwischen zwei 8051 F120 funktioniert nicht


Autor: Bernhard Berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich versuche seit geraumer Zeit eine SMBus0 Kommunikation zwischen zwei 
C8051 F120 zu erzielen. Der Master empfängt Daten vom Slave. Da ich nur 
einen Master benötige brauche ich keine Arbitrierung.


Was funktioniert: Der Master: Ich habe mit einem Oszilloskop SDA und SCL 
überprüft, beides funkioniert, Startbedingung wird erzeugt und Adresse 
wird richtig gesendet.

Was nicht funktioniert: Der Slave: Sobald ich Master und Slave verbinde 
tritt sofort ein Bus-Error auf.

Ich kann mir nicht erklären wieso ein Bus Error auftritt, ich hoffe ihr 
könnt mir einige Fehlerquellen nennen.

Danke im Voraus für eure Antworten.

Mfg Berndl

Autor: Peter S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht man die Startbedingung und Adresse auf dem Oszilloskop, wenn 
Master und Slave verbunden sind?

Autor: Bernhard Berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, Sobald Master und Slave verbunden werden tritt SOFORT ein Bus 
Error auf.
Wenn man nur den Master mit dem Oszilloskop untersucht erzeugt er die 
Startbedingung und sendet die Adresse.

Mfg

Autor: Arnold Strub (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernhard,

wenn nach dem Verbinden der Leitung mit dem Slave kein Signal mehr auf 
der Leitung sichtbar ist, dann zieht der Slave das Signal wahrscheinlich 
auf Ground. Dem Master ist es dadurch nicht möglich etwas zu senden. 
Grund könnten fehlerhafte Porteinstellungen sein.
Miss einfach einmal den Pegel der Portpins des Slaves ohne das ein 
Master angeschlossen ist.

lg Arnold

Autor: Bernhard Berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp,habe es grade gemessen doch  leider ist dies nicht 
die Fehlerquelle da der Pegel auf High Potential liegt.
Habe SCL und SDA über einen Pull-up Widerstand auf +5V angelegt.
Ich bin mittlerweile schon total ratlos was der Fehler sein  könnte.

Mfg

Autor: Bernhard Berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich konnte den Fehler nun weiter eingrenzen. Es sieht nun wie folgend 
aus:

1) Der Master sendet Startbedingung, Slaveadresse und R/W (wobei 1 
(lesen) gesendet wird)
2) Der Slave sendet ein Acknowledge und wechselt dann in den Error 
Zustand. Dadurch wird die Clock Leitung auf Low gezogen. => Der Master 
erkennt dies und wechselt ebenfalls in den Error Zustand.

Zum Testen habe ich die Frequenz des Mikrocontrollers auf 24,5MHz 
gestellt und siehe da, es funktioniert. Das heißt, dass Problem hat mit 
dem Systemclock des Mikrocontrollers zu tun. Dadurch können nur 2 
Codeteile ausschlaggebend sein:
void InitController()
{
  //SFR-Page Einstellungen
  /////////////////////////
  SFRPAGE = 0x0F;
    SFRPGCN = 0x00;  //disables automatic paging
  
  // Porteinstellungen
  /////////////////////                  
    XBR2    = 0x40; // Ports auf weak pull-up einstellen und cross-bar 
                    // aktivieren

  //Systemclock (100 MHz)
  ////////////////////////
    OSCICN =  0x83; //interne Oszillatorfrequenz auf 24.5 MHz
  while(!(OSCICN & 0x80)); //Wartet bis die Oszillatorfrequenz stimmt
  PLL0CN = 0x00; //Systemclock wird für PLL Eingang benutzt
  SFRPAGE = 0;
  FLSCL = 0x30; //Flash Read Timing auf 100 MHz geändert
  SFRPAGE = 0x0F;
  PLL0CN = 0x01; //PLL-Power aktivieren
  PLL0DIV = 0x01; //Dividiert den Systemclock (24.5 MHz) durch 1
  PLL0FLT = 0x01; //Filtereinstellung: 24.5 MHz Eingang, 100 MHz Ausgang
  PLL0MUL = 0x04; //24.5 MHz * 4 = 98 MHz
  Sleep(1); //Wait at least 5 µs, to provide a fast frequency lock.
  PLL0CN = 0x03; //Aktiviert PLL
  while(!(PLL0CN & 0x10)); //Warte bis PLL bereit ist
  CLKSEL = 0x02; //Als Systemclock wird nun PLL verwendet  
}
//Dieses Programm initialisiert den SMBus
void SMBus_Init()
{
  char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page

  SFRPAGE = 0x0F;
  P0MDOUT = 0x00; // All P0 pins open-drain output
  XBR0 |= 0x01;  // SM-Bus erlauben
  P0 = 0xFF;
  SFRPAGE = 0x00;
  EA=1;
  SMB0CN |= 0x04; //SM-Bus erlaubt, Acknowledge aktiviert  
  SMB0CR = 256-(((1/SMBUS_CLOCK)*FREQUENZ)/4); //Clockrate  
  SMB0ADR = MY_ADDR; //Meine Adresse
  SMB0CN |= 0x40; //SM-Bus erlaubt, Acknowledge aktiviert
    
  SFRPAGE = SFRPAGE_SAVE;
}

Hat jemand eine Idee woran das liegen könnte? Das Beispiel von Silabs 
macht es ganz genau so doch so funktioniert es leider nicht... Alle 
Einstellungen stimmen auch mit denen des Datenblattes überein.

PS: SMBUS_CLOCK = 100000, FREQUENZ = 98000000

Danke für eure Hilfe!

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SMB0CR = 256-(((1/SMBUS_CLOCK)*FREQUENZ)/4);
Ich komm da auf über 1MHz. Laut SiLabs Example lautet die Formel für 
einen Näherungswert
SMB0CR = 257 - (SYSCLK / (8 * SMB_FREQUENCY));
womit ich bei deinen 100kHz Übertragungsrate und einem SysClk von 98MHz 
auf einen CR-Wert von 135 komme.

> Das Beispiel von Silabs macht es ganz genau so doch so funktioniert es
> leider nicht...
Die Aussage ist somit widerlegt (vorausgesetzt, ICH hab jetzt keinen Bug 
gemacht :)

Verwendest du Interrupt oder Polling?
Poste mal den kompletten Code (als Anhang) für den Master und den Slave.

Ansonsten such mal noch hier:
http://www.cygnal.org/scripts/Ultimate.cgi
Das ist das SiLabs Forum.

Ralf

Autor: Bernhard Berndl (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im Silabs Forum hab ich leider nichts Brauchbares gefunden. Ich werde 
aber zur Sicherheit dort auch etwas posten!
Habe 135 in das SMBOCR Register geschrieben, aber es funktioniert 
trozdem nicht!

Hier der Gesamte Code

Danke im Vorraus! :)

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Bernhard,

bist du weitergekommen? Den Vorschlag von Erik aus dem Cygnal-Forum hast 
du probiert?
Ich hab leider mit I2C auf den SiLabs-Controllern noch nichts gemacht, 
dafür hab ich erst demnächst Verwendung.
Wie stehts denn mit den Beispielprogrammen für den F120? Hast du mal 
probiert das Multimaster-Beispielprogramm runterzuladen?

Ralf

Autor: Bernhard B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Gestern entdeckte mein Kollege den Fehler, beim Slave war im Interrupt 
die falsche SFRPAGE gesetzt. Nach korrigieren dieses Fehlers 
funktionierte die Kommunikation einwandfrei, auch bei 100MHz.

Ich bedanke mich bei euch für eure Ratschläge, Danke! :)

mfg Bernhard B.

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.