mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MAX7219 mit STM32 ansteuern - Software SPI


Autor: Max MMM (maxmicr)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche gerade, eine 8x8 LED Matrix, die von einem MAX7219 
gesteuert wird, mit einem STM32F103 via Software SPI anzusteuern.

Nach dem Datenblatt wird der an DIN anliegende Pegel bei der steigenden 
Flanke der Clock-Leitung in das Register geschoben. CS muss dabei low 
sein. Nachdem 16 bits übertragen wurden, geht CS high direkt oder nach 
der 16. steigenden Flanke von CLK.

Das hier ist mein Code:
#define CS 4
#define SCK 5
#define MOSI 7

void initSPI(){
  RCC->APB2ENR |= (1<<2); //Enable Port A clock
  GPIOA->CRL |= (0x3<<(4*CS)); //General PP & 50MHz speed for PA4 (CS)
  GPIOA->CRL |= (0x3<<(4*SCK)); //General PP & 50MHz speed for PA5 (SCK)
  GPIOA->CRL |= (0x3<<(4*MOSI)); //General PP & 50MHz speed for PA7 (MOSI)
}

void transmitData(uint16_t reg, uint16_t data){
  uint16_t serialData = (reg << 8) | (data & 0x00FF); //Last Bit First
  GPIOA->ODR &=~(1<<SCK); //Turn SCK low
  GPIOA->ODR &=~(1<<MOSI); //Turn MOSI low
  GPIOA->ODR &=~(1<<CS); //Turn CS low
  delay(10);
  for(int i = 0; i < 16; i++){
    if((serialData >> (15-i)) & 0x0001){ //Bit is '1'
      GPIOA->ODR |= (1<<MOSI); //Turn MOSI high
    } else{
      GPIOA->ODR &=~(1<<MOSI); //Turn MOSI low
    }
    GPIOA->ODR |= (1<<SCK); //Turn SCK high
    if(i == 15){
      GPIOA->ODR |= (1<<CS); //Turn CS high
    }
    delay(10);
    GPIOA->ODR &=~(1<<MOSI); //Turn MOSI Low
    GPIOA->ODR &=~(1<<SCK); //Turn SCK low
  }

  delay(10);
  GPIOA->ODR |= (1<<SCK); //Turn SCK high
  delay(50);
}

int main(void)
{
  initSPI();
  uint8_t reg = 0x0F;
  uint16_t data = 0x01;
  while(1){
    transmitData(reg,data);
  }
}

Zum Testen wollte ich den Display-Test Befehl durchführen, bei dem alle 
LEDs leuchten sollen.
PA4 ist mit CS verbunden.
PA5 mit CLK und PA7 mit DIN.
Leider tut sich gar nichts (bzw. das Panel leuchtet schon allerdings 
nicht mit allen LEDs). Das Ergebnis des Logic Analyzer stimmt mich 
eigentlich positiv. Was mache ich falsch?

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prüfe mal die Zeiten aus dem Datenblatt...

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, schau die auch das RefMan des Controllers an, insbesondere 
GPIOA->BSRR :-)

Autor: Gerald B. (gerald_b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Macht der MAX mit der LED-Matrix denn an einem Atmega was er soll?
Es gibt da Fälschungen aus China, die funktionieren und es gibt auch 
welche, die es nicht tun.
Entweder du hast einen MAX7219 aus vertrauenswürdiger Quelle oder ich 
würde das versuchsweise querchecken. Nicht, das du versuchst ein 
Leergehäuse zur Funktion zu überreden...

Autor: Max MMM (maxmicr)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Dennis schrieb:
> Prüfe mal die Zeiten aus dem Datenblatt...

Danke für den Hinweis, die Zeit zwischen der DIN-Flanke und der 
CLK-Flanke erschien mir etwas kurz, die hab ich jetzt verlängert. Zudem 
fällt CS nun erst nach der 16. Flanke von CLK. Von den Zeiten müsste das 
allemal passen, die längste Zeit ist 100ns. Leider tut sich trotzdem 
nichts :(

Gerald B. schrieb:
> Macht der MAX mit der LED-Matrix denn an einem Atmega was er soll?
> Es gibt da Fälschungen aus China, die funktionieren und es gibt auch
> welche, die es nicht tun.
> Entweder du hast einen MAX7219 aus vertrauenswürdiger Quelle oder ich
> würde das versuchsweise querchecken. Nicht, das du versuchst ein
> Leergehäuse zur Funktion zu überreden...

Ich hab die LED Matrix in der Tat aus China bestellt. Der IC sieht von 
außen von der Schrift her aber echt aus (sofern ich das als Laie 
beurteilen kann).

Dennis schrieb:
> Achso, schau die auch das RefMan des Controllers an, insbesondere
> GPIOA->BSRR :-)

Spielst du damit auf mein wildes hin- und her Geschalte der einzelnen 
Pins an?

: Bearbeitet durch User
Autor: Gerald B. (gerald_b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
googele mal nach MAX7219 fake.
Hier ist u.a. was dazu mit Bildern: 
http://forum.arduino.cc/index.php?topic=233109.0
Ich hatte dazu aber schon mal eine andere Quelle gefunden, wo das 
losging. Da hatte jemand akribisch sich damit auseinandergesetzt.
Logo passt nicht, Pin 1 Markierung passt nicht, halber 1. u. letzter 
Pin, Gewichtsunterschied usw...
Wobei ich Chinaplatinen habe die funktionieren. Es soll aber eben auch 
welche geben, die nicht gehen.

Autor: Max MMM (maxmicr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat hier vielleicht jemand zufällig einen STM32 und eine LED-Matrix mit 
dem MAX7219 und möchte meinen Code ausprobieren?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.