MAX7219 > Bytes und Timing

#7798065
Lesenswert?

Hallo Community,

ich habe gerade eine 4 x (8x8) Anzeige vor mir auf Basis vom MAX7219. Sprich für jede 8x8 Anzeige einen MAX7219, das was man halt so aus China bekommen kann.

Das sind die Daten die, die 4 x MAX7219 (kaskadiert) bekommen (laut Code..)

1
uint8_t buff[][16] = 
2
{
3
  {0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00},
4
  {0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00},
5
  {0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00},
6
  {0x01, 0x81, 0x02, 0x81, 0x03, 0x81, 0x04, 0x81, 0x05, 0x81, 0x06, 0x81, 0x07, 0x81, 0x08, 0x81},
7
};
8

9
for (size_t i = 0; i < 4; i++)
10
{
11
  for (size_t x = 0; x < 16; x = x+2 )
12
  {
13
    spi_write_word( buff[i][x] << 8 | buff[i][x+1] );
14
  }
15
}

Auf dem Foto "snip_1" ist ein Datenpaket mitgeschnitten. Auf dem anderen Foto sieht man die Anzeige was sie mit dem Code anzeigt.

Anzeige_1: buff[0] Anzeige_2: buff[1] Anzeige_3: buff[2] Anzeige_4: buff[3]

Wie man auf dem Foto mit der Anzeige sieht, zeigt sie nicht das an was eigentlich via. Code vorgegeben wird oder habe ich einen Denkfehler?

Angehängte Dateien:
(Firma: Jasinski) #7798150
Lesenswert?

Jan H. schrieb:

Wie man auf dem Foto mit der Anzeige sieht, zeigt sie nicht das an was eigentlich via. Code vorgegeben wird oder habe ich einen Denkfehler?

Du solltest Dich erstmal mit einem MAX7219 beschäftigen und den voll beherrschen, erst danach kann man zu einem zweiten greifen und sich überlegen, wie die Datenpakete dann verschickt werden müssen. Darüberhinaus muss jeder MAX vor dem Gebrauch entsprechend initialisiert bzw. auf den entsprechenden Betriebsmodus eingestellt werden – den Scanlimit, die Helligkeit und vor allem den Dekodiermodus sollte man schon vorher einstellen. Das richtige Latchen der Daten ist sehr wichtig – wenn man von einem MAX auf zwei wechselt, wird man den Denkfehler in der Regel selbst erkennen, aber – wie ich bereits sagte – erstmal nur einen MAX gut in den Griff bekommen.

#7798167
Lesenswert?

Gregor J. schrieb:

Jan H. schrieb:

Wie man auf dem Foto mit der Anzeige sieht, zeigt sie nicht das an was eigentlich via. Code vorgegeben wird oder habe ich einen Denkfehler?

Du solltest Dich erstmal mit einem MAX7219 beschäftigen und den voll beherrschen, erst danach kann man zu einem zweiten greifen und sich überlegen, wie die Datenpakete dann verschickt werden müssen. Darüberhinaus muss jeder MAX vor dem Gebrauch entsprechend initialisiert bzw. auf den entsprechenden Betriebsmodus eingestellt werden – den Scanlimit, die Helligkeit und vor allem den Dekodiermodus sollte man schon vorher einstellen. Das richtige Latchen der Daten ist sehr wichtig – wenn man von einem MAX auf zwei wechselt, wird man den Denkfehler in der Regel selbst erkennen, aber – wie ich bereits sagte – erstmal nur einen MAX gut in den Griff bekommen.

Mehr als Geschwafel lese ich jetzt hier nicht. Initialisiert sind sie, Testmodus kann ich auch für alle aktivierten bzw. deaktivieren. Nur gezielt einzeln halt nicht. Schicke ich zwei Byte raus (Adresse und Kommando) fühlen sich trotzdem alle angesprochen obwohl es nur 16 Takte gibt..

#7798526
Lesenswert?

Jan H. schrieb:

