历史上的今天

今天是:2024年11月03日(星期日)

2021年11月03日 | mini2440裸机编程------IIS

发布者:代码律动 来源: eefocus关键字:mini2440  裸机编程  IIS 手机看文章 扫描二维码
随时随地手机看文章

这段时间做了IIS的试验。被这个试验也折腾了很久。总的来讲IIS还是一个相对简单的通信协议。


s3c2440一共有5个引脚用于IIS:IISDO、IISDI、IISSCLK、IISLRCK和CDCLK。前两个引脚用于数字音频信号的输出和输入,另外三个引脚都与音频信号的频率有关。


要用好IIS,就要把信号频率设置正确。下面介绍这几个时钟:


fs:采样频率。fs不是任意设置的,一般基于不同的应用场合和听觉效果,设置不同的几个固定的值,如8kHz、16kHz、22.05kHz、44.1kHz、48kHz、96kHz等。通常,在wav文件的头部中, 会给出该文件的fs。


IISSCLK:串行时钟,每一个时钟信号传送一位音频信号,因此IISSCLK的频率=声道数×采样频率×采样位数。如采样频率fs为44.1kHz,采样的位数为16位,声道数2个(左、右两个声道),则IISSCLK的频率=32fs=1411.2kHz。


IISLRCK:帧时钟,用于切换左、右声道,如IISLRCK为高电平表示正在传输的是左声道数据,为低电平表示正在传输的是右声道数据。IISLRCK的频率=采样频率。


CDCLK:由于IIS只负责数字音频信号的传输,而要真正实现音频信号的放、录,还需要额外的处理芯片(在这里,我们使用的是UDA1341),CDCLK为该芯片提供系统同步时钟,即编解码时钟,主要用于音频的A/D、D/A采样时的采样时钟。一般CDCLK=256fs或384fs,通过寄存器可以配置。


这里有一个重要的约束关系:PCLK经过两个预分频器处理后分别得到IISSCLK、IISLRCK和CDCLK(预分频器A得到IISSCLK、IISLRCK,预分频器B得到CDCLK)。寄存器IISPSR是IIS预分频器寄存器,5~9位是预分频器A,0~4位是预分频器B,一般来说,这两个预分频器的值N相等。我们是通过CDCLK来计算预分频器B的值N的,即CDCLK=PCLK / (N+1)。对于给定的wav文件,fs是确定的。因此这里就需要协调:PCLK、CDCLK、和N的值。有时需要重新调整系统时钟(因为保持PCLK不变,只改变CDCLK和N的值很难满足CDCLK=256fs或者384fs。)


PCLK与FCLK有一定的比例关系,而FCLK又是由输入频率Fin得到。在这里,我们为了简化计算,不改变PCLK与FCLK的比例关系(即维持在启动代码中定义的1:8的关系),那么由Fin而得到CDCLK一共涉及到四个参数:MDIV、PDIV、SDIV和前面公式中的N,涉及到的寄存器有MPLLCON和IISPSR。因此要得到这四个参数值,就需要一点耐心地计算,原则是误差最小,其中需要注意的是,计算的结果(包括中间过程的结果)不要溢出,即不要超过32位。例如Fin为12MHz,我们设置采样频率fs=44.1kHz,而CDCLK=384fs=16.9344MHz,那么经过计算,最终得到N=3,MDIV=150,PDIV=5,SDIV=0,即IISPSR = (3<<5) | 3;,MPLLCON = (150<<12) | (5<<4) | 0。


在arm中MPLL的频率就等于FCLK的频率。


s3c2440有关IIS的寄存器除了IISPSR外,还包括IIS控制寄存器IISCON,主要用于控制数据传输的方式、预分频器和IIS接口是否开启;IIS模式寄存器IISMOD,主要用于设置IIS的时钟源、主从方式、接收发送方式、串行接口方式、每个声道串行数据位数和各种频率值;IIS的FIFO接口寄存器IISFCON用于设置和判断数据传输的FIFO状态;而寄存器IISFIFO则用于音频数据的传输。


在mini2440上,负责具体解码音频的芯片是uda1341。s3c2440与UDA1341之间除了我们前面介绍过的IIS接口相连接外,还有一个称之为L3总线的连接,用于s3c2440配置UDA1341内部的寄存器。IIS用于实现ARM和uda1341之间数据的传输,L3总线用于实现arm对uda1341的配置。由于s3c2440不具备L3总线接口,因此我们是用三个通用IO口来模拟L3,从而实现L3总线的传输。


