新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 七 ARM9(S3C2440)的IIS-理论知识及程序实例

七 ARM9(S3C2440)的IIS-理论知识及程序实例

作者: 时间:2016-11-27 来源:网络 收藏
IIS(Inter-IC Sound)由飞利浦公司开发,是一种常用的音频设备接口,主要用于CD、MD、MP3等设备。

本文引用地址:https://www.eepw.com.cn/article/201611/322172.htm

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


上一页 1 2 下一页

关键词: ARM9S3C2440II

评论


技术专区

关闭