MAX7219 mit STM32 ansteuern - Software SPI

OP #4731032
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?
Angehängte Dateien:
OP #4731054
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?
Angehängte Dateien:
#4731061
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.

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