Bitte um Hilfe: Sitronix ST7541

Gast #405763
Lesenswert?

Hallo

Benötige dringend Hilfe

Ich habe da ein Problem mit einem Sitronix ST7541:

Das Display an sich funktioniert zwar, aber wenn im gleichen I2C Bus
noch ein anderes IC ist haben wir das folgende verhalten (In unserer
Anwendung ist noch ein Eeprom im gleichen I2C Bus):

 - Wenn das Eeprom adressiert ist und aus dem Eeprom das Byte 0x78
(=Slave Adresse des Displays) gelesen wird, fühlt sich das Display
adressiert und die folgenden Daten, die aus dem Eeprom gelesen werden,
werden dann auch auf dem Display angezeigt.

 Auch der folgende Code zeigt dies:



    I2CStart ();
    c8I2CWriteByte (0x55);  // Dummy Byte
    c8I2CWriteByte (0x78);  // LCD slave address
    c8I2CWriteByte (0x40);
    c8I2CWriteByte (0xFF);
    c8I2CWriteByte (0xFF);
    I2CStop();

Obwohl nach der Startsequenz zuerst ein 0x55 gesendet wird und somit
nur das IC mit dieser Adresse adressiert sein sollte, generiert das
Display nach dem senden des zweiten Bytes (0x78) ein Acknowledge und
übernimmt dann alle folgenden Daten.

Gruss + Danke

Seyhan
Gast #405765
Lesenswert?

0x55 ist nur ein Beispiel. Denn nach der I2C Startsequenz sollte jede
andere Slaveadresse als diejenige des LCD (0x78 und 0x79) bewirken,
dass das LCD die folgenden I2C Daten ignoriert bis die nächste
Startsequenz eintritt.
Unser Eeprom hat die Adresse 0xA0 und 0xA1, der Fehler tritt genau so
auf wie mit 0x55 als Slaveadresse

Grüsse
Gast #405768
Lesenswert?

Hallo

Benötige dringend Hilfe

Ich habe da ein Problem mit einem Sitronix ST7541:

Das Display an sich funktioniert zwar, aber wenn im gleichen I2C Bus
noch ein anderes IC ist haben wir das folgende verhalten (In unserer
Anwendung ist noch ein Eeprom im gleichen I2C Bus):

 - Wenn das Eeprom adressiert ist und aus dem Eeprom das Byte 0x78
(=Slave Adresse des Displays) gelesen wird, fühlt sich das Display
adressiert und die folgenden Daten, die aus dem Eeprom gelesen werden,
werden dann auch auf dem Display angezeigt.

 Auch der folgende Code zeigt dies:



    I2CStart ();
    c8I2CWriteByte (0x55);  // Dummy Byte
    c8I2CWriteByte (0x78);  // LCD slave address
    c8I2CWriteByte (0x40);
    c8I2CWriteByte (0xFF);
    c8I2CWriteByte (0xFF);
    I2CStop();

Obwohl nach der Startsequenz zuerst ein 0x55 gesendet wird und somit
nur das IC mit dieser Adresse adressiert sein sollte, generiert das
Display nach dem senden des zweiten Bytes (0x78) ein Acknowledge und
übernimmt dann alle folgenden Daten.

Gruss + Danke

Seyhan
Gast #405770
Lesenswert?

Schonmal den I²C-Bus analysiert? Ich fahre die Geschwindigkeit bei
solchen Fällen auf 0,5 bis 1 Hz herunter, dann kann man die einzelnen
Bits mit zwei Leuchtdioden an SDA und SCL sehen. Damit sollte sich eine
Startbedingung, die irgendwo nicht hingehört, finden lassen. Ich tippe
auch auf eine Startbedingung zuviel.
Die c8I2CWriteByte() - Funktion solltest Du auch mal posten, vielleicht
ist da ser Wurm drin.
Es wäre auch sinnvoll, wenn Du mal kurz beschreibst, was Du alles
bisher überprüft hast, sonst stochert man im Dunkeln.
Gast #405772
Lesenswert?

Hallo zusammen

Leider auch nichts;

Den i2C BUS habe ich genau analysiert. Ich habe den Signalverlauf auch
auf dem Oszilloskop angeschaut und nach einer Startbedingung gesucht
und ich habe das Programm im Einzelschritt durchlaufen, aber keine
Startsequenz gefunden. Und wie gesagt, mit einem anderen LCD Kontroller
funktioniert es.
Hier noch die WriteByte Funktion:



/*---------------------------------------------------------------------- 
-------
 * Function     : (EXTERNAL)   c8I2C_WriteByte
 * Description  : Schreibt ein Byte über die I2C Schnittstelle
 *
 * Parameter    :  card8 c8Data        | Datenbyte
 * Return Value :  card8 c8ReturnValue | TRUE, FALSE

*----------------------------------------------------------------------- 
---
*/
card8 c8I2CWriteByte (card8 c8Data)
{
  card8 i;
  card8 c8Status = TRUE;

  // Byte senden
  SDA_MODE = OUTPUT;
  for (i=0;i<8;i++)
  {
    // Bit bereitstellen
    if(c8Data & 0x80)
      SDA = HIGH;
    else
      SDA = LOW;

    c8Data <<= 1;

    // SCL Puls Generieren
    SCL = HIGH;
    //_NOP ();
    SCL = LOW;
  }

  // Acknowledge Empfangen
  asm("nop");
  SDA_MODE = INPUT;
  SCL      = HIGH;
  while(i-- > 5);
  if (SDA == HIGH) c8Status = FALSE;
  SCL      = LOW;
  asm("nop");
  asm("nop");
  SDA      = HIGH;
  SDA_MODE = OUTPUT;

  return c8Status;
}

Ich werde nun eine Liste von allen bereits geprüften und beachteten
Dingen zusammen.

Grüsse + Danke

Seyhan
Gast #405790
Lesenswert?

Also, fassen wir mal zusammen:
- Der Sitronix-Controller funktioniert nicht.
- Ein anderer Controller tut aber.

Ergo: Problem liegt beim Sitronix-Controller.

- keine Hilfe von Sitronix zu erwarten

Ergebnis: Das Ding wegwerfen.


Das einzige, was mir noch einfällt: Könnte es sein, dass der Controller
eine zusätzliche Select (oder Enable) - Leitung hat?

Ansonsten sehe ich mehr als schwarz für Dich. Es könnte theoretisch
auch sein, dass Sitronix den I²C-Bus nur unvollständig implementiert
hat und keine weiteren Devices auf dem gleichen Bus duldet. Aber ohne
eine Information seitens Sitronix wirst Du da rumprobieren können bis
zum St.-Nimmerleins-Tag.
Ein erweiterter Workaround: Mit einem PCF8574 und einem 4066 den Bus
zwischen EEProm und Display umschalten. Das braucht keine zusätzlichen
Portpins.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren