Hallo, ich schaffe es mein 8x8 g click Modul nicht zum leuchten zu bringen. Versteht irgendwer, was am Code falsch sein könnte? Mfg
:
Bearbeitet durch User
Du schreibst keine Daten. Kauf dir einen USB-Logikanalyser für 10 Euro und benutze ihn mit PulseView (sigrok).
Wo werden denn die Pins für CLK und MOSI konfiguriert? Die müsste man wohl als PP-Ausgänge konfigurieren (oder bei Benutzung des SPI-Interfaces als "Alternate Function"). Sonst kommt von den internen Signalen an der Außenwelt nix an ...
Bei meinem STM Muss ich die SPI-Pins noch konfigurieren. Aber das ist auch ein anderer STM-Typ mit wesentlich mehr Pins. int Pin::SetToSpi (uint8_t ui_AlternateFunction) { GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = m_ui_PinBitmask; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = ui_AlternateFunction; HAL_GPIO_Init(m_p_Port, &GPIO_InitStruct); return 0; }
Wie konfiguriere ich die Pins damit sie rausgeschickt werden? Das Modul ist an und für sich an der STM draufgesteckt, also sind CLK, MOSI usw. mit dem Modul verbunden, jedoch krieg ich die Signale nicht an den MAX7219 geschickt, der ja für das Leuchten der LEDs verantwortlich ist. Danke übrigens für die Tipps, von dir und von euch anderen :)
Ja schrieb: > Du schreibst keine Daten. Solange du die Schnittstelle nur initialisierst ohne die LED konkret anzusteuern wird keine leuchten. Srdjan S. schrieb: > Wie konfiguriere ich die Pins damit sie rausgeschickt werden? Meinst du damit, sie als Ausgang zu konfigurieren? Den Code sollte Cube MX generieren, ich sehe ihn aber nicht. PittyJ schrieb: > Bei meinem STM Muss ich die SPI-Pins noch konfigurieren. Irgendwo muss auf AFSEL auftauchen, um die Pins mit dem SPI Port zu verbinden. Zeige doch mal die *.ioc Datei, dammit wir nachvollziehen können, was du konfiguriert hast. Das Bildchen ganz oben reicht nicht.
Srdjan S. schrieb: > Hoffentlich ist es jetzt mehr ersichtlich Leider nicht, aber dafür kannst du nichts. Meine IDE hängt sich immer wieder auf, wenn ich diese Datei öffne. Ich habe deswegen ein Upgrade versucht, aber immer noch das gleiche Problem.
Srdjan S. schrieb: > Wäre das eine Hilfe? Nein. Eigentlich versuche ich herauszufinden, ob die IO Pins richtig konfiguriert werden. Dazu muss ich auch in den generierten Quelltext und den Quelltext der HAL schauen und das mit dem Reference Manual vergleichen. Daran scheitere ich gerade.
Ich habe das Repository Verzeichnis gelöscht so dass er die HAL neu herunterladen musste. Jetzt kann ich es öffnen. Zuerst mal muss ich dir sagen, dass ich den STM32L432 noch nicht benutzt habe. Ich könnte mich also irren. In der main.c wird MX_SPI1_Init() aufgerufen, welche wiederum HSL_SPI_Init() aufruft. HAL_SPI_MspInit() is eine schwache Funktion, die durch stm32l4xx_hal_msp.c überschrieben wird. In dieser Funktion finde ich den Code, welcher die SPI Pins inklusive der alternate Funktion konfiguriert:
1 | /**
|
2 | * @brief SPI MSP Initialization
|
3 | * This function configures the hardware resources used in this example
|
4 | * @param hspi: SPI handle pointer
|
5 | * @retval None
|
6 | */
|
7 | void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) |
8 | {
|
9 | GPIO_InitTypeDef GPIO_InitStruct = {0}; |
10 | if(hspi->Instance==SPI1) |
11 | {
|
12 | /* USER CODE BEGIN SPI1_MspInit 0 */
|
13 | |
14 | /* USER CODE END SPI1_MspInit 0 */
|
15 | /* Peripheral clock enable */
|
16 | __HAL_RCC_SPI1_CLK_ENABLE(); |
17 | |
18 | __HAL_RCC_GPIOA_CLK_ENABLE(); |
19 | __HAL_RCC_GPIOB_CLK_ENABLE(); |
20 | /**SPI1 GPIO Configuration
|
21 | PA5 ------> SPI1_SCK
|
22 | PA6 ------> SPI1_MISO
|
23 | PA7 ------> SPI1_MOSI
|
24 | PB0 ------> SPI1_NSS
|
25 | */
|
26 | GPIO_InitStruct.Pin = SCK_Pin|MISO_Pin|MOSI_Pin; |
27 | GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; |
28 | GPIO_InitStruct.Pull = GPIO_NOPULL; |
29 | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; |
30 | GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; |
31 | HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |
32 | |
33 | GPIO_InitStruct.Pin = NSS_Pin; |
34 | GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; |
35 | GPIO_InitStruct.Pull = GPIO_NOPULL; |
36 | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; |
37 | GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; |
38 | HAL_GPIO_Init(NSS_GPIO_Port, &GPIO_InitStruct); |
39 | |
40 | /* SPI1 interrupt Init */
|
41 | HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0); |
42 | HAL_NVIC_EnableIRQ(SPI1_IRQn); |
43 | /* USER CODE BEGIN SPI1_MspInit 1 */
|
44 | |
45 | /* USER CODE END SPI1_MspInit 1 */
|
46 | }
|
47 | |
48 | }
|
Weiterhin enthält main.c einen Aufruf von HAL_GPIO_Init() wo der verbleibende CS Pin konfiguriert wird. Also würde ich sagen, dass die Konfiguration der Pins in Ordnung ist. Dein Problem ist wohl eher die konkrete Kommunikation. Dazu habe ich deinem Code lediglich max_init() gefunden, welche offenbar den MAX Chip konfiguriert. Ich sehe aber keine Zeile, die dazu dienen könnte, bestimmte LEDs zum Leuchten zu bringen. Ich würde dir auch empfehlen, die Kommunikation mit einem Logic Analyzer zu überprüfen. Womöglich kommt dabei heraus, dass die 5 Konfigurationsparameter korrekt an den MAX übertragen werden. Oder auch nicht. jedenfalls weißt du dann, worauf du dich konzentrieren musst.
Der MAX7219 läst sich wunderbar durch Bitwackeln ansteuern. Code im Anhang. Da der MAX7219 5V benötigt, braucht man 5V-tolerante OpenDrain-Ausgänge und ~10k Pullups auf 5V an den Eingängen des MAX7219
:
Bearbeitet durch User
Okay danke, mit dem maxinit() sollte ja aber wenigstens der Testmodus aktiviert werden, funktioniert aber nicht oder ist das anders zu bewältigen?
Srdjan S. schrieb: > mit dem maxinit() sollte ja aber wenigstens der > Testmodus aktiviert werden, Der Kommentar sagt das Gegenteil: > // no test display Wie gesagt, kontrolliere die Kommunikation mit einem Logic Analyzer. Das kann übrigens nicht gehen:
1 | void write_byte (uint8_t byte) { |
2 | for(int i = 0; i < 8; i++) { |
3 | HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 0); // Pull the CLK LOW |
4 | HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, byte&0x80);// Write one BIT data MSB first |
5 | byte = byte<<1; // shift the data to the left |
6 | HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 1); // Pull the CLK HIGH |
7 | }
|
8 | }
|
Weil die I/O Pins mit der alternativen Funktion SPI1 verbunden sind. Du müsstest sie vom SPI trennen um sie derartig "zu Fuß" anzusteuern.
Habe vergessen den Kommentar zu ändern haha, mit dem 0x01 sollte der Testmodus ja aktiviert sein. Zur Funktion: Verstehe, mit HAL_GPIO_WritePin komme ich also gar nicht weiter, wenn ich SPI benutze, also am besten mit HAL_SPI_Transmit? Und vielen Dank für die Hilfe!
Srdjan S. schrieb: > Er läuft laut dem Reference Manual glaub ich eh auf 5V Aber dein STM32 liefert nur 3,3 Volt Signale. Ich mal mal gelesen, dass man die 5V toleranten Ausgänge auf Open-Drain umkonfigurieren kann und dann mit einem Widerstand über 3,3V hinaus auf 5V ziehen kann. Aber ob das auch in Kombination mit SPI funktioniert, weiß ich nicht. Dabei hat man dann bestimmt auch Einschränkungen bezüglich der Übertragungsrate. Nachtrag: Ich sehe gerade dass Harry schon darauf hinwies.
Asooo okay danke. Ich danke euch sehr für all die Hilfe! Jetzt versteh ich auch ein bisschen mehr, was da alles abgeht
Srdjan S. schrieb: > Das funktioniert nicht, da ich kein gpio.h habe Ersetz die einfach durch die main.h! Ich hab andere Einstellungen in CubeMX.
Das 8x8 Click funktioniert noch immer nicht, habe mit meinem Lektor die Config durchgeschaut (sowohl Pin als auch Clock und SPI), da hat alles gepasst. Ich finde den Fehler im Code einfach nicht. Ich habe den Testmode einmal zum Laufen gebracht und dann hat sich nichts mehr getan, der Testmode funktioniert auch nicht mehr, obwohl nichts am Code geändert wurde. Bitte um Hilfe.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.