[STM32F4] STM32F446RET 使用 CubeMX 接收 SPDIF 数据异常

[复制链接]
18|0
lvluoo 发表于 2026-9-2 11:34 | 显示全部楼层 |阅读模式
我在 STM32F446RET 上做 SPDIF 数据接收,PB7 作为 SPDIFRX 输入引脚。输入引脚处可以观测到干净完整的 SPDIF 波形。整个工程由 CubeMX 完成配置,并且生成了中断接收相关代码,从生成的代码表面看没有明显错误。主要配置代码如下:

hspdif.Instance = SPDIFRX;
hspdif.Init.InputSelection = SPDIFRX_INPUT_IN0;
hspdif.Init.Retries = SPDIFRX_MAXRETRIES_63;
hspdif.Init.WaitForActivity = SPDIFRX_WAITFORACTIVITY_ON;
hspdif.Init.ChannelSelection = SPDIFRX_CHANNEL_A;
hspdif.Init.DataFormat = SPDIFRX_DATAFORMAT_LSB;
hspdif.Init.StereoMode = SPDIFRX_STEREOMODE_ENABLE;
hspdif.Init.PreambleTypeMask = SPDIFRX_PREAMBLETYPEMASK_ON;
hspdif.Init.ChannelStatusMask = SPDIFRX_CHANNELSTATUS_ON;
hspdif.Init.ValidityBitMask = SPDIFRX_VALIDITYMASK_ON;
hspdif.Init.ParityErrorMask = SPDIFRX_PARITYERRORMASK_ON;
if (HAL_SPDIFRX_Init(&hspdif) != HAL_OK)
{
  Error_Handler();
}

// GPIO初始化
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF8_SPDIFRX;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/* SPDIFRX中断初始化 */
HAL_NVIC_SetPriority(SPDIF_RX_IRQn, 0, 5);
HAL_NVIC_EnableIRQ(SPDIF_RX_IRQn);


全局中断与 SPDIF 外设中断均已开启,调用下面函数启动中断方式数据接收:

if (HAL_SPDIFRX_ReceiveDataFlow_IT(&hspdif,recvBuffer,8)==HAL_OK)
{
spdifRecvComplete=0;
}

接收完成回调函数:

void HAL_SPDIFRX_RxCpltCallback(SPDIFRX_HandleTypeDef *hspdif)
{
spdifRecvComplete=1;
}
整套代码基本就是很常规的逻辑,使用 HAL 接口的中断数据传输功能。

但是这个回调函数不会被调用。底层中断服务函数`SPDIF_RX_IRQHandler()`同样不会进入。有一点很奇怪我能看到`SPDIF_RX_IRQHandler()`这个函数及其定义,但找不到它在哪里被声明成中断处理函数,也找不到把该函数指针写入 IRQ 硬件寄存器的地方。

SPDIF 输入信号波形完好。唯一特殊之处信号采样时钟是 100kHz,并非 96kHz、192kHz 这类常见采样率。
为什么接收不到任何 SPDIF 数据?

您需要登录后才可以回帖 登录 | 注册

本版积分规则

196

主题

222

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0