Chinaunix首页 | 论坛 | 博客
  • 博客访问: 845347
  • 博文数量: 321
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 936
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-23 11:25
文章分类

全部博文(321)

文章存档

2017年(1)

2016年(10)

2015年(61)

2014年(187)

2013年(62)

分类: 嵌入式

2014-05-14 23:25:58

音频(DMAIISUDA1341)录音和播放

其中:SPI线:数据线,时钟线和片选线。

内容:IIS控制模块、DMA搬运数据、中断、音频编解码芯片

DMA特点:搬运数据 速度快,顺畅。

DMA部分:

1DMA:有四个通道,每个通道有7个请求源

 

我们这边是用channel-1用来录音,channel-2用来播放

IISSDOIISSDI不要同时用一个通道,不然很费时。

 

2FSM有限状态机:整个DMA可以看做一个FSM,每个通道也可以看作一个FSM。每个FSM包含一个SUB-FSM

FSM:整体控制

SUB-FSM:数据的搬运

 

3:三种状态:

 

4:原子操作:不能被打断的操作,(读或写操作);

 

5:两种服务模式

① 整服务模式特点: 子状态机一直在重复操作CURR-TC一直在递减,当CURR-TC为 0,    就清除ACK

② 单服务模式特点:子状态机的操作只做一次,就会清除ACK

 

※共同特点:当CURR-TC变为0时,会产生中断

  不同特点:单服务模式:搬运一次查询一次

整服务模式:一次性搬完

 

6DMA模式:单服务模式、单服务握手、整服务握手

查询模式:当读写完时,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

④ 通过DMARxFIFO存入内存中

播放音乐数据流向:

① 通过DMA将内存中的数据搬至TxFIFO-àSFTR-àSD

