一、I2S引脚介绍 I2S是全双工,即同时接收和发送。重要有三个时钟信号(主时钟MCLK,帧同步时钟左右切换时钟WS,数据时钟BCLK),和一个数据接收SD_RX,一个数据发SD_TX送。可设置主从模式,主控是主模式的话,由主控参数所有用到的时钟,ad芯片即是从模式。主控是从模式的话,由ad芯片外接27mhz晶振,产生时钟。接收和发送可以共用时钟,如果只接一个ad芯片。数据精度可用16/32/24位来表示。 MCLK = 256 * WS BCLK = WS * 左右通道数 * 位宽 如; 2 * 16 * WS WS = 1 / 采样频率
单通道,左右声道,示意图,16/24/位数据 hisi的多通道示意图,可以接多路输入,ktv可以多个话筒一个意思。不是左右声道的意思,不要搞混了。 声音是模拟信号,通过ad芯片,对输入的模拟量进行数字化,根据设置的采样频率,抽样采集电压信号,转化为数字信号,最终保存文件,编码,然后解码,由数字信号,转化还原模拟信号,由喇叭播放声音
一、hisi的音频采集播放原理图 ad就是音频芯片,i2s与hisi主控连接,hisi的采集和输出为ai和ao设备,通过内部的dma,将数据进行保存,不需我们关心。
二、hisi的I2S文档介绍 在介绍之前,先介绍hisi文档关于音频的说明,多媒体开发文档
2、编解码处理器指南介绍 根据文档,对讲只用一个ad芯片时的引脚设计。ad芯片作为主模式可以外接晶振,供芯片输出时钟,我选择ad芯片作为从模式,hisi就是主模式,提供时钟给ad芯片,输入和输出共用时钟。如下图,WS_TX,BCLK_TX,MCLK是时钟,SD_TX,SD_RX是数据 三、hisi的I2S引脚和tl芯片引脚介绍** I2S有四个比较重要的脚 如下原理图,我接的音频芯片是TL3101,主控是海思的3520/3521DV400,hisi的主控,有两个输入,两个输出,文档说明,规定两组混合使用,我使用的是I2S2和I2S1。 I2S2作为发送,提供主时钟MCLK,同步时钟,BCLK,WS,和输出SD_TX。I2S1仅提供接收SD_RX,同步时钟和I2S2共用。和一组I2C用于控制芯片,设置参数。
hisi主控引脚图,注意i2s1的ws,原理图是没用到的。 音频芯片是TL3101,引脚图如下。 咪头,是标准的3mm接口,插入耳机,连线如下图。
四、驱动调试 1、准备ko驱动文件,根据hisi文档,demo使用的是tl3101芯片,接的也是这款芯片,所以不要从新写驱动,如果其他芯片,就要自己写驱动,调试内核,对于没搞过驱动开发的同志,这是困难,老衲懂驱动和系统,所以简单,直接用hisi的sdk下ko下tl3101下的ko文件,在启动时加在,插断题外话,ko,可以在内核启动时加载,可以在根文件系统挂载后,脚本命令加载或收到加载。 根据驱动源码,芯片默认是从模式,48k采样率,16位,i2s,这个很重要,下面设置时钟时,就知道设置多少,刚开时调试,就按默认设置
1、根据多媒体文档调试指南。 *i2s的时序图如下,WS,是左右声道切换时钟,fs就是采样率,1/fs就是ws但我时钟,bclk就是数据时钟,sd的时钟,bclk = fs * 位宽*通道数,我们是左右声道,选择16位的位宽,所以是 fs * 2 16。那主时钟mclk 就是256 * fs。
2、根据原理图,先将hisi的引脚,复用为I2S,和i2c。找到hisi的文档Hi3520DV400_PINOUT_CN.xlsx
3、将I2S和I2C_管脚复用, 在load自启动脚本加如下命令。
himm 0x120F00AC 0x2; #GPIO9_3 I2S1_BCLK_RX I2S2_MCLK
himm 0x120F00B8 0x1; #GPIO9_6 I2S2_BCLK_RX
himm 0x120F00BC 0x1; #GPIO9_7 I2S2_WS_RX
himm 0x120F00C0 0x1; #GPIO5_4 I2S2_SD_RX
himm 0x120F00B4 0x1; #GPIO9_5 I2S1_SD_RX
himm 0x120F00E0 0x1; #GPIO12_6 I2C_SDA
himm 0x120F00E4 0x1; #GPIO12_7 I2C_SCL
4、加载驱动, 上面的管脚设置好后,加载ko文件,把hisi默认加载nv6134屏蔽掉,加载音频ko要放在hisi系统system驱动后,否则打开ai,ao失败。
insert_audio()
{
insmod tlv_320aic31.ko
insmod hi3521d_aio.ko
insmod hi3521d_ai.ko
insmod hi3521d_ao.ko
insmod hi3521d_aenc.ko
insmod hi3521d_adec.ko
}
remove_audio()
{
rmmod hi3521d_adec
rmmod hi3521d_aenc
rmmod hi3521d_ao
rmmod hi3521d_ai
rmmod hi3521d_aio
rmmod tlv_320aic31
}
启动系统后,启动时会看到ai,ao,之类的,tl32031驱动加载成功的信息,看看是否有这个设备,ls /dev 可以看到有tlv320aic31这个设备,没有的话,就是驱动未加载成功,i2c有问题或,编译的ko有问题,看调试打印是什么情况,确定是否i2c没有通,还是ko的问题,和i2s没关,这一步,还没到i2s。
4、时钟设置
himm 0x13140140 0x003254E7; #I2S2MCLK 12.288MHZ
himm 0x13140144 0x00000133; #I2S2CLK 12.288/4MHZ
himm 0x13140108 0x003254E7; #I2S1MCLK 12.288MHZ
himm 0x1314010C 0x00000133; #I2S1CLK 12.288/4MHZ
****设置时钟,这里去设置时钟,tl芯片驱动源码,默认是48khz采样率,所以主时钟mclk是256* bck(48k)= 12MHZ,上图hisi文档介绍了,48k采样率时,输出主时钟是12.288mhz。
这里根据实际操作感觉不需,hisi加载ai,ao,驱动时,自动设置了时钟,量了主时钟是12.2mhz。 后面启动应用层demo后,启动ai和ao设备,设置是主模式,48k采样率,后面量时钟,bclk是1.5mhz,wclk是48khz,这里很重要,可以确定我们的管脚设置没有错,应用设置也没有错,否则是不会有数据的,调试驱动时,一定要确保时钟是正确的,用示波器量时钟,再调试应用。****
应用层设置,采集音频,在下章节讲。
|