再上一篇:5.7.5 USB 器件控制器
上一篇:5.8 多媒体通讯器单元
主页
下一篇:5.8.3 多媒体卡控制器
再下一篇:第六章 Xscale 应用处理器开发及应用实例
文章列表

5.8.2 内部集成电路声音(I2S)控制器

嵌入式系统(修订本)——Intel XScale 结构与开发 陈章龙 著

I2S 是一个用于数字立体声的规程。PXA250/210 的I2S 控制器控制I2S 连接(I2SLINK), 它使用低功耗的四线串行接口与立体声设备相连。I2S 和AC97 接口不能同时使用。

一、简介

I2SC 由在应用处理机系统存贮器和外部I2S Codec 之间传送数字化声音信号的缓冲器、 状态和控制寄存器、串行转换器和计数器组成。

在回放数字化声音或产生合成声音时,I2SC 从I2SLINK 发送至Codec。外部Codec 中的

D/A 转换器把声音数据转换成模拟声音波形

为记录数字化声音,I2SC 从Codec(通过I2SLINK)接收数字化采样值,存放于应用处 理机系统存贮器。

I2S 控制器支持一般的I2S 和MSB 调整I2S 格式。4 根或可选为5 根脚把控制器连接至外 部的Codec:

z 一个位速率时钟,可使用内部或外部源。

z 一个同步或“左/右”控制信号。

z 两个串行声音脚:一个输入,一个输出。

z 另一个可选的系统时钟可从I2SC 发至Codec。

对I2S 系统,需额外的脚控制外部Codec。有些Codec 使用L3 控制总线,它需要三个信 号:L3_CLK、L3_DATA 和L3_MODE,以把字节写入L3 总线寄存器。

I2SC 通过软件控制GPIO 脚来支持L3 总线规程。I2SC 不提供L3 总线规程的硬件支持。 为在串行线上传送数字化立体声,有两个相似的规程:一般 I2S 和 MSB 调整 I2S。两者

均使用多种时钟速率,可来自PLL 时钟通过可程控分频器的分频值,或来自外部时钟源。
二、引脚

1、SYSCLK/GP32:I2S 单元的基本时钟。它通过PLL 时钟的可程控分频器得到大约2MHZ 至12.2MHZ 的频率。它256 倍于声音采样频率。仅在BITCLK 设置为输出时,SYSCLK 从 应用处理机系统输出。否则它可用作通用I/O 脚。

2、BITCLK/GP28:它供给用于外部 Codec 作采样逻辑的串行声音位速率。BITCLK 为 SYSCLK 频率的四分之一,64 倍于声音采样频率。每个 BITCLK 周期传送一位串行声音数 据。一个串行声音采样值由左和右信号组成,每个包含 8、16 或 32 位。BITCLK 可设置为 输入或输出。

3、SYNC/GP31:它为BITCLK 的64 分频,为8KHZ 至48KHZ 信号。SYNC 状态用于 指出现行串行数据采样值为左或右声道数据。

4、SDATA_IN/GP29 和SDATA_OUT/GP30:它们用于从Codec 接收/发送串行声音数据。

表5-38 给出了在I2SC 供给BITCLK 时的时钟选择值。
表 5-38 I2SC 支持的采样频率

Audio Clock Divide r 寄存器[31:0]

SYSCLK = 147.6

MHz / (SADIV)

BITCLK =

SYSCLK / 4

SYNC 或采样频率= BITCLK / 64

0x0000-000C

12.288 MHz

3.072 MHz

48.000 kHz (closest std = 48 kHz)

0x0000-000D

11.343 MHz

2.836 MHz

44.308 kHz (closest std = 44.1 kHz)

0x0000-001A

5.671 MHz

1.418 MHz

22.154 kHz (closest std = 22.05 kHz)

0x0000-0024

4.096 MHz

1.024 MHz

16.000 kHz (closest std = 16.00 kHz)

0x0000-0034

2.836 MHz

708.92 kHz

11.077 kHz (closest std = 11.025 kHz)

0x0000-0048

2.048 MHz

512.00 kHz

8.000 kHz (closest std = 8.00 kHz)