L3就是line 3(3条线)的意思,它只有L3DATA(数据线:用于传输数据)、L3MODE(模式线:用于选择模式)、L3CLOCK(时钟线:用于传输时钟)。L3一共有两个模式:地址模式和数据传输模式,先传输地址模式数据,再传输数据模式数据。L3MODE为低时是地址模式,L3MODE为高时是数据传输模式。L3DATA和L3CLOCK相互作用,完成8位数据的传输,传输的顺序是先低位数据,再高位数据。对于clock没有特别精确的频率要求,因此,我们在程序中通过手动将一个gpio拉高拉低,从而模拟了一个时钟信号。在拉高拉低的同时,再配合数据的传输,就可以了(传输时,是把数据按位送出的,L3是串行的协议)。


地址模式是用于选择设备和定义目标寄存器,在这种模式下,8位数据的含义是:高6位是设备地址(UDA1341的地址为000101),低两位是后面数据模式下寄存器的类型(00:DATA0,01:DATA1,10:STATUS)。只要没有再改变地址模式下的数据,则数据模式下的数据始终是传输到上一个地址模式所定义的寄存器内。


传输数据模式下,STATUS是用于设置复位,系统时钟频率、数据输入模式、DC滤波等内容。DATA0分为直接寻址模式和扩展寻址模式,直接寻址模式是直接进行模式的控制,包括音量、静音等等,而扩展寻址模式是在直接寻址模式下先设置3位扩展地址,再在直接寻址模式下设置5位扩展数据。在DATA1下,可以读取到被检测峰值。至于具体的DATA0、DATA1、STATUS下。


在我们的程序中,通过下面这个函数实现L3的协议:就是实现从arm给uda写入数据。(主要是配置它的寄存器)


//L3总线接口的写函数  

//输入参数data为要写入的数据  

//输入参数address,为1表示地址模式,为0表示数据传输模式  

static void WriteL3(U8 data,U8 address)  

{  

       int i,j;  

       if(address == 1)  

              rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | L3C;        //L3D=L, L3M=L(地址模式), L3C=H  

       else  

              rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);          //L3M=H(数据传输模式)   

       for(i=0;i<10;i++)  

              ;             //等待一段时间  

        

       //并行数据转串行数据输出,以低位在前、高位在后的顺序  

       for(i=0;i<8;i++)      

       {  

              if(data & 0x1)                      // H  

              {  

                     rGPBDAT &= ~L3C;            //L3C=L  

                     rGPBDAT |= L3D;                //L3D=H              

                     for(j=0;j<5;j++)  

                                      ;                    //等待一段时间  

                     rGPBDAT |= L3C;                //L3C=H  

                     rGPBDAT |= L3D;                //L3D=H  

                     for(j=0;j<5;j++)  

                              ;                    //等待一段时间  

               } else {// L                        

                     rGPBDAT &= ~L3C;            //L3C=L  

                     rGPBDAT &= ~L3D;            //L3D=L  

                     for(j=0;j<5;j++)  

                              ;                    //等待一段时间  

                     rGPBDAT |= L3C;                //L3C=H  

                     rGPBDAT &= ~L3D;            //L3D=L  

                     for(j=0;j<5;j++)  

                              ;                    //等待一段时间            

              }  

              data >>= 1;  

       }  

       rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M);          //L3M=H,L3C=H  

}  


放音的程序就是先通过L3协议配置uda,然后再配置arm的寄存器。这样就可以播放音乐了。在uda的配置中,会设置CDCLK的频率。要保证对uda的设置和对arm的设置是一致的。


//放音  

//at 256fs profermance is the best, at 384fs playing is a little slower.  

void playsound(unsigned char *buffer, int length)  

