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?