I2C STM32F407IG MCP23016

OP #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:
OP #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
  }
OP #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

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.

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.