mini2440硬件篇之IIS
扫描二维码
随时随地手机看文章
IIS(集成音频接口)于上个世纪80年代首先被Philips公司用于消费产品的音频设备。被广泛运用于CD、数字音频磁带、数字音频处理器和数字TV音频。
IIS的组成一般来说包括4个管脚:串行数据输入(IISDI)、串行数据输出(IISDO)、左/右通道选择(IISLRCK)、串行位时钟(IISCLK);产生IISLRCK和IISCLK的是主控器。在S3C2440上和IIS相关的接口还有一个用于提供CODEC时钟的管脚。就时序信号工作来说,当IISSCLK提供不间断的时钟信号的时候IISLRCK会以“数据位+1”的宽度方式产生周期信号。低电平时期表示左声道,高电平时期表示右声道。然后IISDI或者IISDO就按照一定的格式不断的发送/接收数据。
至于这种数据的格式,根据S3C2440的芯片资料的说明可以知道这样以MSB为首位可以让传输器和接收器不用知道对方的字长。数据还是按照各自的字长进行截取,如果不能匹配就会造成截断或者添0(意思是如果系统字长为32位而传输器的字长为16位那么传输的时候32位的系统数据就会被折成16位的)反正就是数据位从高到低的传输。至于MSB对齐格式,和上面的时序区别在于MSB总是被首先的传输在左右声道切换的时候。
芯片手册
语音芯片UDA1341TS
/*-----------------------------------------------------------------------------------
*地址模式时序,掌握几个要点
*数据传输的时候保证L3MODE为低
*数据传输开始的信号是保证L3MODE为低L3CLOCK为高
*数据传输结束的信号是保证L3MODE为高L3CLOCK为高
*数据传输过程中一个L3CLOCK的周期传一个数据位
*数据模式时序,掌握几个要点
*数据传输的时候保证L3MODE为低
*数据传输开始的信号是保证L3MODE为高L3CLOCK为高
*数据传输结束的信号是保证L3MODE为高L3CLOCK为高
*数据传输过程中一个L3CLOCK的周期传一个数据位
*------------------------------------------------------------------------------------*/
2.mini2440电路图
3.S3C2440寄存器
s3C2440A的IIS总线接口用于实现一个CODEC接口来扩展8/16位立体声CODEC芯片到便携式应用。IIS总线接口支持IIS总线数据格式和MSB对齐数据格式。接口提供DMA传输模式用于FIFO访问代替一个中断。它能同步的传输和接收数据如同选择单独传输或者接收数据一样好。
时序的速率和音频数据的采样速率相关,因为IIS传输的是数字采样信号。所以数据的传输必须要达到采样速率。这里以一个wav文件作为例子(采样频率44.1KHz、声道数2、数据位数16)。该文件的声音要得到还原,那么数据必须以44.1KHz的速率传输。但是数据是串行传输的,为了在指定时间传输到数据,所以传输速率必须要乘以16才能一个数据以44.1KHz的速率传输,然后由于声道数位2,所以有两个通道要同时传输数据。但是传输通道只有一个,所以为了保证同时,还要在此基础上乘以2。根据上面的时序可以知道是SCLK在控制整个时序,所以得出IISSCLK=采样频率×采样位数×通道数。这里为了简便起见,采样频率记为fs。于是IISSCLK为32fs。知道一个管脚的时序,其他时序也就好确定了。
在S3C2440下,IIS的配置都是通过寄存器来完成的。下面总结一些S3C2440使用IIS接口需要做的一些配置工作。
IIS相关的寄存器:
IISCON寄存器
功能名称
位
说明
LR_CH_INDEX
[8]
左/右声道索引
0——左
1——右
TRANS_FIFO_RFLAG
[7]
传输FIFO准备标识
0——空
1——非空
RECV_FIFO_RFLAG
[6]
接收FIFO准备标识
0——满
1——非满
TRANS_DMA_EN
[5]
传输DMA服务请求
0——关闭
1——使能
RECV_DMA_EN
[4]
接收DMA服务请求
0——关闭
1——使能
TRANS_CH_IDLE_CMD
[3]
在Idle状态IISLRCK是非活动的(暂停Tx)
0——Notidle
1——Idle
RECV_CH_IDLE_CMD
[2]
在Idle状态IISLRCK是非活动的(暂停Rx)
0——Notidle
1——Idle
IIS_PRESCALER
[1]
IIS预分频
0——关闭
1——开启
IIS_EN
[0]
IIS接口使能
0——关闭
1——开启
IISMOD寄存器
功能名称
位
说明
MA_CLK_SELECT
[9]
主时钟选择
0——PCLK
1——MPLLin
MA_SL_MODE
[8]
主/从模式选择
0——主模式(IISLRCK和IISCLK是输出模式)
1——从模式(IISLRCK和IISCLK是输入模式)
TX_RX_MODE
[7:6]
传输/接收模式选择
00——无传输
01——接收模式
10——传输模式
11——传输和接收模式
LR_CH_EN
[5]
左右声道使能
0——右声道
1——左声道
SER_FORMAT
[4]
串行接口格式
0——IIS兼容格式
1——MSB对齐格式(最高位左对齐)
SER_DATA_BIT
[3]
串行数据位数
0——8位
1——16位
MA_CLK_FS
[2]
主时钟频率选择
0——256fs
1——384fs
(fs:采样频率)
SCLK
[1:0]
串行时钟频率选择
00——16fs
01——32fs
10——48fs
11——保留
IISPSR寄存器
功能名称
位
说明
PRE_A
[9:5]
预分频器A的值
PRE_B
[4:0]
预分频器B的值
注意:选择IIS的时钟源(PCLK或者MPLLin)后,经过两个预分频器处理后会分别得到IISSCLK、IISLRCK和CDCLK(预分频器A得到IISSCLK、IISLRCK;预分频器B得到CDCLK)。一般来说,这两个预分频器的值N相等。这里通过CDCLK来计算预分频器B的N值来推知预分频器A的N值,计算公式为CDCLK=时钟源/(N+1)。
IISFCON寄存器
功能名称
位
说明
TX_FIFO_MODE
[15]
传输FIFO访问模式选择
0——普通
1——DMA
RX_FIFO_MODE
[14]
接收FIFO访问模式选择
0——普通
1——DMA
TX_FIFO_EN
[13]
传输FIFO使能位
0——关闭
1——使能
RX_FIFO_EN
[12]
接收FIFO使能位
0——关闭
1——使能
传输FIFO数据计数
[11:6]
数据计数值0~32
接收FIFO数据计数
[5:0]
数据计数值0~32
IISFIFO寄存器
功能名称
位
说明
FENTRY
[15:0]
IISFIFO寄存器保存传输或者接收的音频数据值
3.1.DMA
S3C2440支持4通道位于系统总线和外围设备总线之间的DMA控制器。每个DMA控制器通道能执行数据搬运在系统总线设备和/或外围总线设备之间而没有限制。换句话说,每个通道能处理下面4种情形:
1.源和目地都在系统总线里
2.源在系统总线目地在外围总线
3.源在外围总线目地在系统总线
4.源和目地都在外围总线
DMA的优势是它在传输数据的时候不需要CPU的干预。DMA操作能被软件初始化,或者响应来自内部外围总线或者扩展请求管脚。
DMA请求资源
各个DMA控制器的通道能选择其中一个DMA请求资源,如果H/WDMA请求模式被DCON寄存器选择(注意如果S/W请求模式被选择,这个DMA请求资源无任何意义)。表8-1展示了4个DMA资源于各个通道。
DMA操作
空闲时:DMA_ACK=0;INT_REQ=0;
单服务:知道CURR_TC计数变为0;
全服务:完成一次原子操作;
完成后:DMA_ACK=1;INT_REQ=1;
传输大小
单元(unit)和突发(Burst)
iis.h
/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:iis.h
*Author:HuangYinqing
*Version:1.0
*Date::2012-08-12
*Description:iis音频驱动.
*FunctionList:
*History:
******************************************************************/
/*IIS调试等级*/
#defineDBG_IIS_LEVEL1
/*采样频率选择*/
#defineFRQ_SELECT4
/*使用DMA传输数据*/
//#defineIIS_USE_DMA
/*引脚定义*/
#defineL3C(1<<4)//GPB4=L3CLOCK
#defineL3D(1<<3)//GPB3=L3DATA
#defineL3M(1<<2)//GPB2=L3MODE
#defineMIN_VOLUME0x01
#defineMID_VOLUME0x20
#defineMAX_VOLUME0x3e//==音量最大值
/*缓冲区产度*/
#defineSOUND_DATA_LEN243552
/*函数原型*/
/***************************************************************
**函数名称:voidSoundRecord(unsignedchar*pucRecBuf,unsignedlongulSize)
**函数功能:录音
**入口参数:pucPlayBuf:放音缓冲区;ulSize:缓冲区大小
**出口参数:无
**返回:无
***************************************************************/
voidSoundRecord(unsignedchar*pucRecBuf,unsignedlongulSize);
/***************************************************************
**函数名称:voidSoundPlay(unsignedchar*pucPlayBuf,unsignedlongulSize)
**函数功能:放音
**入口参数:pucPlayBuf:放音缓冲区;ulSize:缓冲区大小
**出口参数:无
**返回值:无
*************