mini2440裸机试炼之IIS——音乐播放器

2020-07-04来源: eefocus关键字:mini2440  IIS  音乐播放器

IIS

信号频率设置


IIS(Inter-IC Sound)由飞利浦公司开发,是一种常用的音频设备接口,主要用于CD、MD、MP3等设备。


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


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


1、Fs   2、采样的位数   3、声道数


使用 wav数据提取器查看

采样频率


右键音乐文件-->属性-->详细信息

PCLK(50,000,000)经过两个预分频器处理后分别得到IISSCLK、IISLRCK和CDCLK,寄存器IISPSR是IIS预分频器寄存器,5~9位是预分频器A,0~4位是预分频器B,一般来说,这两个预分频器的值N相等,即只要知道一个,另一个也就知道,而这里我们是通过CDCLK来计算预分频器B的值N的,即CDCLK=PCLK / (N+1)。


我设置主时钟频率选择384fs,由下表,因fs=44.1kHZ,CDCLK=16.9344。可知N=2。


//预分频器为2,所以CDCLK=PCLK/(2+1)=16.66666kHz(和表中的16.9344越接近越好)

    rIISPSR = 2<<5|2;

IIS配置

//配置IIS接口

    rGPEUP = rGPEUP & ~(0x1f) | 0x1f;         //上拉无效,GPE[4:0] 1 1111

    rGPECON = rGPECON & ~(0x3ff) | 0x2aa;

    

    //配置s3c2440的IIS寄存器

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

    rIISPSR = 2<<5|2;

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

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

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

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

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


UDA1341

在我看来,IIS就是实现将音频(WAV)数据按一定频率发送一定大小的数据给FIFO或者DMA,UDA1341就是将这些音频数据转换成电信号通过音频接口发送出去,而关于uda1341的配置是参考来的


//通过io口模拟L3总线写数据  

//mode:1为地址模式,0为数据模式  

//关于地址模式和数据模式以及传输时序注意参考数据手册  

static void write_UA1341(U8 data, U8 address)  

