全部博文(321)
分类: 嵌入式
2014-05-14 23:25:58
音频(DMA、IIS、UDA1341)录音和播放
其中:SPI线:数据线,时钟线和片选线。
内容:IIS控制模块、DMA搬运数据、中断、音频编解码芯片
DMA特点:搬运数据 速度快,顺畅。
DMA部分:
1:DMA:有四个通道,每个通道有7个请求源
我们这边是用channel-1用来录音,channel-2用来播放
※IISSDO与IISSDI不要同时用一个通道,不然很费时。
2:FSM有限状态机:整个DMA可以看做一个FSM,每个通道也可以看作一个FSM。每个FSM包含一个SUB-FSM。
FSM:整体控制
SUB-FSM:数据的搬运
3:三种状态:
4:原子操作:不能被打断的操作,(读或写操作);
5:两种服务模式
① 整服务模式特点: 子状态机一直在重复操作CURR-TC一直在递减,当CURR-TC为 0, 就清除ACK;
② 单服务模式特点:子状态机的操作只做一次,就会清除ACK;
※共同特点:当CURR-TC变为0时,会产生中断
不同特点:单服务模式:搬运一次查询一次
整服务模式:一次性搬完
6:DMA模式:单服务模式、单服务握手、整服务握手
查询模式:当读写完时,ACK就变为无效,它就会去查询REQ,
若REQ是低电平,表示还要继续读写数据
若REQ为高电平,就一直等待,等REQ变为低电平
握手模式:当握手模式下完成读写操作时,ACK变为高电平,REQ触发通知REQ读写操作完成,可继续下次操作,接着REQ就触发下一次的ACK。
7:传输的大小: unit vs burst4
配置时要考虑实际情况,考虑缓存大小是其中一种。
8:数据流向
录音数据流向:
① vinl 或者vinr 进入编解码芯片
② 在编解码芯片中经模数转换(ADC)后,通过DATAO脚输入CPU中(IIS模块)
③ IIS中,由SD进来,通过SFTR(移位寄存器)------ >RxFIFO
④ 通过DMA将RxFIFO存入内存中
播放音乐数据流向:
① 通过DMA将内存中的数据搬至TxFIFO中-àSFTR-àSD
② 有DATAI进入编解码芯片--à数模装换 (DAC)------àVoutL /VoutR
9:管脚配置
CDCLK:编码时钟 L3MODE:低电平表示传输一个地址
IISSCLK:音频数据信号同步时钟 高电平表示传输的是数据
IISLRCK:左右声道时钟 L3DATA:双向
IISSDI:串行数据输入 L3CLOCK:同步时钟,都是主--à从
IISSDO:串行数据输出
10:SCLK:串行时钟,与音频数据同步
LRCK:左右声道时钟,半周期为左,半周期为右
※ LRCK : SCLK = 1 : 16
11:数据传输模式:IIS-bus Format 与 MSB-justified Format
IIS-bus Format 好处:有一个空白周期作准备,保证数据部丢失(高位重要);
12:左右声道的频率其实就是采样率,采样率越高,声音还原就越逼真。
采样率:一秒钟内对声音信号的采样次数。
13:系统时钟:采样一次(左右声道各完成一次),芯片工作的时钟。
芯片工作频率 = 采样率 * 系统时钟 (如 44.1KHZ * 256 = 11.289
14;外部设备寄存器的配置:
① 都是通过协议来配置
② 通过协议来配置的,首先要先传地址过来
音频编解码芯片(UDA1341)
1:UDA1341 地址:000101 + 接下来的数据类型(bit 0 或者 bit 1)
地址发送: L3MODE低电平 + 8个脉冲
2:只有未经过压缩的才能转换
3:音乐播放停止,将buffer关掉因为耗电
一、DMA
补充:音频的数据在内存。即从内存搬运到IIS内存模块,所以要告诉DMA源地址和目的地址。而且要知道内存指针的增长的还是固定的,这是源地址的特点。目的地址也一样,是往上增长还是固定的。而且到底每次要搬运多少个单元,每个单元的大小(多少个字节为一个单元)。要搬多少次才算搬完,工作量嘛。是每次搬运完请求一次(单服务模式),还是全部搬运完请求一次(整服务模式)即服务模式。是有请求就搬运还是要等有应答才搬运,即搬运模式:查询模式还是握手模式
录音实现原理:声音由MIC2输入,变为左右声道,另一个麦没有接。然后到编解码芯片内部(UDA1341),经过PGA,增益放大,经过模数转换(ADC),再请过一些处理(滤波等),然后从DATAO出去。然后对应的是I2SSDI/I2SSDO--这个I和O是对CPU来说的。然后到达CPU那边。即对应的是接SD(有两根线)线进去。然后经过移位寄存器(说明是串行的)SFTR,然后到RXFIFO的接收BUFFER。我们只要从RxFIFO读出数据就行了。
播放音乐实现原理:数据原来在内存中,然后DMA直接搬运到TXFIFO就行了。再经过移位寄存器SFTR,再串行输出由SD(两根线).。再到达DATAI,进入编解码芯片,再经过一些处理,再经过数模转换DAC,在输出去。
1.宏定义的时候0x2写成0x10那边错了,搞了很久,下不为例
2.DMA总共四个通道(这边是公用DMA):DMA2用于播放--I2SSDO(源:系统; 目:外围),DMA1---I2SSDI用于录音(源:外围,目:系统)。----主要看在系统总线上还是外围总线。--注,不要播放和录音用同一个请求源。我们这边播放也可以用CH-O,DMA0
附:每个通道有七个请求源,其中:I2SSDI和I2SSDO;
3,DMA,用于从内存搬运数据到IIS模块的buffer的往返,记住,内存地址可以增长,但是buffer是固定
FSM:有限状态机--DMA就是用这个来工作的。但是:内部还包含子状态机(sub-FSM),两者有分工:FSM负责整体控制(就是一次搬运多少等),sub-FSM负责搬运数据。
其主要分三种状态:
状态一:等待。DMA ACK和INT REQ为0,但是其是高电平,只是无效状态而已,注意。
状态二:DMA ACK变为1,此时搬运的次数会加载到counter里面。(即从DCON[9:0]--->CURR_TC).--有接收到请求:REQ变为低电平。延时两个周期,DMA的ACK有应答。再经过三个周期,就开始读写信号。
状态三:原子操作(这边称读写不能被打断),子状态机负责读写数据,即从源-->目。整服务:读写读写,直到counter为0,再清掉ACK;单服务:当counter变为0,有个中断标志改变,ACK也会清掉(ack每次原子操作都会有一次有效无效)。共同点:当counter变为0了,就会产生一个中断。
查询模式:
DMA每搬运一次数据(每读写一次完)后,ACK变为高电平,然后马上查询REQ信号是高电平还是低电平,如果REQ是低电平,则继续下一次搬运操作,如果是高电平的话,进入等待。等待REQ进入低电平,才进入下一次操作。
握手模式:
当REQ信号变为低电平,则延时两个时钟周期,然后ACK变为低电平,则进入读写,此时REQ的信号变为高电平。当一次读写操作完后,ACK变为高电平,然后马上告诉REQ信号说已经搬运完,并触发REQ为低电平。然后REQ在触发ACK信号。两者相互交互。直到counter为0。
传输速度:burst4(4个字节)和一个字节。要考虑内存(无所谓)或者是IIS的BUFFER(32位)--所以不能超过,比如:如果一次4个字节,每次搬运两个单元。则不行。
4.DMA2。源地址,内存,目的地址,buffer
5.DMA1.源地址,buffer,目的地址,内存1,是公用的DMA,(4个通道。)三种工作状态1-3.
IISSDI==(录音,通道1)IISSDO(播放,可用通道0和通道2,我们这边用通道2)
6.单服务:三个主FSM有限状态机都执行完,停在状态一,CURR_TC减一
7全(整体)服务:三个主FSM有限状态机都执行完,停在状态三,直到CURR_TC 减为0.
8.当全服务CURR_TC变为0或者单服务完成原子操作,将清除DMAACK;
当CURR_TC变为0时,发出INTREQ,与哪种服务模式无关;
9.FSM是控制,真正工作的是SUB-FSM;传输大小:请求/应答协议:单服务查询、 当服务握手、全服务握手模式;
10.unit,burst4;一个字节和四个 字节(连续4次进行读读读读写写写写);
查询模式:REQ发出请求信号,延时至少2XSCLK,产生ACK,至少再延时三个XSCLK,才进行读写操作。读完后,ACK置一,查询此时的REQ为高或低,若为低,则ACK变低,延时三个XSCLK后,再进行读写,如此反复,知道查询到REQ为高。则停止。
单元传输大小服务握手的单服务:REQ发出请求信号,延时至少2XSCLK,产生ACK,差不多延时两个时钟信号,触发REQ为高,之后进行读写操作后,ACK变(与下区别从这)高,触发REQ为低。REQ为低,经过两个时钟周期,又触发ACK为低,如此反复。
单元传输大小服务握手的全服务::REQ发出请求信号,延时至少2XSCLK,产生ACK,差不多延时两个时钟信号,触发REQ为高,之后进行读写操作后,然后延时2个周期,再读写,再延时两个周期再读写。直到读完,ACK为高。
11.rDISRC2 = (U32)voicebuf=31000000源地址内存地址,可以增长。rDISRCC2 = 0x0;// 源在AHB系统总线上(0),
12.rDIDST2 = (U32)IISFIFO;//目的地址==buffer。内存地址增加(0),buffer不能增加
rDIDSTC2 = (0x0<<2) |(0x1<<1) |(0x1<<0);
13.DCON2=((U32)0x1<<31) |(0x0<<30) |(0x1<<29) |(0x0<<28) |(0x0<<27)|(0x0<<24) | (0x1<<23) |(0x1<<22) |(0x1<<20) |(bytes/2) ;
bytes=DSZ*TSZ(1或4单)*TC=(2*1*TC),若要重载的时候,即播完以后重复,要把 DMA2和IIS_STOP关掉。
14.清中断rDMASKTRIG1 |= (0x1<<1);//START DMA1,open channel 1【DMA开关】
remain_bytes = rDSTAT2;读取剩余几个字节
curr_addr = rDCSRC2;读取当前的地址;
同理录音;
二、IIS(音频)----音乐的播放和录音整个模块都是挂在外部总线上PCLK。。
Ud1341编解码芯片的时钟SYSCLI由CDCLK提供。两个buffer,发送和接收(IISFIFO),但是是同一个地址。录音的时候:源地址;播放:目的地址。
DMA传输的时候是有一个标准flag作标志的。
IIS的采样率一般是44.1KHZ音质会比较好。
编解码时钟 = 左右声道频率(44.1KHZ)*系统时钟(256或者384) -------32bit(z左16右16bit).
串行时钟:系统时钟/32位(也有16位)
1.通过I2SSDI和I2SSDO串行数据的输入输出,可以找到GPECON=((0x2<<8) |(0x2<<6) | (0x2<<4) |(0x2<<2) |(0x2<<0) );看原理图再找到对应的 GPB=((0x1<<8) |(0x1<<6) |(0x1<<4) );输出功能;rGPBDAT |= (0x1<<4) |(0x1<<3) |(0x1<<2) ;。(4跟线:I2SLRCK,左右声道时钟,I2SSCLK音频串行 时钟);
2.5位预分频器,一个用于IIS总线接口的主时钟发生器,另一个用于外部 CODEC(UDA1341)的时钟发生器,两者一样。要相等。
3.64字节发送,接受FIFO,发送,数据写到TxFIFO ,接受,从RxFIFO读取数据。
4.采用MSB左对齐,高位先发。
5.左右声道的频率=采样率44.1KHZ,即左声道44.1KHZ,右声道也是44.1KHZ;
6.系统时钟256,或384.所以编解码的频率为44.1*256=11.2896,或者44.1*384=16.9344;
7.set_IIS_for_play;rIISCON= (0x1<<8) |(0x1<<5)|(0x0<<4) |(0x0<<3) |(0x1<<2) |(0x1<<1);bit【0】为IIS开关;先关后开注意:当接收的时候,发送关闭,当发送的时候,接收关闭,节能。
8.rIISMOD==(0x0<<9) |(0x0<<8) | (0x2<<6) |(0x0<<4) | (0x1<<3) |(0x1<<2) |(0x1<<0) ;采用IIS总线格式。有延时一个位,安全
9.预分频器A=B,也就是SCLDG=CDCLK,pclk=50M,CDCLK=16.9344M,N+1 = 50/16.9344=3,rIISPSR |=(2<<5 )|2;N=2;
10.Riisfcon=(0x1<<15) |(0x0<<14) |(0x1<<13) |(0x0<<12);同理录音
三、UDA1341(固定地址0001 01--)后两位是接下来的数据类型。
1.后两位分别是:三种状态:00DATA0、01DATA1、10STATUS;11暂时没用到
2.先发地址再发数据,发一个地址后可以发好几个数据,照着手册 UDA1341TS_4第十二页,写地址,第十三页写数据;
3.传地址和传数据安装时序图写。记住开头不一样。地址前面可省,发送数据的话,前面那个时序图要写。
4.记住:发送数据时,前面的Tstp(L3)和后面Tstp(L3)都要写;具体延时看第 二十六页。
5.for(j=0; j<100; j++);// th(L3)a>190ns====1*10^9/(400*10^6(M))*3(三条汇编语言)*100=750ns
for(i=0; i<8; i++)
{
if(ADDR&0x1)//bit[0]first//这里是大概,详细请看代码
L3_CLOCK_L;
L3_DATA_H;
for(j=0; j<100; j++);//半个周期tclk(L3)L>250ns
L3_CLOCK_H;
for(j=0; j<100; j++);//半个周期tclk(L3)H>250ns
ADDR>>=1;}
6.发数据。类似;
7.注:void set_L3_data(U8 ADDR,U8* pdata,U32 size)//因为数组名作为参 数传递的时候,当做指针,无法知道大小,所以要写一个数据大小。
8.DATA0(00-01-10-11)1其中1:110和111为扩展地址,我们发送扩展地 址时(其实也是数据),先发送地址,11000 EA2,EA1,EA0;之后发数据, 111 ED4-ED0为数据;
9. MM = mixer mode , input channel 2 select因为我们是用channel 2;是看 你的麦克风接的通道,而不是DMA通道
eg:
if(mode == IISRECORD)
{
/*//声音调节(VC5:VC0)
bit[7:6] 00(声音控制)01(bass boost(4bit),treble(2bit))10(PP,DE(de-emphasis 2bit),MT(哑音),M(mode switch 2bit))
bit[5:0] 0000 0, VC5~VC0 , set Volume = 0 */
redata[i++] = 0x0;
/*
bit[7:3] 1100 0 (extended address 3bit )
bit[2:0] 010, 用来调节MS and MM(话筒的输入(单个活着 双个))*/
redata[i++] = 0xc2;
/*
bit[7:5] 111 (固定(发送扩展地址的数据))
bit[4:2] 011, MS = MIC sensitivity(麦的敏感度调节3bit) +9
bit[1:0] 10, MM = mixer mode , input channel 2 select因为我 们是用channel 2*/
redata[i++] = (0x7<<5) |(0x4<<2) |(0x2<<0) ;
set_L3_data((U8)UDA1341DATA0, redata,i);
}
10、L3是一种协议,音频芯片UDA1341,也要进行寄存器配置
11、发送与三星的LCD屏一样,要先发送地址,再发送数据。
12.发送data0,有扩展地址, 如果要录音,这个要配置