I2C STM32F407IG MCP23016

OP #3380186
Hallo

Ich versuche ein bestehendes Projekt in Assembler in c umzuschreiben. 
Dies bedeutet alle Funktionen hatten schon mal funktioniert.

Mein uP ist ein STM32F407IG (Master), MCP23016 ist der I2C-Bus Treiber 
(Slave). Mit diesem wird ein 2 Zeilen Textdisplay angesteuert.

Ich verwende das Beispiel DEMO von Keil und bin es am umschreiben / 
adaptieren.

Mein Sende-Befehl:
1
Display_Write(0x1, 0xC0);
2
[c/]
3
0x1 ist das Command Byte Access to GP1 des Treibers
4
0xC0 ist das Data1 Byte, es soll das Display enablen und die Hintergrundbeleuchtung einschalten. D16 u. D17 auf dem Treiber.
5
[c]
6
bool Display_Write (uint8_t reg, uint8_t val)
7
{
8
  uint8_t data[2];
9
  int32_t n;
10

11
  data[0] = reg;
12
  data[1] = val;
13
  n = ptrI2C->SendData(DISPLAY_I2C_ADDR, data, 2, false);
14
  if (n != 2) return false;
15

16
  return true;
17
}

Die Messung der Bussignale findet Ihr im Anhang.

Der Slave sendet kein ACK. Und so wird der Sendevorgang gestoppt, aber 
wieso?

Sind die Signale ungenügend und der Slave kann sie somit nicht 
empfangen?


Vielen Dank und Grüsse!

M.B.
Angehängte Dateien:
OP
Ich komm einfach nicht drauf, wieso der nicht antwortet!?
1
/* Check for error conditions */
2
  if (ptr_i2c->info->error) {
3
    if (ptr_i2c->info->error & I2C_SR1_BERR) {
4
      /* Bus error (misplaced start, stop) */
5
      ret_val = -ARM_I2C_ERROR_BUS_BUSY;
6
    }
7
    else if (ptr_i2c->info->error & I2C_SR1_AF) {
8
      /* Acknowledge failure */
9
      if (!(ptr_i2c->info->flags & FLAG_ADDR_DONE)) {
10
        /* Slave does not respond */            <--- Hier bleibt er beim debuggen haengen
11
        ret_val = -ARM_I2C_ERROR_NO_SLAVE;
12
        /* Generate stop condition */
13
        xfer_pending = false;
14
      }
15
    }
16
    else ret_val = -ARM_I2C_ERROR;
17
  }
OP
Ach mist, die Tabelle hatte ich mir schon angeschaut und dachte zuerst 
wohl Bit 3 bis seien vordefiniert und würden so gesendet zusammen mit 
den 3 usern Bits.

Hätte mir sofort auf dem KO-Bild auffallen sollen!


Vielen Dank für die Hinweise!

Grüsse

M.B.
OP
Jetzt hab ich noch ne Frage, wie man aus dem Ausschnitt des Schemas, 
dass ich oben einmal angehängt hatte, sehen kann, sind beim Display 4 
der 8 Datenbits auf Masse geschlossen. Ich hab also nur noch 4 am 
Treiber. Aus dem Schema des Displays ist zu entnehmen, dass zum Beispiel 
Zeichen 5 der 2. Zeile hat die Adresse 0xC4. Muss ich die jetzt einfach 
zusammen setzten? 1. Mal gebe ich C mit und beim 2. Mal die 4.?

Andere Frage:

E = Enable = 1!
RS = Reset?? = 0 ??
R/W_nicht = muss 0 sein zum Schreiben?

Ist meine Betrachtungsweise korrekt?

Vielen Dank und Grüsse!

M.B.
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.