{  

       int count,i;  

       char flag;  

        

       rGPBDAT = rGPBDAT & ~(L3M|L3C|L3D) |(L3M|L3C); //L3开始传输:L3M=H, L3C=H  

   

       //配置UDA1341  

       WriteL3(0x14 + 2,1);      //状态模式(000101xx+10)  

       WriteL3(0x60,0);          //0,1,10, 000,0 : 状态0,复位  

        

       WriteL3(0x14 + 2,1);        //状态模式 (000101xx+10)  

     WriteL3(0x28,0);            // 0, 0, 10, 1000,  256fs   

             

       WriteL3(0x14 + 2,1);     //状态模式 (000101xx+10)  

       WriteL3(0xc1,0);           //1,0,0,0, 0,0,01:状态1,  

     //Gain of DAC 6 dB,Gain of ADC 0dB,ADC non-inverting,  

     //DAC non-inverting,Single speed playback,ADC-Off DAC-On  

          

     //配置s3c2440的IIS寄存器  

     //预分频器为5,所以CDCLK=PCLK/(5+1)=5644.8kHz  

     rIISPSR = (5<<5)|5;  

       //无效DMA,输入空闲,预分频器有效  

     rIISCON  = (0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1);     

       //PCLK为时钟源,输出模式,IIS模式,每个声道16位,CODECLK=256fs,SCLK=32fs  

       rIISMOD  = (0<<9)|(0<<8)|(2<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(1<<0);       

  

  

       rIISFCON = (0<<15)|(1<<13);           //输出FIFO正常模式,输出FIFO使能  

        

       flag=1;  

       count=0;  

[1] [2]
关键字:mini2440  裸机编程  IIS 引用地址:mini2440裸机编程------IIS

上一篇:ARM64平台下WFE和SEV相关指令解析
下一篇:mini2440 裸机编程 -led

推荐阅读

美萍智能电销机器人(俗称:电销机器人、电话机器人、电话营销机器人、智能语音机器人),是美萍网络技术有限根据电销现状研发的一款快速降低企业人工成本,增加外呼效率,精准归类客户级别的“电话销售”。 几乎所有销售行业都在做电话销售,电话销售一直是人口密集型岗位,永远处于缺乏状态,员工流动性大,流失率也大,每年都在不断得招聘,培训,工...
10月24日,中共中央政治局举行第十八次集体学习,区块链技术的发展现状和趋势成为了学习主题,这引发了全球对该技术的广泛关注。 仿佛一夜之间,区块链行业迎来春天,那么到底什么是区块链呢?它与能源行业又有怎样的关系? 貌似很炫酷、很前沿的区块链,其实可以这样解释:在互联网分布式技术基础上,形成一种新型信用机制。 众所周知,传统银行...
当代的电源系统设计需要高功率密度等级和精巧的外型尺寸,以期得到最高的系统级性能。英飞凌科技股份公司通过专注于强化元器件产品达到系统创新,来应对这一挑战。继2 月份推出 25 V 装置后,英飞凌又推出了 OptiMOS™ 40 V 低电压功率 MOSFET,采用源极底置 (SD, Source-Down) PQFN 封装,尺寸为 3.3mm x 3.3 mm。这款 40 V SD MOSF...
在自动驾驶芯片的赛道上,一个熟悉又陌生的名字即将在2022年出现。提到自动驾驶芯片,从最早提供整包解决方案的博世,到感知体系封闭、只开放决策与执行的Mobileye,到提供完整开发环境的英伟达,再到如今国内陆续出现的独角兽,可以说除了自研自动驾驶芯片的特斯拉,多数车企都只是需要在这几个供应商去选择。但是,似乎有一家芯片巨头被忽略了。它就是高...

史海拾趣

问答坊 | AI 解惑

滤波器设计资料集锦

滤波器设计资料集锦 …

查看全部问答∨

啥地方要用到30层PCB?

来自EEWORLD合作群:arm linux fpga 嵌入0(49900581) 群主:wangkj…

查看全部问答∨

LED点阵屏灰度控制

利用控制74HC595的EN是能点亮LED时间,以及红,绿,兰(R,G,B)三基色叠加原理控制 不知有没有感兴趣的朋友,大家一起做做~~~…

查看全部问答∨

关于PS/2口的技术问题

大家好,本人急需要解答一个问题,请了解的朋友给点意见。 题目是:基于单片机的红外遥控键盘,其中与电脑连接的端口要用到PS/2协议,想求一份完整的c语言或者是汇编的程序代码。 但如果只有部分代码也可以,例如:将接收到的电平信号转换成为单 ...…

查看全部问答∨

求菲利浦的 PDIUSBD12 的驱动,和使用方法

用51 + PDIUSBD12 ,实现和 PC通信,固件程序写好了,可是找不到PC winxp的驱动, 求菲利浦的 PDIUSBD12 的驱动,和使用方法。 如果谁知道哪里可以下载麻烦告知一下。也可发我邮箱 yuexianhanshu@yahoo.com.cn 谢了…

查看全部问答∨

如何支持media player?

wince5.0,已经把media player相关的组件都加入了,格式支持都加入了,基本上multimedia里面的都加上了。 启动后看到.mpg,.wmv的文件图标改了,.avi的图标没变。 打开.wmv,提示缺少一个解码器,然后只有声音没有图像。 .mpg的都不能打开。试过 ...…

查看全部问答∨

wince开发

我想用在市场上购买的汽车导航仪上开发应用程序, 并用到其触摸屏和串口. 求教何处有软件开发工具?…

查看全部问答∨

用89C2051芯片取代89c51芯片的问题

本人用了89C51写了一个时钟显示程序,硬件电路共有4个单独的数码管显示,P1.1G至P1.7接了数码管的A、B、C、D、E、F、G   P2.3接了显示时的个位数码管DP脚,P2.7、P2.6、P2.5、P2.4分别接了时的十位数码管、时的个位数码管、分的十位数码管、 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved