STM32 SPI Test mit MCP4802

Gast #6999721
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
Gast #6999877
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".

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.