注:对MPEG2 和MPEG4 应设置为48KHZ 采样速率。对MP3 为44.1KHZ。
三、操作

I2SC 可由处理机或DMA 控制器来访问。

处理机使用程控I/O 指令来访问I2SC,能访问以下类型数据:

z I2SC 寄存器数据——所有寄存器为32 位

z I2SC FIFO 数据——写入 I2SC 的串行声音数据寄存器(SADR),把数据写入发送

FIFO。读出SADR,移走接收FIFO 的一个数据。

z I2S Codec 数据——能通过L3 总线访问Codec 寄存器。

DMA 控制器只能访问FIFO:

z 在发送FIFO 单元数少于发送阀值时产生发送FIFO 请求。

z 在接收FIFO 单元数等于或多于接收阀值时产生接收FIFO 请求。

四、数据格式

1、FIFO 和存贮器格式

FIFO 为16 字深32 位宽。每个32 位字存放声音采样值(左、右声道),左声道为位15~0, 右声道为位31~16。在16 位中,声音采样值为左调整,即在少于16 位时,右边(LSB)填 入0。

2、I2S 和MSB 调整串行声音格式

I2S 和MSB 调整是相似的两种串行传送数字化立体声规程。

BITCLK 控制串行声音位速率,它的频率64 倍于声音采样频率。它的64 分频的信号定 义串行数据通道上左、右声道串行数据采样值的定时关系。按 SYNC 信号在 SDATA_IN 和 SDATA_OUT 脚上传送左/右声道信号至Codec。

在一般I2S 方式,SYNC 为低,传送左声道;高传送右声道。每个数据采样值的MSB 在

SYNC 跳变前的一个BITCLK 上。

对MSB 调整方式,SYNC 为高,传送左声道;低传送右场道。每个数据采样值的MSB
发生于SYNC 跳变处。
五、寄存器

I2S 控制器有7 个32 位寄存器,见表5-39。

表 5-39 I2SC 寄存器

地址(paddr(9:0))

寄存器名称

描述

0x4040-0000

SACR0

全局控制寄存器

0x4040-0004

SACR1

串行声音控制器I2S/MSB 调整控制寄存器

0x4040-0008

-

保留

0x4040-000C

SASR0

串行声音控制器I2S/MSB 调整状态寄存器

0x4040-0014

SAIMR

串行声音中断屏蔽寄存器

0x4040-0018

SAICR

串行声音中断清零寄存器

0x4040-001C 到 0x4040-005C

-

保留

0x4040-0060

SADIV

串行声音时钟分频寄存器

0x4040-0064 到0x4040-007C

-

0x4040-0080

SADR

串行声音数据寄存器

(TX 和 RX FIFO 存取寄存器).

1、串行声音控制器全局控制器寄存器SACR0


位31~16:保留
位 15~12:RFTH——接收 FIFO 中断或 DMA 阀值。RFTH=0~15。在接收 FIFO 有大于 等于(RFTH+1)个单元时产生接收DMA 请求。
位 11~8:TFTH——发送 FIFO 中断或 DMA 阀值。TFTH=0~15。在发送 FIFO 有小于
(TFTH+1)个单元时产生发送DMA 请求。 位7、6:保留。
位5:STRF——特殊方式(EFWR)串行发送或接收FIFO。

0=选择发送FIFO,在EFWR=1 时,只能读/写发送FIFO。

1=选择接收FIFO,在EFWR=1 时,只能读/写接收FIFO。 位4:EFWR——允许FIFO 写/读的特殊工作方式。

0=禁止特殊方式的FIFO 写/读功能。

1=允许特殊方式的FIFO 写/读功能。 位3:RST——复位

0=无复位。

1=复位FIFO 逻辑和除了SACR0 以外的其他寄存器。 位2:BCKD——BITCLK 输入/输出方式。

0=输入,BITCLK 由外部源驱动。

1=输出,BITCLK 内部驱动,输出至Codec。

位1:保留

位0:ENB——允许I2S 功能。

0=禁止I2SLINK。

1=允许I2SLINK。