② 有DATAI进入编解码芯片--à数模装换 (DAC------àVoutL /VoutR

 

9:管脚配置

CDCLK:编码时钟 L3MODE:低电平表示传输一个地址

IISSCLK:音频数据信号同步时钟  高电平表示传输的是数据

IISLRCK:左右声道时钟 L3DATA:双向

IISSDI:串行数据输入 L3CLOCK:同步时钟,都是主--à从

IISSDO:串行数据输出

 

10SCLK:串行时钟,与音频数据同步

LRCK:左右声道时钟,半周期为左,半周期为右

※ LRCK  :  SCLK  =  1  :  16

 

11:数据传输模式:IIS-bus Format  与 MSB-justified Format

IIS-bus Format 好处:有一个空白周期作准备,保证数据部丢失(高位重要);

 

12:左右声道的频率其实就是采样率,采样率越高,声音还原就越逼真。

采样率:一秒钟内对声音信号的采样次数。

 

13:系统时钟:采样一次(左右声道各完成一次),芯片工作的时钟。

芯片工作频率  =  采样率 系统时钟  (如 44.1KHZ *  256 =  11.289

 

14;外部设备寄存器的配置:

① 都是通过协议来配置

② 通过协议来配置的,首先要先传地址过来

 

音频编解码芯片(UDA1341

1UDA1341 地址:000101 + 接下来的数据类型(bit 0 或者 bit 1

地址发送: L3MODE低电平   +   8个脉冲

 

2:只有未经过压缩的才能转换

 

3:音乐播放停止,将buffer关掉因为耗电

 

      一、DMA

补充:音频的数据在内存。即从内存搬运到IIS内存模块,所以要告诉DMA源地址和目的地址。而且要知道内存指针的增长的还是固定的,这是源地址的特点。目的地址也一样,是往上增长还是固定的。而且到底每次要搬运多少个单元,每个单元的大小(多少个字节为一个单元)。要搬多少次才算搬完,工作量嘛。是每次搬运完请求一次(单服务模式),还是全部搬运完请求一次(整服务模式)即服务模式。是有请求就搬运还是要等有应答才搬运,即搬运模式:查询模式还是握手模式

 

录音实现原理:声音由MIC2输入,变为左右声道,另一个麦没有接。然后到编解码芯片内部(UDA1341),经过PGA,增益放大,经过模数转换(ADC),再请过一些处理(滤波等),然后从DATAO出去。然后对应的是I2SSDI/I2SSDO--这个IO是对CPU来说的。然后到达CPU那边。即对应的是接SD(有两根线)线进去。然后经过移位寄存器(说明是串行的)SFTR,然后到RXFIFO的接收BUFFER。我们只要从RxFIFO读出数据就行了。

播放音乐实现原理:数据原来在内存中,然后DMA直接搬运到TXFIFO就行了。再经过移位寄存器SFTR,再串行输出由SD(两根线).。再到达DATAI,进入编解码芯片,再经过一些处理,再经过数模转换DAC,在输出去。

 

 

 

1.宏定义的时候0x2写成0x10那边错了,搞了很久,下不为例

2.DMA总共四个通道(这边是公用DMA)DMA2用于播放--I2SSDO(源:系统; 目:外围)DMA1---I2SSDI用于录音(源:外围,目:系统)----主要看在系统总线上还是外围总线。--注,不要播放和录音用同一个请求源。我们这边播放也可以用CH-ODMA0

附:每个通道有七个请求源,其中:I2SSDII2SSDO

3DMA,用于从内存搬运数据到IIS模块的buffer的往返,记住,内存地址可以增长,但是buffer是固定

FSM:有限状态机--DMA就是用这个来工作的。但是:内部还包含子状态机(sub-FSM),两者有分工:FSM负责整体控制(就是一次搬运多少等)sub-FSM负责搬运数据。

其主要分三种状态:

状态一:等待。DMA ACKINT REQ0,但是其是高电平,只是无效状态而已,注意。

状态二:DMA ACK变为1,此时搬运的次数会加载到counter里面。(即从DCON[9:0]--->CURR_TC).--有接收到请求:REQ变为低电平。延时两个周期,DMAACK有应答。再经过三个周期,就开始读写信号。

状态三:原子操作(这边称读写不能被打断),子状态机负责读写数据,即从源-->目。整服务:读写读写,直到counter0,再清掉ACK;单服务:当counter变为0,有个中断标志改变,ACK也会清掉(ack每次原子操作都会有一次有效无效)共同点:当counter变为0了,就会产生一个中断

查询模式:

DMA每搬运一次数据(每读写一次完),ACK变为高电平,然后马上查询REQ信号是高电平还是低电平,如果REQ是低电平,则继续下一次搬运操作,如果是高电平的话,进入等待。等待REQ进入低电平,才进入下一次操作。

握手模式:

REQ信号变为低电平,则延时两个时钟周期,然后ACK变为低电平,则进入读写,此时REQ的信号变为高电平。当一次读写操作完后,ACK变为高电平,然后马上告诉REQ信号说已经搬运完,并触发REQ为低电平。然后REQ在触发ACK信号。两者相互交互。直到counter0

传输速度:burst4(4个字节)和一个字节。要考虑内存(无所谓)或者是IISBUFFER(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.unitburst4;一个字节和四个 字节(连续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(14)*TC=(2*1*TC),若要重载的时候,即播完以后重复,要把 DMA2IIS_STOP关掉。

14.清中断rDMASKTRIG1 |= (0x1<<1);//START DMA1,open channel 1DMA开关】

remain_bytes = rDSTAT2;读取剩余几个字节

curr_addr = rDCSRC2;读取当前的地址;

同理录音;

二、IIS(音频)----音乐的播放和录音整个模块都是挂在外部总线上PCLK。。

Ud1341编解码芯片的时钟SYSCLICDCLK提供。两个buffer,发送和接收(IISFIFO),但是是同一个地址。录音的时候:源地址;播放:目的地址。

 

DMA传输的时候是有一个标准flag作标志的。

IIS的采样率一般是44.1KHZ音质会比较好。

编解码时钟 左右声道频率(44.1KHZ)*系统时钟(256或者384) -------32bit(z1616bit).

串行时钟:系统时钟/32(也有16)

 

 

1.通过I2SSDII2SSDO串行数据的输入输出,可以找到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总线接口的主时钟发生器,另一个用于外部 CODECUDA1341)的时钟发生器,两者一样。要相等。

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_playrIISCON= (0x1<<8) |(0x1<<5)|(0x0<<4) |(0x0<<3) |(0x1<<2) |(0x1<<1);bit0】为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=3rIISPSR |=(2<<5 )|2;N=2

10.Riisfcon=(0x1<<15) |(0x0<<14) |(0x1<<13) |(0x0<<12);同理录音

三、UDA1341固定地址0001 01--)后两位是接下来的数据类型。

1.后两位分别是:三种状态:00DATA001DATA110STATUS;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其中1110111为扩展地址,我们发送扩展地 址时(其实也是数据),先发送地址,11000 EA2,EA1EA0;之后发数据, 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,有扩展地址, 如果要录音,这个要配置

 

阅读(3155) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~