参考资料: 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 也都可以吧。
|