Forum: Mikrocontroller und Digitale Elektronik 8x8 g click mit STM32


von Srdjan S. (srdjan99)


Angehängte Dateien:

Lesenswert?

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
von Ja (Gast)


Lesenswert?

Du schreibst keine Daten. Kauf dir einen USB-Logikanalyser für 10 Euro 
und benutze ihn mit PulseView (sigrok).

von A. B. (Gast)


Lesenswert?

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

von PittyJ (Gast)


Lesenswert?

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;
}

von Srdjan S. (srdjan99)


Lesenswert?

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 :)

von Stefan F. (Gast)


Lesenswert?

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.

von Srdjan S. (srdjan99)


Angehängte Dateien:

Lesenswert?

Hoffentlich ist es jetzt mehr ersichtlich

von Stefan F. (Gast)


Lesenswert?

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.

von Srdjan S. (srdjan99)


Angehängte Dateien:

Lesenswert?

Wäre das eine Hilfe?

von Stefan F. (Gast)


Lesenswert?

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.

von Srdjan S. (srdjan99)


Angehängte Dateien:

Lesenswert?

Diesen HAL Code brauchst du?

von Stefan F. (Gast)


Lesenswert?

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.

von Harry L. (mysth)


Angehängte Dateien:

Lesenswert?

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
von Srdjan S. (srdjan99)


Lesenswert?

Okay danke,
mit dem maxinit() sollte ja aber wenigstens der Testmodus aktiviert 
werden, funktioniert aber nicht oder ist das anders zu bewältigen?

von Stefan F. (Gast)


Lesenswert?

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.

von Harry L. (mysth)


Lesenswert?

Der MAX9219 läuft nicht oder nur extrem unzuverlässig mit 3,3V 
Signalpegel!

von Srdjan S. (srdjan99)


Lesenswert?

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!

von Srdjan S. (srdjan99)


Lesenswert?

Er läuft laut dem Reference Manual glaub ich eh auf 5V

von Stefan F. (Gast)


Lesenswert?

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.

von Srdjan S. (srdjan99)


Lesenswert?

Asooo okay danke.
Ich danke euch sehr für all die Hilfe! Jetzt versteh ich auch ein 
bisschen mehr, was da alles abgeht

von Srdjan S. (srdjan99)


Lesenswert?

Das funktioniert nicht, da ich kein gpio.h habe

von Harry L. (mysth)


Lesenswert?

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.

von Srdjan S. (srdjan99)


Lesenswert?

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
Noch kein Account? Hier anmelden.