注:在不同的DMA 传送大小时,推荐的TFTH 和RFTH 值见表5-40。 表 5-40 DMA 服务的 TFTH 和 RFTH 值

DMA 传输

大小

FIFO 项的

个数

TFTH 值

RFTH 值

DMA 传输

大小

FIFO 项的

个数

Min

Max

Min

Max

8 字节

2

0

14

1

15

16 字节

4

0

12

3

15

32 字节

8

0

8

7

15

2、串行声音控制器I2S/MSB 调整控制寄存器SACR1


位31~6:保留
位5:ENLBF——允许反馈功能

0=禁止I2S 反馈功能

1=允许I2S 反馈功能 位4:DRPL——禁止I2S 重放功能

0=允许重放功能

1=禁止重放功能

位3:DREC——禁止I2S 录音功能

0=允许录音功能

1=禁止录音功能

位2、1:保留

位0:AMSL——指定I2S 或MSB 调整方式操作

0=选择一般I2S 工作方式

1=选择MSB 调整工作方式

3、串行声音控制器状态寄存器SASR0


位31~16:保留
位15~12:RFL——接收FIFO 单元数。 位11~8:TFL——发送FIFO 单元数。
位7:保留
位6:ROR——接收FIFO 溢出。

0=接收FIFO 没发生溢出

1=I2S 试图向满的接收FIFO 写入数据。在允许时可产生中断,由置位串行 声音中断清零寄存器的位6 所清0。

位5:TUR——发送FIFO 下溢出

0=发送FIFO 没发生下溢出

1=I2S 试图从空的发送FIFO 读数据。在允许时可产生中断。由置位串行声 音中断清零寄存器的位5 所清0。

位4:RFS——接收FIFO 服务请求。

0=接收FIFO 单元数在RFL 阀值之下,或禁止I2S。

1=接收FIFO 单元数等于或高于RFL 阀值。在允许时可产生中断。在接收

FIFO 单元数少于(RFTH+1)时自动清0。 位3:TFS——发送FIFO 服务请求。

0=发送FIFO 单元数超过TFL 阀值,或禁止I2S。

1=发送FIFO 单元数等于或少于TFL 阀值。在允许时可产生中断。在发送

FIFO 单元数大于(TFTH+1)时自动清0。 位2:BSY——I2S 忙

0=I2S 空闲或禁止。

1=I2S 正在发送或接收一个帧。 位1:RNE——接收FIFO 不空

0=接收FIFO 空

1=接收FIFO 不空 位0:TNF——发送FIFO 不满

0=发送FIFO 满

1=发送FIFO 不满

4、串行声音时钟分频寄存器SADIV

SADIV 仅位6~0 有效,它们定义6 种BITCLK 频率。

0001100=3.072MHZ BITCLK

0001101=2.836MHZ BITCLK

0011010=1.418MHZ BITCLK

0100100=1.024MHZ BITCLK

0110100=708.92KHZ BITCLK

1001000=512KHZ BITCLK

5、串行声音中断请零寄存器SAICR


位31~7:保留
位6:ROR:写入1 清0 接收FIFO 溢出中断和SASR0 的ROR 标志。
位5:TUR:写入1 清0 发送FIFO 下溢出中断和SASR0 的TUR 标志。 位4~0:保留

6、串行声音中断屏蔽寄存器SAIMR


位31~7:保留
位6:ROR——接收FIFO 溢出中断允许

0=禁止接收FIFO 溢出中断。

1=允许接收FIFO 溢出中断。 位5:TUR——发送FIFO 下溢出中断允许

0=禁止发送FIFO 下溢出中断

1=允许发送FIFO 下溢出中断 位4:RFS——接收FIFO 服务请求中断允许

0=禁止接收FIFO 服务请求中断

1=允许接收FIFO 服务请求中断 位3:TFS——发送FIFO 服务请求中断允许

0=禁止发送FIFO 服务请求中断

1=允许发送FIFO 服务请求中断

位2~0:保留

7、串行声音数据寄存器SADR

写入SADR 把32 位采样值写入发送FIFO。读出SADR 从接收FIFO 中读出数据。