Initialisiert sind sie, Testmodus kann ich auch für alle aktivierten bzw. deaktivieren. Nur gezielt einzeln halt nicht. Schicke ich zwei Byte raus (Adresse und Kommando) fühlen sich trotzdem alle angesprochen obwohl es nur 16 Takte gibt..

Ein Schaltplan wäre jetzt gut.

Normalerweise sind die MAX7219 so verdrahtet, dass CS und SCK parallel zu allen vieren geht. MOSI vom uC geht zum DIN vom ersten, DOUT vom ersten zum DIN vom zweiten etc, und DOUT vom letzten geht zum MISO vom uC.

Schreiben: CS=0 spi_write(address); spi_write(data_4); spi_write(address); spi_write(data_3); spi_write(address); spi_write(data_2); spi_write(address); spi_write(data_1); CS=1

Also: CS=0 startet den Zyklus. Die Daten (Adresse und Daten) vom letzten Display müssen zuerst gesendet werden, und dann reihum die anderen. Mit einem abschließenden CS=1 werden alle Daten übernommen.

So. Das war der erste große Fehler. Der zweite war, dass ich in Deinem Code keine Zugriffe auf Register 9 bis 12 gesehen habe. Die müssen beschrieben werden, bevor Du daran denken kannst, überhaupt etwas anderes zu machen.

fchk

#7798571
Lesenswert?

Schaltplan habe ich leider nicht. Ist auch nicht so einfach zu bekommen von den China Männern. Die sind wie Du schon beschrieben hast verdrahtet und kaskadiert.

Um es zu verstehen > Das erste Byte was gesendet wird ist die Register Adresse, das zweite sind die eigentlichen Daten. Das ganze ist für das letzte Display bzw. MAX7219. Nach den zwei Bytes muss ein Latch erfolgen.

Möchte ich jetzt die erste Anzeige und die letzte mit Pixel Daten versorgen, sollte das ganze so aussehen

1
 
2
D_1.    D_2.    D_3.    D_4
3
0x01FF, 0x0000, 0x0000, 0x01FF; //0x0000 = Chip soll nichts machen
4
0x08FF, 0x0000, 0x0000, 0x08FF; // letzte Reihe (0x08FF) einschalten

Habe ich das richtig verstanden?

#7798573
Lesenswert?

Frank K. schrieb:

So. Das war der erste große Fehler. Der zweite war, dass ich in Deinem Code keine Zugriffe auf Register 9 bis 12 gesehen habe. Die müssen beschrieben werden, bevor Du daran denken kannst, überhaupt etwas anderes zu machen.

In dem zweiten Bild kann man die Funktionen sehen die, die 4 x IC´s initialisieren, ob sie richtig init. werden habe ich mit der "Display Test" Funktion gegen geprüft.

#7798623
Lesenswert?

Jan H. schrieb:

Habe ich das richtig verstanden?

Nein. Deine Betrachtung gilt nur für einen Chip.

Bei kaskadierten Chips musst Du immer alle auf einmal mit Daten versorgen und dann latchen, dh 4*16 bit=64 bit senden. SPI ist quasi ein Schieberegister. Wenn Du mehr als 16 bit sendest, kommen die zuerst gesendeten Bit bei DOUT vom ersten Chip wieder raus und in den zweiten. Nach 64 Bits sind alle Schieberegister mit frischen Daten versorgt. Erst jetzt darfst Du CS wieder hochnehmen.

fchk

#7798689
Lesenswert?

Frank K. schrieb:

Jan H. schrieb:

Habe ich das richtig verstanden?

Nein. Deine Betrachtung gilt nur für einen Chip.

Bei kaskadierten Chips musst Du immer alle auf einmal mit Daten versorgen und dann latchen, dh 4*16 bit=64 bit senden. SPI ist quasi ein Schieberegister. Wenn Du mehr als 16 bit sendest, kommen die zuerst gesendeten Bit bei DOUT vom ersten Chip wieder raus und in den zweiten. Nach 64 Bits sind alle Schieberegister mit frischen Daten versorgt. Erst jetzt darfst Du CS wieder hochnehmen.

fchk

Super, jetzt scheint es zu funktionieren. Das latchen war ein Problem. Vielen Dank!

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