Forum: Mikrocontroller und Digitale Elektronik STM32 SPI HAL Error


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Michael S. (damicha82)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.