I2C STM32F407IG MCP23016

#3380186
Lesenswert?

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:
#3380583
Lesenswert?

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
  }
#3382191
Lesenswert?

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

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