PS:之所以写这些东西,很大一部分原因是希望自己可以通过记录的方式,提高自己的理解和对整体的把握程度。
首先看AT91SAM9260与音频接口芯片的示意图,举最简单的PCM系列为例如下,
SSC的TK对应的PCM系列的BCK,TF对应的LRCK,TD对应的DATA
而对于SSC与PCM的数据通信格式,使用的是I2S
I2S的数据通信格式如右上图所示,
更清晰的可以看PCM1754文档中的图,如下,
fs对应的是采样率,学过通信的都知道奈奎斯特采样定律,对于人耳语音能听到的频率范围为20~20KHZ,所以一般情况下设置的采样频率均为44.1KHZ
对于I2S数据格式,LRCK对应的是左右声道的数据保存时钟,当LRCK为低电平时,存放的是左声道的数据,为高时,则为右声道数据。
同时,BCK,比特采样时钟,必须是48fs或者64fs,一般情况下,I2S支持的数据格式为16bit to 24 bit
这样看来,只要SSC照着I2S的数据格式发送数据,同样PCM照着这种格式接收。
先看SSC的发送
对于串口数据通信,显然是没有I2S这种数据格式的,需要通过模拟的方式来实现,具体的就是通过设置SSC的相关寄存器进行实现。
同时,音频数据的读写速度相对较快,最好使用DMA的方式,所以这里使用到了PDC
PDC,就是Peripheral DMA Controller,这里PDC的两个通道用于与SSC交互数据,
PDC主要设置8个寄存器,分别是RPR(receive point R),RCR(receive count R),RNPR(receive next point R),RNCR,TPR,TCR,TNCR,TNPR,其余的就是PTCR(xfer control R),PTSR(Xfer status R),接着就是使能时钟了
同时,PDC中断触发有四处,分别是数据发送结束,数据接收结束,接收缓存满,发送缓存空,理解这些就能更好的理解驱动
对于PDC和SSC的这些寄存器,均使用内存映射的方式是实现对寄存器的操作。
SSC中还有一个时钟没有说明,就是SCLK,系统时钟。一般而言,对PCM1754,可以根据下面这种表来选择时钟,同时文档中也有一些特殊的规定,如使用48fs的BCK,则SCLK只能为192fs,384fs,768fs等,具体需要看文档。
对于SCK和LCRK(采样率),AT91SAM9260文档中有提到相关寄存器,
对于ARM9的时钟设为XMHZ,则SCK=X/(2*div) (div为相应的分频数)
而对于采样率LCRK,则为LCRK=SCK/(2*(period+1)),period可以理解为帧数
同时来看PCM1754,
有三个PIN,分别是13pin DEMP,14pin MUTE,15pin FMT
分别代表着44.1KHZ的重音,弱音,数据格式
一般情况下,将三者均接低,就是没有重音,没有弱音,使用的数据传输格式为I2S,16bit-24比特
在驱动中,我们提到过又一个MIXER组件,对于的硬件就是这些PIN,不过由于PCM1754不支持变成控制,所以MIXER组件可以不用实现
而对于PCM1753/1755,则可实现MIXER组件。
该两款芯片中,FMT对应的是ML,MUTE对应的MC,DEMP对应的MD,
根据时序实现寄存器的写操作,共有寄存器16到寄存器22,共实现了12个control
具体参数设置就不说了,看文档吧~