{  

    int i,j;  

    if(address == 1)  {  

        rGPBDAT = rGPBDAT&(~(L3D | L3M |L3C)) |L3C;  //地址模式,根据手册L3M为LOW,L3C为high  

    }  else {  

       rGPBDAT = rGPBDAT & (~(L3D |L3M |L3C)) |(L3M|L3C);   //数据模式 L3M为高  

    }  

    Delay(1);  

    //传输数据  

   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  

UDA1341初始化

//UDA1341初始化

    //配置L3接口总线,GPB2:L3MODE, GPB3:L3DATA, GPB4:L3CLOCK

    rGPBCON = 0x015550;               //输出

    rGPBUP  = 0x7ff;               //上拉无效

    rGPBDAT = 0x1e4;

    

    rGPBDAT = rGPBDAT & (~(L3M |L3C |L3D)) |(L3M|L3C);   //将L3CLOCK和L3MODE置高,准备开始传输  

    ////根据UDA1341TS数据手册14页中的操作顺序,首先在地址模式下,  

    //选择操作地址000101xx +10(STATUS)=0X16  

    write_UA1341(0x16,1) ;    

    write_UA1341(0x60,0); // 0,1 ,10,000,0  复位  

      

    write_UA1341(0x16,1) ;  

    write_UA1341(0x10,0);  //0,0,01, 000,0 : 状态0, 384fs,IIS,no DC-filtering  

      

    write_UA1341(0x16,1) ;  

    write_UA1341(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 


界面素材

                  


    

  

WAV音频文件的制作

1、网上下载无损音乐(我下载了WAV格式和APE格式的)


2、打开格式工厂→音频→WAV→添加文件→截取片段(无损音乐太大了,需要截取一小部分,20秒一首就可以了)→确定→输出配置(如下图)→确定→点击开始。

3、打开截取WAV文件夹


4、使用DataToHex将WAV文件下的WAV转换成音频数据数组文件,修改数组文件名Array[],


5、  将wav音频数据文件改为c文件,请不要改为h,不然debug要好久。


6、  制作完成!


主要逻辑块

buffer=music1;              //初始化buffer指向music1音乐数组地址

    

    while(1){

        if(flag==1){ rIISCON |= 0x1;  //如果点击播放(flag==1)  开启IIS  song_num1初值为1  播放第一首

    

         //处理点击播放时音乐图片的显示(点击播放时 flag1=1)

        if(flag1==1 && song_num==1 ){flag1=0, Pait_Bmp( 70, 70, 100, 100, music1_bmp);}

        if(flag1==1 && song_num==2 ){flag1=0, Pait_Bmp( 70, 70, 100, 100, music2_bmp);}

        if(flag1==1 && song_num==3 ){flag1=0, Pait_Bmp( 70, 70, 100, 100, music3_bmp);}

         

       // 音乐标志song_num1不为零时(歌曲播放完song_num1赋值或者通过键值(上一首/下一首)给song_num1赋值) 

       // buffer音乐播放地址赋初值  length音乐长度重新赋值 并显示音乐图片  下一FIFO字节位置count初始化  song_num1归零

        if(song_num1==1) { buffer=music1; length=3704572; count=0; Pait_Bmp( 70, 70, 100, 100, music1_bmp); song_num1=0;}

if(song_num1==2) { buffer=music2; length=370455

[1] [2] [3] [4]
关键字:mini2440  IIS  音乐播放器 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic502133.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:mini2440裸机试炼之——IIC控制EEPROM数据传输
下一篇:mini2440裸机试炼之——Uart与pc端实现文件、字符传输

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

mini2440之ads下dma测试
在网上找到一个dma的ads工程,将其dma功能整到了原来的ads工程TQ2440_Test里面用下面的main.c换下原来TQ2440_Test的main.chttp://download.csdn.net/detail/songqqnew/3636198之所以要介绍DMA,因为它对性能太重要了!只有活用了DMA,CPU的性能才能上去!S3c2410有四个DMA,每个DMA支持工作方式基本相同,但支持的source Dest可能略有不同,具体见Datasheet。这里具体DMA CONTROL寄存器(DCON)的配置说明,进而引出DMA的各种工作方式。Atomic transfer:指的是DMA的单次原子操作,它可以是Uni
发表于 2020-07-19
mini2440裸机试炼之--myled
///**********************************************************//*****************此函数为实现***************************//**led1亮>>>led1灭>>>                                    //**>>>led1、led2亮>>>
发表于 2020-07-06
<font color='red'>mini2440</font>裸机试炼之--myled
mini2440裸机试炼之--按键控制蜂鸣器和LED
根据用户手册和数据手册得到***************************************************************************************************************************************************************                      ***************************************************
发表于 2020-07-06
<font color='red'>mini2440</font>裸机试炼之--按键控制蜂鸣器和LED
mini2440裸机试炼之——PWM定时器按键更改频率
资料:《s3c2440中文数据手册(完整版)》 第九章:输入输出端口  ;第十章:PWM蜂鸣器//按按键k1蜂鸣器频率降低,//按按键k2蜂鸣器频率升高,//按按键k3退出蜂鸣器测试//按按键k4开启蜂鸣器测试 #define GPBCON    (*(volatile unsigned long*)0x56000010)  //rGPBCON是指向0x56000010这个地址空间的一个宏#define GPBDAT    (*(volatile unsigned long*)0x56000014)  //led GPIO 
发表于 2020-07-06
mini2440裸机试炼之--A/D模拟信号转换
/ (49+1) = 1 MHzA/D 转换的时间 = 1 /(1MHz / 5cycles)=5 uS由此可知当PRSCVL的值越小,A/D 转换的时间越短,A/D 转换的频率也就越大。注意:当从待机模式中变换到正常工作模式时,ADC的预分频器必须在最后的3个ADC时钟前使能????SEL_MUX是模拟输入通道选择控制器READ_START要使能A/D转换启动,就必须禁止READ_ STARTENABLE_START 使能A/D转换控制位ADCDAT0由于只是通过AIN0模拟信号输入。并没使用触摸屏功能,所以,ADCDAT0只考虑普通ADC转换数值(模拟信号转换的数字数值存于XPDATA)W1可调电位器mini2440上有一个可调电位器
发表于 2020-07-06
<font color='red'>mini2440</font>裸机试炼之--A/D模拟信号转换
mini2440裸机试炼之—RTC闹钟中断,节拍中断
环境搭建    硬件环境:J-link v8、mini2440、J-link转接板、串口转USB线    软件环境:windows7(32位)、开发板uboot(NandFlash)、J-link驱动(J-Link ARM V4.10i)、SecureCRT、ADS1.2    其中ADS里的AXD设置:加载JlinkRDI.dll+Options->Configure Interface...,在Session File一页中选择“Run Configuration Script”,将该name.txt文本文件作为一个脚本加进来,确定。name.txt内容
发表于 2020-07-06
<font color='red'>mini2440</font>裸机试炼之—RTC闹钟中断,节拍中断
小广播
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved