七 ARM9(S3C2440)的IIS-理論知識(shí)及程序?qū)嵗?/h1>
IIS(Inter-IC Sound)由飛利浦公司開(kāi)發(fā),是一種常用的音頻設(shè)備接口,主要用于CD、MD、MP3等設(shè)備。
本文引用地址:http://m.butianyuan.cn/article/201611/322172.htm s3c2440一共有5個(gè)引腳用于IIS:IISDO、IISDI、IISSCLK、IISLRCK和CDCLK。前兩個(gè)引腳用于數(shù)字音頻信號(hào)的輸出和輸入,另外三個(gè)引腳都與音頻信號(hào)的頻率有關(guān),可見(jiàn)要用好IIS,就要把信號(hào)頻率設(shè)置正確。IISSCLK為串行時(shí)鐘,每一個(gè)時(shí)鐘信號(hào)傳送一位音頻信號(hào),因此IISSCLK的頻率=聲道數(shù)×采樣頻率×采樣位數(shù),如采樣頻率fs為44.1kHz,采樣的位數(shù)為16位,聲道數(shù)2個(gè)(左、右兩個(gè)聲道),則IISSCLK的頻率=32fs=1411.2kHz。IISLRCK為幀時(shí)鐘,用于切換左、右聲道,如IISLRCK為高電平表示正在傳輸?shù)氖亲舐暤罃?shù)據(jù),為低電平表示正在傳輸?shù)氖怯衣暤罃?shù)據(jù),因此IISLRCK的頻率應(yīng)該正好等于采樣頻率。由于IIS只負(fù)責(zé)數(shù)字音頻信號(hào)的傳輸,而要真正實(shí)現(xiàn)音頻信號(hào)的放、錄,還需要額外的處理芯片(在這里,我們使用的是UDA1341),CDCLK為該芯片提供系統(tǒng)同步時(shí)鐘,即編解碼時(shí)鐘,主要用于音頻的A/D、D/A采樣時(shí)的采樣時(shí)鐘,一般CDCLK為256fs或384fs。
通過(guò)以上分析可以發(fā)現(xiàn),采樣頻率fs對(duì)頻率的設(shè)置至關(guān)重要。而fs不是任意設(shè)置的,一般基于不同的應(yīng)用場(chǎng)合和聽(tīng)覺(jué)效果,而設(shè)置不同的幾個(gè)固定的值,如8kHz、16kHz、22.05kHz、44.1kHz、48kHz、96kHz等。為了使系統(tǒng)得到以fs為基數(shù)的各類(lèi)時(shí)鐘信號(hào),就要重新調(diào)整系統(tǒng)時(shí)鐘。s3c2440用于IIS的時(shí)鐘源有PCLK和MPLLin,我們這里選擇PCLK作為IIS的時(shí)鐘源。PCLK經(jīng)過(guò)兩個(gè)預(yù)分頻器處理后分別得到IISSCLK、IISLRCK和CDCLK(預(yù)分頻器A得到IISSCLK、IISLRCK,預(yù)分頻器B得到CDCLK)。寄存器IISPSR是IIS預(yù)分頻器寄存器,5~9位是預(yù)分頻器A,0~4位是預(yù)分頻器B,一般來(lái)說(shuō),這兩個(gè)預(yù)分頻器的值N相等,即只要知道一個(gè),另一個(gè)也就知道,而這里我們是通過(guò)CDCLK來(lái)計(jì)算預(yù)分頻器B的值N的,即CDCLK=PCLK / (N+1)。PCLK與FCLK有一定的比例關(guān)系,而FCLK又是由輸入頻率Fin得到。在這里,我們?yōu)榱撕?jiǎn)化計(jì)算,不改變PCLK與FCLK的比例關(guān)系(即維持在啟動(dòng)代碼中定義的1:8的關(guān)系),那么由Fin而得到CDCLK一共涉及到四個(gè)參數(shù):MDIV、PDIV、SDIV和前面公式中的N,涉及到的寄存器有MPLLCON和IISPSR。因此要得到這四個(gè)參數(shù)值,就需要一點(diǎn)耐心地計(jì)算,原則是誤差最小,其中需要注意的是,計(jì)算的結(jié)果(包括中間過(guò)程的結(jié)果)不要溢出,即不要超過(guò)32位。例如Fin為12MHz,我們?cè)O(shè)置采樣頻率fs=44.1kHz,而CDCLK=384fs=16.9344MHz,那么經(jīng)過(guò)計(jì)算,最終得到N=3,MDIV=150,PDIV=5,SDIV=0,即IISPSR = (3<<5) | 3;,MPLLCON = (150<<12) | (5<<4) | 0;。(我覺(jué)得可以根據(jù)要播放的文件的采樣頻率先固定幾個(gè)變量,然后再求出剩余的)
s3c2440有關(guān)IIS的寄存器除了IISPSR外,還包括IIS控制寄存器IISCON,主要用于控制數(shù)據(jù)傳輸?shù)姆绞?、預(yù)分頻器和IIS接口是否開(kāi)啟;IIS模式寄存器IISMOD,主要用于設(shè)置IIS的時(shí)鐘源、主從方式、接收發(fā)送方式、串行接口方式、每個(gè)聲道串行數(shù)據(jù)位數(shù)和各種頻率值;IIS的FIFO接口寄存器IISFCON用于設(shè)置和判斷數(shù)據(jù)傳輸?shù)腇IFO狀態(tài);而寄存器IISFIFO則用于音頻數(shù)據(jù)的傳輸。
由于s3c2440要實(shí)現(xiàn)IIS的錄、放音,還需要UDA1341芯片,因此我們?cè)俸?jiǎn)要介紹一下這個(gè)芯片的使用。s3c2440與UDA1341之間除了我們前面介紹過(guò)的IIS接口相連接外,還有一個(gè)稱(chēng)之為L(zhǎng)3總線(xiàn)的連接,用于s3c2440配置UDA1341內(nèi)部的寄存器。由于s3c2440不具備L3總線(xiàn)接口,因此我們是用三個(gè)通用IO口來(lái)模擬L3,從而實(shí)現(xiàn)L3總線(xiàn)的傳輸。UDA1341有兩種模式:地址模式和數(shù)據(jù)傳輸模式。地址模式表示傳輸?shù)氖堑刂沸畔?,它的?位永遠(yuǎn)是000101,低兩位表示的是傳輸?shù)哪J剑菭顟B(tài)模式、數(shù)據(jù)0模式還是數(shù)據(jù)1模式,其中狀態(tài)模式主要用于配置UDA1341的各類(lèi)初始狀態(tài),數(shù)據(jù)模式主要用于改善音頻輸入、輸出的效果。
下面介紹一下L3總線(xiàn)接口
L3就是line 3(3條線(xiàn))的意思,它只有L3DATA(數(shù)據(jù)線(xiàn):用于傳輸數(shù)據(jù))、L3MODE(模式線(xiàn):用于選擇模式)、L3CLOCK(時(shí)鐘線(xiàn):用于傳輸時(shí)鐘)。L3一共有兩個(gè)模式:地址模式和數(shù)據(jù)傳輸模式,先傳輸?shù)刂纺J綌?shù)據(jù),再傳輸數(shù)據(jù)模式數(shù)據(jù)。L3MODE為低時(shí)是地址模式,L3MODE為高時(shí)是數(shù)據(jù)傳輸模式。L3DATA和L3CLOCK相互作用,完成8位數(shù)據(jù)的傳輸,傳輸?shù)捻樞蚴窍鹊臀粩?shù)據(jù),再高位數(shù)據(jù)。
地址模式是用于選擇設(shè)備和定義目標(biāo)寄存器,在這種模式下,8位數(shù)據(jù)的含義是:高6位是設(shè)備地址(UDA1341的地址為000101),低兩位是后面數(shù)據(jù)模式下寄存器的類(lèi)型(00:DATA0,01:DATA1,10:STATUS)。只要沒(méi)有再改變地址模式下的數(shù)據(jù),則數(shù)據(jù)模式下的數(shù)據(jù)始終是傳輸?shù)缴弦粋€(gè)地址模式所定義的寄存器內(nèi)。
在傳輸數(shù)據(jù)模式下,STATUS是用于設(shè)置復(fù)位,系統(tǒng)時(shí)鐘頻率、數(shù)據(jù)輸入模式、DC濾波等內(nèi)容。DATA0分為直接尋址模式和擴(kuò)展尋址模式,直接尋址模式是直接進(jìn)行模式的控制,包括音量、靜音等等,而擴(kuò)展尋址模式是在直接尋址模式下先設(shè)置3位擴(kuò)展地址,再在直接尋址模式下設(shè)置5位擴(kuò)展數(shù)據(jù)。在DATA1下,可以讀取到被檢測(cè)峰值。
//////////////////////////////////////////////////////////////////////////////////////////////////
在該實(shí)驗(yàn)中我們播放的是wav文件,所以要想正確的播放文件,我們必須對(duì)wave文件有一些了解。
我們用的wave文件是wav格式轉(zhuǎn)化成的C語(yǔ)言文件,實(shí)際上就是一個(gè)數(shù)組,該文件可以通過(guò)Advanced MP3 WMA Recorder軟件錄音生成wav格式音頻文件,然后通過(guò)軟件WinHex生成我們需要的C文件,我在實(shí)驗(yàn)中保存為.h的頭文件添加到該程序中。
下面是wave格式文件介紹:
一、綜述
WAVE文件作為多媒體中使用的聲波文件格式之一,它是以RIFF格式為標(biāo)準(zhǔn)的。
RIFF是英文Resource Interchange File Format的縮寫(xiě),每個(gè)WAVE文件的頭四個(gè)字節(jié)便是“RIFF”。
WAVE文件是由若干個(gè)Chunk組成的。按照在文件中的出現(xiàn)位置包括:
1、RIFF WAVE Chunk,
2、Format Chunk,
3、Fact Chunk(可選),
4、Data Chunk。
具體見(jiàn)下圖:
------------------------------------------------
| RIFF WAVE Chunk |
| ID = RIFF |
| RiffType = WAVE |
------------------------------------------------
| Format Chunk |
| ID = fmt |
------------------------------------------------
| Fact Chunk(optional) |
| ID = fact |
------------------------------------------------
| Data Chunk |
| ID = data |
------------------------------------------------
其中除了Fact Chunk外,其他三個(gè)Chunk是必須的。每個(gè)Chunk有各自的ID,位于Chunk最開(kāi)始位置,作為標(biāo)示,而且均為4個(gè)字節(jié)。并且緊跟在ID后面的是Chunk大
小(去除ID和Size所占的字節(jié)數(shù)后剩下的其他字節(jié)數(shù)目),4個(gè)字節(jié)表示,低字節(jié)表示數(shù)值低位,高字節(jié)表示數(shù)值高位。下面具體介紹各個(gè)Chunk內(nèi)容。所有數(shù)值表示均為低字節(jié)表示低位,高字節(jié)表示高位。
二、具體介紹
RIFF WAVE Chunk
==================================
| |所占字節(jié)數(shù)| 具體內(nèi)容 |
==================================
| ID | 4 Bytes | RIFF |
----------------------------------
| Size | 4 Bytes | |
----------------------------------
| Type | 4 Bytes | WAVE |
----------------------------------
圖2 RIFF WAVE Chunk
以FIFF作為標(biāo)示,然后緊跟著為size字段,該size是整個(gè)wav文件大小減去ID和Size所占用的字節(jié)數(shù),即FileLen - 8 = Size。然后是Type字段,為WAVE,表示是wav文件。
結(jié)構(gòu)定義如下:
struct RIFF_HEADER
{
char szRiffID[4]; // R,I,F,F
DWORD dwRiffSize;
char szRiffFormat[4]; // W,A,V,E
};
Format Chunk
字節(jié)數(shù) 具體內(nèi)容
| ID | 4 Bytes | ‘fmt’
| Size | 4 Bytes | 數(shù)值為16或18,18則最后又附加信息
| FormatTag | 2 Bytes | 編碼方式,一般為0x000
| Channels | 2 Bytes | 聲道數(shù)目,1--單聲道;2--雙聲道
|SamplesPerSec | 4 Bytes | 采樣頻率
| AvgBytesPerSec| 4 Bytes | 每秒所需字節(jié)數(shù) ===> WAVE_FORMAT
| BlockAlign | 2 Bytes | 數(shù)據(jù)塊對(duì)齊單位(每個(gè)采樣需要的字節(jié)數(shù))
| BitsPerSample | 2 Bytes | 每個(gè)采樣需要的bit數(shù) | 2 Bytes | 附加信息(可選通過(guò)Size來(lái)判斷有無(wú))
圖3 Format Chunk
以fmt 作為標(biāo)示。一般情況下Size為16,此時(shí)最后附加信息沒(méi)有;如果為18則最后多了2個(gè)字節(jié)的附加信息。主要由一些軟件制成的wav格式中含有該2個(gè)字節(jié)的附加信息。
結(jié)構(gòu)定義如下:
struct WAVE_FORMAT
{
WORD wFormatTag;
WORD wChannels;
DWORD dwSamplesPerSec;
DWORD dwAvgBytesPerSec;
WORD wBlockAlign;
WORD wBitsPerSample;
};
struct FMT_BLOCK
{
char szFmtID[4]; // f,m,t,
DWORD dwFmtSize;
WAVE_FORMAT wavFormat;
};
Fact Chunk
==================================
| |所占字節(jié)數(shù)| 具體內(nèi)容 |
==================================
| ID | 4 Bytes | fact |
----------------------------------
| Size | 4 Bytes | 數(shù)值為4 |
----------------------------------
| data | 4 Bytes | |
----------------------------------
圖4 Fact Chunk
Fact Chunk是可選字段,一般當(dāng)wav文件由某些軟件轉(zhuǎn)化而成,則包含該Chunk。
結(jié)構(gòu)定義如下:
struct FACT_BLOCK
{
char szFactID[4]; // f,a,c,t
DWORD dwFactSize;
};
Data Chunk
==================================
| |所占字節(jié)數(shù)| 具體內(nèi)容 |
==================================
| ID | 4 Bytes | data |
----------------------------------
| Size | 4 Bytes | |
----------------------------------
| data | | |
----------------------------------
圖5 Data Chunk
Data Chunk是真正保存wav數(shù)據(jù)的地方,以data作為該Chunk的標(biāo)示。然后是
數(shù)據(jù)的大小。緊接著就是wav數(shù)據(jù)。根據(jù)Format Chunk中的聲道數(shù)以及采樣bit數(shù),
wav數(shù)據(jù)的bit位置可以分成以下幾種形式:
| 單聲道 | 取樣1 | 取樣2 | 取樣3 | 取樣4 | 8bit量化 | 聲道0 | 聲道0 | 聲道0 | 聲道0
| 雙聲道 | 取樣1 | 取樣2
| 8bit量化 | 聲道0(左) | 聲道1(右) | 聲道0(左) | 聲道1(右)
取樣1 | 取樣2 |
| 單聲道 |
| 16bit量化 | 聲道0 | 聲道0 | 聲道0 | 聲道0 |(低位字節(jié))|(高位字節(jié)) |(低位字節(jié))|(高位字節(jié))
取樣1
| 雙聲道 |------------------------------------------------
| 16bit量化 | 聲道0(左) | 聲道0(左) | 聲道1(右) | 聲道1(右)
|(低位字節(jié)) | (高位字節(jié)) | (低位字節(jié)) | (高位字節(jié))
圖6 wav數(shù)據(jù)bit位置安排方式
Data Chunk頭結(jié)構(gòu)定義如下:
struct DATA_BLOCK
{
char szDataID[4]; // d,a,t,a
DWORD dwDataSize;
};
看完上面這些我們應(yīng)該要清楚在文件的開(kāi)始地址偏移0x18(24)處是文件的采樣頻率,0x16(22)處是聲道,0x2c(44)處才是真正的wave數(shù)據(jù),也就是我們要播放的數(shù)據(jù)。
下面是UDA1314通過(guò)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
下面介紹一下L3總線(xiàn)接口
L3就是line 3(3條線(xiàn))的意思,它只有L3DATA(數(shù)據(jù)線(xiàn):用于傳輸數(shù)據(jù))、L3MODE(模式線(xiàn):用于選擇模式)、L3CLOCK(時(shí)鐘線(xiàn):用于傳輸時(shí)鐘)。L3一共有兩個(gè)模式:地址模式和數(shù)據(jù)傳輸模式,先傳輸?shù)刂纺J綌?shù)據(jù),再傳輸數(shù)據(jù)模式數(shù)據(jù)。L3MODE為低時(shí)是地址模式,L3MODE為高時(shí)是數(shù)據(jù)傳輸模式。L3DATA和L3CLOCK相互作用,完成8位數(shù)據(jù)的傳輸,傳輸?shù)捻樞蚴窍鹊臀粩?shù)據(jù),再高位數(shù)據(jù)。
地址模式是用于選擇設(shè)備和定義目標(biāo)寄存器,在這種模式下,8位數(shù)據(jù)的含義是:高6位是設(shè)備地址(UDA1341的地址為000101),低兩位是后面數(shù)據(jù)模式下寄存器的類(lèi)型(00:DATA0,01:DATA1,10:STATUS)。只要沒(méi)有再改變地址模式下的數(shù)據(jù),則數(shù)據(jù)模式下的數(shù)據(jù)始終是傳輸?shù)缴弦粋€(gè)地址模式所定義的寄存器內(nèi)。
在傳輸數(shù)據(jù)模式下,STATUS是用于設(shè)置復(fù)位,系統(tǒng)時(shí)鐘頻率、數(shù)據(jù)輸入模式、DC濾波等內(nèi)容。DATA0分為直接尋址模式和擴(kuò)展尋址模式,直接尋址模式是直接進(jìn)行模式的控制,包括音量、靜音等等,而擴(kuò)展尋址模式是在直接尋址模式下先設(shè)置3位擴(kuò)展地址,再在直接尋址模式下設(shè)置5位擴(kuò)展數(shù)據(jù)。在DATA1下,可以讀取到被檢測(cè)峰值。
//////////////////////////////////////////////////////////////////////////////////////////////////
在該實(shí)驗(yàn)中我們播放的是wav文件,所以要想正確的播放文件,我們必須對(duì)wave文件有一些了解。
我們用的wave文件是wav格式轉(zhuǎn)化成的C語(yǔ)言文件,實(shí)際上就是一個(gè)數(shù)組,該文件可以通過(guò)Advanced MP3 WMA Recorder軟件錄音生成wav格式音頻文件,然后通過(guò)軟件WinHex生成我們需要的C文件,我在實(shí)驗(yàn)中保存為.h的頭文件添加到該程序中。
下面是wave格式文件介紹:
一、綜述
RIFF是英文Resource Interchange File Format的縮寫(xiě),每個(gè)WAVE文件的頭四個(gè)字節(jié)便是“RIFF”。
WAVE文件是由若干個(gè)Chunk組成的。按照在文件中的出現(xiàn)位置包括:
1、RIFF WAVE Chunk,
2、Format Chunk,
3、Fact Chunk(可選),
4、Data Chunk。
具體見(jiàn)下圖:
------------------------------------------------
|
|
|
------------------------------------------------
|
|
------------------------------------------------
|
|
------------------------------------------------
|
|
------------------------------------------------
小(去除ID和Size所占的字節(jié)數(shù)后剩下的其他字節(jié)數(shù)目),4個(gè)字節(jié)表示,低字節(jié)表示數(shù)值低位,高字節(jié)表示數(shù)值高位。下面具體介紹各個(gè)Chunk內(nèi)容。所有數(shù)值表示均為低字節(jié)表示低位,高字節(jié)表示高位。
二、具體介紹
RIFF WAVE Chunk
以FIFF作為標(biāo)示,然后緊跟著為size字段,該size是整個(gè)wav文件大小減去ID和Size所占用的字節(jié)數(shù),即FileLen - 8 = Size。然后是Type字段,為WAVE,表示是wav文件。
結(jié)構(gòu)定義如下:
| ID
| Size
| AvgBytesPerSec|
| BitsPerSample |
以fmt 作為標(biāo)示。一般情況下Size為16,此時(shí)最后附加信息沒(méi)有;如果為18則最后多了2個(gè)字節(jié)的附加信息。主要由一些軟件制成的wav格式中含有該2個(gè)字節(jié)的附加信息。
Fact Chunk
Data Chunk
數(shù)據(jù)的大小。緊接著就是wav數(shù)據(jù)。根據(jù)Format Chunk中的聲道數(shù)以及采樣bit數(shù),
wav數(shù)據(jù)的bit位置可以分成以下幾種形式:
|
|
| 16bit量化 |
|
看完上面這些我們應(yīng)該要清楚在文件的開(kāi)始地址偏移0x18(24)處是文件的采樣頻率,0x16(22)處是聲道,0x2c(44)處才是真正的wave數(shù)據(jù),也就是我們要播放的數(shù)據(jù)。
下面是UDA1314通過(guò)IIS接口的放音程序
#include"2440addr.h"
#include"WindowsXP_Wav.h"
#include"What_are_words.h"
#include"def.h"
//L3接口
#define L3C (1<<4)
#define L3D (1<<3)
#define L3M (1<<2)
評(píng)論