已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
s3c2440的IIS应用放音与录音No Comments知识点, by lyping. | Tags: I2CIIS(Inter-IC Sound)由飞利浦公司开发,是一种常用的音频设备接口,主要用于CD、MD、MP3等设备。s3c2440一共有5个引脚用于IIS:IISDO、IISDI、IISSCLK、IISLRCK和CDCLK。前两个引脚用于数字音频信号的输出和输入,另外三个引脚都与音频信号的频率有关,可见要用好IIS,就要把信号频率设置正确。IISSCLK为串行时钟,每一个时钟信号传送一位音频信号,因此IISSCLK的频率声道数采样频率采样位数,如采样频率fs为44.1kHz,采样的位数为16位,声道数2个(左、右两个声道),则IISSCLK的频率32fs1411.2kHz。IISLRCK为帧时钟,用于切换左、右声道,如IISLRCK为高电平表示正在传输的是左声道数据,为低电平表示正在传输的是右声道数据,因此IISLRCK的频率应该正好等于采样频率。由于IIS只负责数字音频信号的传输,而要真正实现音频信号的放、录,还需要额外的处理芯片(在这里,我们使用的是UDA1341),CDCLK为该芯片提供系统同步时钟,即编解码时钟,主要用于音频的A/D、D/A采样时的采样时钟,一般CDCLK为256fs或384fs。通过以上分析可以发现,采样频率fs对频率的设置至关重要。而fs不是任意设置的,一般基于不同的应用场合和听觉效果,而设置不同的几个固定的值,如8kHz、16kHz、22.05kHz、44.1kHz、48kHz、96kHz等。为了使系统得到以fs为基数的各类时钟信号,就要重新调整系统时钟。s3c2440用于IIS的时钟源有PCLK和MPLLin,我们这里选择PCLK作为IIS的时钟源。PCLK经过两个预分频器处理后分别得到IISSCLK、IISLRCK和CDCLK(预分频器A得到IISSCLK、IISLRCK,预分频器B得到CDCLK)。寄存器IISPSR是IIS预分频器寄存器,59位是预分频器A,04位是预分频器B,一般来说,这两个预分频器的值N相等,即只要知道一个,另一个也就知道,而这里我们是通过CDCLK来计算预分频器B的值N的,即CDCLKPCLK / (N1)。PCLK与FCLK有一定的比例关系,而FCLK又是由输入频率Fin得到。在这里,我们为了简化计算,不改变PCLK与FCLK的比例关系(即维持在启动代码中定义的1:8的关系),那么由Fin而得到CDCLK一共涉及到四个参数:MDIV、PDIV、SDIV和前面公式中的N,涉及到的寄存器有MPLLCON和IISPSR。因此要得到这四个参数值,就需要一点耐心地计算,原则是误差最小,其中需要注意的是,计算的结果(包括中间过程的结果)不要溢出,即不要超过32位。例如Fin为12MHz,我们设置采样频率fs44.1kHz,而CDCLK384fs16.9344MHz,那么经过计算,最终得到N3,MDIV150,PDIV5,SDIV0,即IISPSR = (3 5) | 3;,MPLLCON = (15012) | (54) | 0;。s3c2440有关IIS的寄存器除了IISPSR外,还包括IIS控制寄存器IISCON,主要用于控制数据传输的方式、预分频器和IIS接口是否开启;IIS模式寄存器IISMOD,主要用于设置IIS的时钟源、主从方式、接收发送方式、串行接口方式、每个声道串行数据位数和各种频率值;IIS的FIFO接口寄存器IISFCON用于设置和判断数据传输的FIFO状态;而寄存器IISFIFO则用于音频数据的传输。由于s3c2440要实现IIS的录、放音,还需要UDA1341芯片,因此我们再简要介绍一下这个芯片的使用。s3c2440与UDA1341之间除了我们前面介绍过的IIS接口相连接外,还有一个称之为L3总线的连接,用于s3c2440配置UDA1341内部的寄存器。由于s3c2440不具备L3总线接口,因此我们是用三个通用IO口来模拟L3,从而实现L3总线的传输。UDA1341有两种模式:地址模式和数据传输模式。地址模式表示传输的是地址信息,它的高6位永远是000101,低两位表示的是传输的模式,是状态模式、数据0模式还是数据1模式,其中状态模式主要用于配置UDA1341的各类初始状态,数据模式主要用于改善音频输入、输出的效果。下面我们就给出具体的程序,在这里我们使用的是正常模式来实现数据的输入和输出的,即不使用DMA模式。首先是实现s3c2440对某一音频信号数据的输出,即放音。我们事先已知道该音频信号的各类特性,如采样频率、声道数、采样信号的位数等。 /L3接口#define L3C (14) /GPB4 = L3CLOCK#define L3D (13) /GPB3 = L3DATA#define L3M (12) /GPB2 = L3MODE/纯音频信号数据数组unsigned char music = 0xB8, 0xFF, 0xBA, 0xFF, 0xBF, 0xFF, 0xC0, 0xFF, 0xD4, 0xFF, 0xD3, 0xFF, 0xF2, 0xFF, 0xED, 0xFF,0x0E, 000, 005, 000, 0x1C, 000, 0x0F, 000, 015, 000, 006, 000, 0xFC, 0xFF, 0xEC, 0xFF, /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=HElse/数据模式;rGPBDAT = rGPBDAT & (L3D | L3M | L3C) | (L3C | L3M); /L3M=H(数据传输模式)for(i=0;i10;i+); /等待一段时间/并行数据转串行数据输出,以低位在前、高位在后的顺序for(i=0;i8;i+)if(data & 01) / HrGPBDAT &= L3C; /L3C=LrGPBDAT |= L3D; /L3D=Hfor(j=0;j5;j+); /等待一段时间rGPBDAT |= L3C; /L3C=HrGPBDAT |= L3D; /L3D=Hfor(j=0;j5;j+); /等待一段时间else / LrGPBDAT &= L3C; /L3C=LrGPBDAT &= L3D; /L3D=Lfor(j=0;j5;j+); /等待一段时间rGPBDAT |= L3C; /L3C=H使CLOCK 为1;rGPBDAT &= L3D; /L3D=Lfor(j=0;j= 1;rGPBDAT = rGPBDAT & (L3D | L3M | L3C) | (L3C | L3M); /L3M=H,L3C=H/放音void playsound(unsigned char *buffer, int length)int count,i;char flag;rGPBDAT = rGPBDAT & (L3M|L3C|L3D) |(L3M|L3C); /L3开始传输:L3M=H, L3C=H/配置UDA1341WriteL3(014 + 2,1); /状态模式(000101xx+10)WriteL3(060,0); /0,1,10, 000,0 : 状态0,复位WriteL3(014 + 2,1); /状态模式 (000101xx+10)WriteL3(010,0); /0,0,01, 000,0 : 状态0, 384fs,IIS,no DC-filteringWriteL3(014 + 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寄存器/预分频器为3,所以CDCLK=PCLK/(3+1)=16.928kHzrIISPSR = 3 5|3;/无效DMA,输入空闲,预分频器有效rIISCON = (05)|(04)|(03)|(12)|(11);/PCLK为时钟源,输出模式,IIS模式,每个声道16位,CODECLK=384fs,SCLK=32fsrIISMOD = (09)|(08)|(26)|(05)|(04)|(13)|(12)|(10);rIISFCON = (015)|(113); /输出FIFO正常模式,输出FIFO使能flag=1;count=0;/开启IISrIISCON |= 01;while(flag)if(rIISCON & (17)=0) /检查输出FIFO是否为空/FIFO中的数据为16位,深度为32/当输出FIFO为空时,一次性向FIFO写入32个16位数据for(i=0;i32;i+)rIISFIFO=(buffer2*i+count)+(buffer2*i+1+countlength)flag=0; /音频数据传输完,则退出rIISCON = 00; /关闭IISvoid Main(void)/配置MPLL/fs=44.1kHz,CODECLK=384fs=16.9344MHz/不改变CLKDIVN,所以PCLK=FCLK/8/MPLLCON:MDIV=150,PDIV=5,SDIV=0,所以FCLK=541.7143MHz,PCLK=67.714MHzrMPLLCON = (150 12) | (54) | 0;/配置L3接口总线,GPB2:L3MODE, GPB3:L3DATA, GPB4:L3CLOCKrGPBCON = 0015550; /输出rGPBUP = 0x7ff; /上拉无效rGPBDAT = 0x1e4;/配置IIS接口rGPEUP = rGPEUP & (0x1f) | 0x1f; /上拉无效,GPE4:0 1 1111rGPECON = rGPECON & (0x3ff) | 0x2aa;playsound(music,sizeof(music);while(1);上面的程序可以实现简单的播放内存中固有音频数据的功能,下面的程序实现了录制一段音频数据,然后再播出的功能。我们用UART来控制录、放音:当s3c2440接收到051时录音,接收到055时停止录音,接收到066时放音。 #define L3C (14) /GPB4 = L3CLOCK#define L3D (13) /GPB3 = L3DATA#define L3M (12) /GPB2 = L3MODEunsigned char record_buffer1000000; /用于存放录制的音频数据char stop,cmd;/UART中断void _irq uartISR(void)char ch;rSUBSRCPND |= 01;rSRCPND |= 0128;rINTPND |= 0128;ch=rURXH0;switch(ch)case 051: /开始录音cmd=001;break;case 055: /停止录音stop=1; /置退出录音标志break;case 066: /放音cmd=003;break;rUTXH0=ch; /录音/输入参数为数组,输出参数为所录制数据的字节长度int record(unsigned char * buffer)int count,i;unsigned short temp;rGPBDAT = rGPBDAT & (L3M|L3C|L3D) |(L3M|L3C); /L3开始传输: L3M=H, L3C=H/配置UDA1341WriteL3(014 + 2,1); /状态模式(000101xx+10)WriteL3(060,0); /0,1,10, 000,0 : 状态0,复位WriteL3(014 + 2,1); /状态模式 (000101xx+10)WriteL3(010,0); /0,0,01, 000,0 : 状态0, 384fs,IIS,no DC-filteringWriteL3(014 + 2,1); /状态模式 (000101xx+10)WriteL3(0xa2,0); /1,0,1,0, 0,0,10 状态1/Gain of DAC 0 dB,Gain of ADC 6dB,ADC non-inverting,/DAC non-inverting,Single speed playback,ADC-On DAC-OffWriteL3(014 + 0,1); /DATA0 (000101xx+00)WriteL3(0x7b,0); /01,11 10,11 : Data0, Bass Boost 1824dB, Treble 6dBWriteL3(0xc4,0); /1100 0,100 : Extended addr(3bits), 100WriteL3(0xf0,0); /111,1 00,00 : DATA0, Enable AGC, 00, input amplifier gain channel 2 (2bits)WriteL3(0xc0,0); /1100 0,000 : Extended addr(3bits), 000WriteL3(0xe0,0); /111, 00000 : MA = 0dBWriteL3(0xc1,0); /1100 0,001 : Extended addr(3bits), 001WriteL3(0xe0,0); /111, 00000 : MB = 0dBWriteL3(0xc2,0); /1100 0,010 : Extended addr(3bits), 010WriteL3(0xf9,0); /111,1 10,11 : DATA0, MIC Amplifier Gain 27dB, input 1 X MA + input 2 X MB/配置s3c2440的IIS寄存器/预分频器为3,所以CDCLK=PCLK/(3+1)=16.928kHzrIISPSR = 35|3;/无效DMA,输出空闲,预分频器有效rIISCON = (05)|(04)|(13)|(02)|(11);/PCLK为时钟源,输入模式,IIS模式,每个声道16位,CODECLK=384fs,SCLK=32fsrIISMOD = (09)|(08)|(16)|(05)|(04)|(13)|(12)|(10);rIISFCON = (014)|(112); /输入FIFO正常模式,输入FIFO使能count=0;/开启IISrIISCON |= 01;while(stop=0)if(rIISCON & (16)=0) /检查输入FIFO是否为满/FIFO中的数据为16位,深度为32/当输入FIFO为满时,一次性读取FIFO中的32个16位数据for(i=0;i8);count+=64;if(count1000000)stop=1; /当录制的数据超过数组长度时,退出rIISCO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职业规划个人需求分析
- 《城镇燃气安全检查与评估标准》
- 重要文件分类归档与电子备份
- (正式版)DB32∕T 5386-2026 大跨木结构设计标准
- 2026江苏省人民医院宿迁医院(宿迁市第一人民医院)博士专项招聘30人考试备考试题及答案解析
- 2026年吉林大学辅导员招聘(20人)笔试模拟试题及答案解析
- 2026上海开放大学奉贤分校老年教育兼职教师(储备)招聘笔试参考题库及答案解析
- 2026山东聊城市教育和体育局直属学校招聘48人考试参考题库及答案解析
- 2026四川长虹电器股份有限公司招聘比价审计主管岗位1人考试备考题库及答案解析
- 2026年大兴安岭呼中区乡镇卫生院公开招聘医学毕业生补充2人考试参考题库及答案解析
- 2025中级注册安全工程师《安全生产管理》临考强化重点
- 2025至2030年中国金冶炼市场调查研究及行业投资潜力预测报告
- 合唱指挥专业毕业论文
- HB20542-2018航空用高闪点溶剂型清洗剂规范
- 卫生院保密工作培训课件
- ESG基础知识培训课件
- 法律效应的婚内保证书
- 育肥猪场月度汇报
- 工贸行业隐患排查指导手册
- DB31∕T 1487-2024 国际医疗服务规范
- 电商公司积分管理制度
评论
0/150
提交评论