打印
[应用相关]

[学习笔记] STM32输出S/PDIF数字音频

[复制链接]
2124|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cruelfox|  楼主 | 2018-12-28 23:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
参考资料: STM32L4x6 Reference Manual, STM32F413/423 Reference Manual,STM32L4Rx Reference Manual
S/PDIF 格式(S是SONY, P是PHILIPS,由这两家联合制定)的数字音频在设备与设备之间连接用得比较多,例如CD机的数字输出到高档解码器。以前的CD随身听还可以从光纤口输出S/PDIF信号,连接到MD机进行数字转录。STM32的SAI硬件具备了S/PDIF输出功能,这是SAI支持的多种协议中一个选项(在某些型号手册上没有明确表示支持)。起用 S/PDIF 输出,在 SAI 的 xCR1 寄存器中设置 PRTCFG 位为 01 即可。注意这个格式只支持 Master Transmit 模式,因为不具备接收能力(接收S/PDIF是另外一个硬件 SPDIFRX 才能干的活),也不能由其它信号同步。




从寄存器配置的角度上,S/PDIF 格式输出比常用的 I2S 还要简单,因为格式是固定的:用24-bit 双声道PCM发送。摘录几段叙述:






关键的参数是时钟,也就是输出采样频率的决定。手册中的叙述是 "the bit clock should be twice the symbol-rate". (在我以前下载的 L4x6 参考手册里面有部分错误,下面截图来自 L4Rx的手册)

也就是说,和常用的 I2S 格式对比,同样的采样频率下,S/PDIF输出需要两倍于I2S的 SCK 时钟。

关于 SAI 内部的时钟配置,下面这张图来自 L4x6 的手册

从SAI_CK (可以是PLLSAI,PLLI2S等时钟源) 分频得到 SCK, 也可以直接使 SCK = SAI_CK 连接。我觉得 FRL 配置分频器这里画得有问题,因为下面有一句叙述

既然 MCLK/FS 恒定 256 倍,怎么允许 SCK 从 SAI_CK 任意分出来(由FRL去决定) ?按照MCLK为 256 倍FS, 以及 S/PDIF 用的 128 倍FS的SCK, 推得 SCK 应该为 MCLK 频率的一半

不过,在 L4Rx 的手册里面,图是这样的:

L4Rx 手册这个图画得更清楚。但我对比了 L4Rx 和 L4x6 手册SAI的部分,寄存器也不完全一样。应该是新的SAI硬件也有所升级了。所以在 L4Rx 上(以及更新的硬件),SAI_CK 可以直接被 MCKDIV 分频,然后作为 SCK 的输出(选择NOMCK)。
而在较老的 L476上,我发现要么 SCK=MCLK=SAI_CK (选NODIV),要么 SCK=1/4 MCLK = 1/4 SAI_CK*(1/2, 1/4, 1/6 ...), 分频关系有写别扭。

至于 F413, 手册上没有提 S/PDIF 功能:

但是我当作 L476 那样配置,在板子上试了是可以输出 S/PDIF 信号的。猜想其它 SAI 也都可以吧。
沙发
mmuuss586| | 2018-12-30 11:58 | 只看该作者
支持,感谢分享;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

50

帖子

1

粉丝