Ich versuche hier, mit einem STM32F466RE einen SPDIF-Datenstrom an PB7
zu empfangen. Der Code ist mit CubeMX erzeugt und sollte daher
eigentlich passen, wenn ich mir ansehe, was CubeMX generiert hat, kann
ich keinen offensichtlichen Fehler erkennen. Der SPDIF-Datenstrom ist -
direkt am Eingangspin gemessen - ein perfektes und astrein sauberes
Signal. Der zugehörige sowie die globalen Interrupts sind aktiviert.
Trotzdem wird nichts empfangen, die Receive-Interruptfunktion wird nie
aufgerufen:
1 | void HAL_SPDIFRX_RxCpltCallback(SPDIFRX_HandleTypeDef *hspdif)
|
2 | {
|
3 | spdifRecvComplete=1;
|
4 | }
|
Die Initialisierung von CubeMX sieht inklusive des Pinmappings so aus
(zumindest die relevanten Teile, der Rest ist ja eh' der immer gleiche,
generierte Code):
1 | hspdif.Instance = SPDIFRX;
|
2 | hspdif.Init.InputSelection = SPDIFRX_INPUT_IN0;
|
3 | hspdif.Init.Retries = SPDIFRX_MAXRETRIES_63;
|
4 | hspdif.Init.WaitForActivity = SPDIFRX_WAITFORACTIVITY_ON;
|
5 | hspdif.Init.ChannelSelection = SPDIFRX_CHANNEL_A;
|
6 | hspdif.Init.DataFormat = SPDIFRX_DATAFORMAT_LSB;
|
7 | hspdif.Init.StereoMode = SPDIFRX_STEREOMODE_ENABLE;
|
8 | hspdif.Init.PreambleTypeMask = SPDIFRX_PREAMBLETYPEMASK_ON;
|
9 | hspdif.Init.ChannelStatusMask = SPDIFRX_CHANNELSTATUS_ON;
|
10 | hspdif.Init.ValidityBitMask = SPDIFRX_VALIDITYMASK_ON;
|
11 | hspdif.Init.ParityErrorMask = SPDIFRX_PARITYERRORMASK_ON;
|
12 | if (HAL_SPDIFRX_Init(&hspdif) != HAL_OK)
|
13 | {
|
14 | Error_Handler();
|
15 | }
|
16 |
|
17 | ...
|
18 |
|
19 | GPIO_InitStruct.Pin = GPIO_PIN_7;
|
20 | GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
21 | GPIO_InitStruct.Pull = GPIO_PULLUP;
|
22 | GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
23 | GPIO_InitStruct.Alternate = GPIO_AF8_SPDIFRX;
|
24 | HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
25 |
|
26 | /* SPDIFRX interrupt Init */
|
27 | HAL_NVIC_SetPriority(SPDIF_RX_IRQn, 0, 5);
|
28 | HAL_NVIC_EnableIRQ(SPDIF_RX_IRQn);
|
An der Funktion, die den Empfang der Daten starten sollte, ist auch
nichts dramatisch kompliziertes:
1 | if (HAL_SPDIFRX_ReceiveDataFlow_IT(&hspdif,recvBuffer,8)==HAL_OK)
|
2 | {
|
3 | spdifRecvComplete=0;
|
4 | }
|
Google hilft nicht wirklich weiter, entweder finde ich Beispielcode, der
auch nur aus CubeMX stammt, oder der für einen anderen STM32-Typen ist
und letztenendes auch keine Erkenntnisse bringt, die das Problem lösen
würden.
Das Einzige, was in meinem Fall speziell ist: die eingehenden Daten
haben 100 kHz statt 96 kHz oder 192 khz oder irgend ein anderes
Vielfaches von 24 kHz - aber ich kann nirgendwo im Handbuch erkennen,
dass das ein Problem wäre, es ist nur von einer Maxialfrequenz von 192
kHz die Rede.
Was könnte hier falsch sein/fehlen?