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


von Max M. (maxmicr)


Angehängte Dateien:

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:
1
#define CS 4
2
#define SCK 5
3
#define MOSI 7
4
5
void initSPI(){
6
  RCC->APB2ENR |= (1<<2); //Enable Port A clock
7
  GPIOA->CRL |= (0x3<<(4*CS)); //General PP & 50MHz speed for PA4 (CS)
8
  GPIOA->CRL |= (0x3<<(4*SCK)); //General PP & 50MHz speed for PA5 (SCK)
9
  GPIOA->CRL |= (0x3<<(4*MOSI)); //General PP & 50MHz speed for PA7 (MOSI)
10
}
11
12
void transmitData(uint16_t reg, uint16_t data){
13
  uint16_t serialData = (reg << 8) | (data & 0x00FF); //Last Bit First
14
  GPIOA->ODR &=~(1<<SCK); //Turn SCK low
15
  GPIOA->ODR &=~(1<<MOSI); //Turn MOSI low
16
  GPIOA->ODR &=~(1<<CS); //Turn CS low
17
  delay(10);
18
  for(int i = 0; i < 16; i++){
19
    if((serialData >> (15-i)) & 0x0001){ //Bit is '1'
20
      GPIOA->ODR |= (1<<MOSI); //Turn MOSI high
21
    } else{
22
      GPIOA->ODR &=~(1<<MOSI); //Turn MOSI low
23
    }
24
    GPIOA->ODR |= (1<<SCK); //Turn SCK high
25
    if(i == 15){
26
      GPIOA->ODR |= (1<<CS); //Turn CS high
27
    }
28
    delay(10);
29
    GPIOA->ODR &=~(1<<MOSI); //Turn MOSI Low
30
    GPIOA->ODR &=~(1<<SCK); //Turn SCK low
31
  }
32
33
  delay(10);
34
  GPIOA->ODR |= (1<<SCK); //Turn SCK high
35
  delay(50);
36
}
37
38
int main(void)
39
{
40
  initSPI();
41
  uint8_t reg = 0x0F;
42
  uint16_t data = 0x01;
43
  while(1){
44
    transmitData(reg,data);
45
  }
46
}

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?

von Dennis (Gast)


Lesenswert?

Prüfe mal die Zeiten aus dem Datenblatt...

von Dennis (Gast)


Lesenswert?

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

von Gerald B. (gerald_b)


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...

von Max M. (maxmicr)


Angehängte Dateien:

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
von Gerald B. (gerald_b)


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.

von Max M. (maxmicr)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.