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?