STM32 SPI HAL Error

OP #6389207
Lesenswert?
• ▲
▼
STM32F103RBT Nucleo-Board
Hallo zusammen,
wie die Überschrift schon sagt habe ich beim auslesen eines MCP33131-10 
ADC's ein Problem. Es soll ein 16bit Wert, über HAL_SPI_Receive, 
ausgelesen werden. Jedoch bekomme ich immer einen HAL_Error als 
Rückgabewert.
Die Funktion funktioniert aber soweit, soll heißen ich bekomme meinen 
Wert korrekt ausgelesen.
1
/* SPI1 init function */
2
void MX_SPI1_Init(void)
3
{
4

5
  hspi1.Instance = SPI1;
6
  hspi1.Init.Mode = SPI_MODE_MASTER;
7
  hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
8
  hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
9
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
10
  hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
11
  hspi1.Init.NSS = SPI_NSS_SOFT;
12
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
13
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
14
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
15
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
16
  hspi1.Init.CRCPolynomial = 10;
17
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
18
  {
19
    Error_Handler();
20
  }
21

22
}
23

24
uint16_t mcp331Receive(uint8_t channel)
25
{
26
  //uint8_t data[2];
27
  uint16_t val;
28
  
29
  //HAL_GPIO_WritePin(GPIOC, LED_DEBUG_Pin, GPIO_PIN_SET);
30
  // Get Data
31
  for(uint8_t i=0; i<3; i++)
32
  {
33
    // Initiate conversion process
34
      switch(channel)
35
      {
36
        case CH_OFF:
37
          HAL_GPIO_WritePin(GPIOA, ADC_CS_1_Pin|ADC_CS_2_Pin|ADC_CS_3_Pin, GPIO_PIN_RESET);
38
        break;
39

40
        case CH_1 ... CH_4:
41
          HAL_GPIO_WritePin(GPIOA, ADC_CS_1_Pin, GPIO_PIN_SET);
42
        break;
43

44
        case CH_5 ... CH_8:
45
          HAL_GPIO_WritePin(GPIOA, ADC_CS_2_Pin, GPIO_PIN_SET);
46
        break;
47

48
        case CH_9:
49
          HAL_GPIO_WritePin(GPIOA, ADC_CS_3_Pin, GPIO_PIN_SET);
50
        break;
51

52
        default:
53
          HAL_GPIO_WritePin(GPIOA, ADC_CS_1_Pin|ADC_CS_2_Pin|ADC_CS_3_Pin, GPIO_PIN_RESET);
54
        break;
55
      }
56

57

58
      // Wait 2,5µs for conversion finish
59
      for(uint8_t i=0; i<=15; i++){  };
60

61

62
      // Reset ADC_CS Pin for start receiving data
63
      HAL_GPIO_WritePin(GPIOA, ADC_CS_1_Pin|ADC_CS_2_Pin|ADC_CS_3_Pin, GPIO_PIN_RESET);
64

65
  }
66

67
  if (HAL_SPI_Receive(&hspi1, (uint8_t*)&val, 1, 10) != HAL_OK)
68
    Error_Handler();
69

70

71
  return val;
72
}

Wie man sieht betreibe ich den SPI im RX-Only Master Mode, da ich MOSI 
nicht benötige. Gleichzeitig benötigt der MCP33131 am SDI Pin (MOSI) ein 
High im Normalbetrieb, welhalb ich den Pin als Ausgang konfiguriert habe 
und auf High lege. Wenn ich das SPI Interface auf Master-Fullduplex 
stelle, bekomme ich diesen merkwürdigen Fehler nicht. Dafür bekomme ich 
aber meine Daten nicht da MOSI nicht auf HIGH liegt. :/

Der ADC ist ein Sonderling was den Betrieb der CS Leitung angeht. Bei 
steigender Flanke wird das Sampling gestartet und nach der minimalen 
Conversion time ~2,5µs wird eine fallende Flanke zum auslesen benötigt.

Hat jemand sowas schon beobachten können oder weis woran das liegen 
könnte?
Angehängte Dateien:

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.