Forum: Mikrocontroller und Digitale Elektronik STM32 SPI Test mit MCP4802


von Michael (Gast)


Lesenswert?

Hallo,

ich will gerade die SPI Schnittstelle eines STM32F103 mit einem externen 
2-Kanal DAC (MCP4802) testen (SPI Mode 0). Dabei habe ich ein 
unerwartetes Verhalten festgestellt.

Mit dem folgenden Codeschnipsel sollten eigentlich 2 versetzte 
Sägezahnspannungen an Kanal A und Kanal B erzeugt werden. Ich habe 
festgestellt, dass der Codeteil funktioniert wenn zwischen den beiden 
Befehlen (Kanal A + Kanal B) die Chip-Select Leitung (sehr) kurz auf HI 
gesetzt wird (IF-Statement = true).

Wenn die Chip-Select Leitung jedoch zwischen den beiden Übertragungen 
auf LO bleibt, dann funktioniert lediglich der Kanal A (IF-Statement = 
false).

Bei der SPI Kommunikation sollten die Flanken der Chip-Select Leitung 
doch keine Rolle Spielen. Wichtig sollte doch lediglich sein, dass die 
Leitung während der Kommunikation auf LO Potential liegt.

Verstehe ich da etwas falsch? Könnte mir das bitte jemand kurz erklären 
oder mir einen Tipp geben?
1
  uint8_t val = 0;
2
3
  while (1)
4
  {
5
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET); // Setze CS-Pin auf LO
6
    cmd[0] = DAC_A_GAIN_1 | (val & 0x0F);
7
    cmd[1] = 0;
8
    HAL_SPI_Transmit(&hspi1, (uint8_t*) &cmd, 2, 100);       // Sende Befehl für Kanal A
9
    if (1) {
10
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);   // Setze CS-Pin auf HI
11
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET); // Setze CS-Pin auf LO
12
    }
13
    else {
14
      HAL_Delay(1); // Warte 1ms
15
    }
16
    cmd[0] = DAC_B_GAIN_1 | ((val + 8) & 0x0F);
17
    cmd[1] = 0;
18
    HAL_SPI_Transmit(&hspi1, (uint8_t*) &cmd, 2, 100);  // Sende Befehl für Kanal B
19
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET); // Setze CS-Pin auf HI
20
    HAL_Delay(200);
21
    val += 1;
22
  }

Liebe Grüße
Michael

von A. B. (Gast)


Lesenswert?

Die Flanken spielen sehr wohl eine wichtige Rolle für die 
Interpretation der Daten. Was während der aktiven Phase von CS (ohne 
Flanken drin) übertragen wird, ist EIN Paket, typischerweise ist das 
erste Byte davon ein Kommando, Adresse, und danach kommen die 
zugehörigen Daten.
Wenn CS inaktiv wird, ist das Paket zuende, also ein Zugriff 
abgeschlossen.
Wenn es dann wieder aktiv wird, ist das ein neues "Spiel".

von jo mei (Gast)


Angehängte Dateien:

Lesenswert?

Michael schrieb:
> Verstehe ich da etwas falsch?

Würde es Sinn machen das Datenblatt des Bausteins zu lesen
und zu verstehen?

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.