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