Forum: Mikrocontroller und Digitale Elektronik STM32 SPI HAL Error


von Michael S. (damicha82)


Angehängte Dateien:

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
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.