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。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预分频器寄存器,5~9位是预分频器A,0~4位是预分频器B,一般来说,这两个预分频器的值N持平,即只需知道一个,另一个也就知道,而这儿咱们是经过CDCLK来核算预分频器B的值N的,即CDCLK=PCLK / (N+1)。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;。(我觉得能够依据要播映的文件的采样频首先固定几个变量,然后再求出剩余的)
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的各类初始状况,数据方法首要用于改进音频输入、输出的作用。
下面介绍一下L3总线接口
L3便是line 3(3条线)的意思,它只需L3DATA(数据线:用于传输数据)、L3MODE(方法线:用于挑选方法)、L3CLOCK(时钟线:用于传输时钟)。L3总共有两个方法:地址方法和数据传输方法,先传输地址方法数据,再传输数据方法数据。L3MODE为低时是地址方法,L3MODE为高时是数据传输方法。L3DATA和L3CLOCK相互作用,完结8位数据的传输,传输的次序是先低位数据,再高位数据。
地址方法是用于挑选设备和界说方针寄存器,在这种方法下,8位数据的意义是:高6位是设备地址(UDA1341的地址为000101),低两位是后边数据方法下寄存器的类型(00:DATA0,01:DATA1,10:STATUS)。只需没有再改动地址方法下的数据,则数据方法下的数据始终是传输到上一个地址方法所界说的寄存器内。
在传输数据方法下,STATUS是用于设置复位,体系时钟频率、数据输入方法、DC滤波等内容。DATA0分为直接寻址方法和扩展寻址方法,直接寻址方法是直接进行方法的操控,包括音量、静音等等,而扩展寻址方法是在直接寻址方法下先设置3位扩展地址,再在直接寻址方法下设置5位扩展数据。在DATA1下,能够读取到被检测峰值。
//////////////////////////////////////////////////////////////////////////////////////////////////
在该试验中咱们播映的是wav文件,所以要想正确的播映文件,咱们有必要对wave文件有一些了解。
咱们用的wave文件是wav格局转化成的C言语文件,实际上便是一个数组,该文件能够经过Advanced MP3 WMA Recorder软件录音生成wav格局音频文件,然后经过软件WinHex生成咱们需求的C文件,我在试验中保存为.h的头文件添加到该程序中。
下面是wave格局文件介绍:
一、总述
WAVE文件作为多媒体中运用的声波文件格局之一,它是以RIFF格局为规范的。
RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”。
WAVE文件是由若干个Chunk组成的。按照在文件中的呈现方位包括:
1、RIFF WAVE Chunk,
2、Format Chunk,
3、Fact Chunk(可选),
4、Data Chunk。
详细见下图:
————————————————
|RIFF WAVE Chunk|
|ID= RIFF|
|RiffType = WAVE|
————————————————
|Format Chunk|
|ID = fmt |
————————————————
|Fact Chunk(optional)|
|ID = fact|
————————————————
|Data Chunk|
|ID = data|
————————————————
其间除了Fact Chunk外,其他三个Chunk是有必要的。每个Chunk有各自的ID,坐落Chunk最开端方位,作为标明,而且均为4个字节。而且紧跟在ID后边的是Chunk大
小(去除ID和Size所占的字节数后剩余的其他字节数目),4个字节表明,低字节表明数值低位,高字节表明数值高位。下面详细介绍各个Chunk内容。一切数值表明均为低字节表明低位,高字节表明高位。
二、详细介绍
RIFF WAVE Chunk
==================================
||所占字节数|详细内容|
==================================
| ID|4 Bytes |RIFF|
———————————-
| Size|4 Bytes ||
———————————-
| Type|4 Bytes |WAVE|
———————————-
图2RIFF WAVE Chunk
以FIFF作为标明,然后紧跟着为size字段,该size是整个wav文件巨细减去ID和Size所占用的字节数,即FileLen – 8 = Size。然后是Type字段,为WAVE,表明是wav文件。
结构界说如下:
struct RIFF_HEADER
{
charszRiffID[4];// R,I,F,F
DWORDdwRiffSize;
charszRiffFormat[4];// W,A,V,E
};
Format Chunk
字节数详细内容
| ID|4 Bytes|‘fmt’
| Size|4 Bytes| 数值为16或18,18则最终又附加信息
| FormatTag|2 Bytes| 编码方法,一般为0x000
| Channels|2 Bytes| 声道数目,1–单声道;2–双声道
|SamplesPerSec |4 Bytes| 采样频率
| AvgBytesPerSec|4 Bytes| 每秒所需字节数===> WAVE_FORMAT
| BlockAlign|2 Bytes| 数据块对齐单位(每个采样需求的字节数)
| BitsPerSample |2 Bytes| 每个采样需求的bit数|2 Bytes | 附加信息(可选经过Size来判别有无)
图3Format Chunk
以fmt 作为标明。一般情况下Size为16,此刻最终附加信息没有;假如为18则最终多了2个字节的附加信息。首要由一些软件制成的wav格局中含有该2个字节的附加信息。
结构界说如下:
struct WAVE_FORMAT
{
WORDwFormatTag;
WORDwChannels;
DWORDdwSamplesPerSec;
DWORDdwAvgBytesPerSec;
WORDwBlockAlign;
WORDwBitsPerSample;
};
struct FMT_BLOCK
{
charszFmtID[4];// f,m,t,
DWORDdwFmtSize;
WAVE_FORMATwavFormat;
};
Fact Chunk
==================================
||所占字节数|详细内容|
==================================
| ID|4 Bytes |fact|
———————————-
| Size|4 Bytes |数值为4|
———————————-
| data|4 Bytes ||
———————————-
图4Fact Chunk
Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包括该Chunk。
结构界说如下:
struct FACT_BLOCK
{
charszFactID[4];// f,a,c,t
DWORDdwFactSize;
};
Data Chunk
==================================
||所占字节数|详细内容|
==================================
| ID|4 Bytes |data|
———————————-
| Size|4 Bytes ||
———————————-
| data|||
———————————-
图5 Data Chunk
Data Chunk是真实保存wav数据的当地,以data作为该Chunk的标明。然后是
数据的巨细。紧接着便是wav数据。依据Format Chunk中的声道数以及采样bit数,
wav数据的bit方位能够分红以下几种方法:
|单声道|取样1|取样2|取样3|取样4|8bit量化 |声道0|声道0|声道0|声道0
|双声道|取样1|取样2
|8bit量化 |声道0(左)|声道1(右) |声道0(左) |声道1(右)
取样1|取样2|
|单声道|
| 16bit量化 |声道0|声道0|声道0|声道0|(低位字节)|(高位字节)|(低位字节)|(高位字节)
取样1
|双声道|————————————————
| 16bit量化 |声道0(左)|声道0(左) |声道1(右)|声道1(右)
|(低位字节)| (高位字节)| (低位字节)| (高位字节)
图6 wav数据bit方位组织方法
Data Chunk头结构界说如下:
struct DATA_BLOCK
{
charszDataID[4];// d,a,t,a
DWORDdwDataSize;
};
看完上面这些咱们应该要清楚在文件的开端地址偏移0x18(24)处是文件的采样频率,0x16(22)处是声道,0x2c(44)处才是真实的wave数据,也便是咱们要播映的数据。
下面是UDA1314经过IIS接口的放音程序
#include”2440addr.h”
#include”WindowsXP_Wav.h”
#include”What_are_words.h”
#include”def.h”
//L3接口
#define L3C (1<<4)//GPB4 = L3CLOCK
#define L3D (1<<3)//GPB3 = L3DATA
#define L3M (1<<2)//GPB2 = L3MODE
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/256924.html