AD2410的使用总结

来源:互联网 发布:网络的利与弊征文1000 编辑:程序博客网 时间:2024/06/04 18:20

AD2410开发说明

AD2410的A2B总线

A2B总线具有提供同步时钟,传输数据,总线供电等功能。外设为A2B总线的MASTER提供BCLK,SYNC时钟信号,MASTER通过总线为SLAVE提供时钟信号。A2B总线的一个超级帧的头部为同步控制帧,包含了I2C的下行数据和CRC校验码。中间有一个同步响应帧,包含I2C的上行数据,CRC校验码和IRQ数据。一个超级帧的时间长度为一个SYNC周期。SLAVE序号越大,该节点上传的数据越靠前,下行数据越靠后。

MASTER唤醒

当MSTR引脚为高电平且VIN电压大于3.7V时,MASTER已经POWER UP,在等待SYNC信号的到来。在外部供给SYNC信号时,MASTER将时钟信号在PLL中倍频锁存,这个过程最多需要25ms。这之后,MSATER已经可以通过I2C总线进行编程配置了。MASTER的I2C设备地址为:

                                                                      I2C地址位图

当把ADR2和ADR1都拉低时,外围器件访问MASTER的地址就为0x68,时序为典型的I2C总线时序,需要注意的是,MASTER设备在I2C总线上总是作为SLAVE存在。

在MASTER进入等待编程状态后,会产生IRQ信号,使得IRQ引脚由低变高。

/*等待AD2410启动*/

         while(gpio_read(PING_CFG,PING2)==0 );      //等待IRQ信号

         tmp= I2C0SlaveRegRead(1,AD2410_I2C_ADDR,0x16);             //读中断状态寄存器

         if(tmp& 0x80) //判断中断类型是否为MASTER产生

                  {

                          tmp= I2C0SlaveRegRead(1,AD2410_I2C_ADDR,0x17); //获取中断号

                          if(tmp!= 0xff)

                                   return0;

                  }

到这里,MASTER已经唤醒并且可编程。

SLAVE唤醒

在唤醒MASTER之后,在唤醒SLAVE之前需要给SLAVE供电,也就是幻想供电。需要先设置主机响应周期,然后置位newstrict = 1,之后使能MASTER的幻想电源。这里需要注意的是:如果幻想电源在本节点禁用了,不管是MASTER还是SLAVE,该节点之后的所有节点都将处于掉电状态。

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x0f,AD2410_MASTER_RESCYCLE);         //设置主机响应周期数

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x12,0x01);         //设置newstrict=1

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x09,0x01);         //幻想电源使能

在SLAVE上电之后,需要将MASTER的INTMSK2寄存器从屏蔽发现SLAVE中断状态转换到其他状态,然后设置SLAVE的响应周期,之后等待发现SLAVE的IRQ信号在MASTER产生。

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x1d,0x01);   //INTMSK2

count = 0;

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x13,slave_rescycle[count]);         //slave0的响应周期

while(gpio_read(PING_CFG,PING2) ==0 );      //等待IRQ信号

tmp =I2C0SlaveRegRead(1,AD2410_I2C_ADDR,0x16);

if(tmp & 0x80) //判断中断类型

         {

                  tmp= I2C0SlaveRegRead(1,AD2410_I2C_ADDR,0x17); //tmp = 0x18表示找到slave

         }

ret =I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x09,0x21);         //mode= 2 ,幻想电源使能

MASTER和SLAVE的响应周期计算:

                                             响应周期与TDM模式和通道大小的关系表

下面举个例子:

一个A2B系统上有5个节点,8个上行SLOT,6个下行SLOT。那么他的MASTER得响应周期为:

MSTR_RESPCYCS> TRUNC ((6*25 + 64 +3)/4) + 1 + 4*(4-1)

MSTR_RESPCYCS> 67

MSTR_RESPCYCS< 248 - TRUNC ((8*25 + 64 +3)/4)

MSTR_RESPCYCSMSTR_RESPCYCS< 182

SLAVE的响应周期为:

SLV_RESPCYCS[n]= MSTR_RESPCYCS - (4 × n),n表示SLAVE的序号。

SLAVE初始化

先通过I2C总线在MASTER上设置要通信的SLAVE序号

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x01,count);         //选择slave count = 0;

然后通过I2C访问MASTER来使用A2B来访问SALVE,这里I2C的地址为0x69

I2C0SlaveRegWrite(1,AD2410_SLAVEI2C_ADDR,0x0a,bcdnslots[count]);         //BCDNSLOTS = 0

然后设置SALVE节点的本地下行SLOTS和剩余下行SLOTS

I2C0SlaveRegWrite(1,AD2410_SLAVEI2C_ADDR,0x0b,ldnslots[count]);//本地node下行slots

I2C0SlaveRegWrite(1,AD2410_SLAVEI2C_ADDR,0x0d,dnslots[count]);//本节点后剩余下行slots

之后设置SLAVE节点的本地上行SLOTS和之前上行SLOTS

I2C0SlaveRegWrite(1,AD2410_SLAVEI2C_ADDR,0x0c,lupslots[count]);//本地node上行slots

I2C0SlaveRegWrite(1,AD2410_SLAVEI2C_ADDR,0x0e,upslots[count]);//本节点之前上行slots

设置SLAVE节点的外围器件的I2C地址,默认为0x50,外围器件主要是来自动初始化SLAVE。

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x00,0x50);         //设置外围器件的I2C地址

在这之后,进行SLAVE节点的I2S格式设置,测试中是使用PDM格式的mic进行测试的。

I2C0SlaveRegWrite(1,AD2410_SLAVEI2C_ADDR,0x41,0x71);         //I2S配置为上升沿为帧的开始,EARLY=1,16bit,TDM4

I2C0SlaveRegWrite(1,AD2410_SLAVEI2C_ADDR,0x43,0x00);         //reduce = 0,I2SRATE = 1xSFF

I2C0SlaveRegWrite(1,AD2410_SLAVEI2C_ADDR,0x46,0x00);         //0个移位

I2C0SlaveRegWrite(1,AD2410_SLAVEI2C_ADDR,0x42,0x09);         //I2SCFG,I2S,数据不交叉,RX0EN不使能,TX0EN使能,RX1EN,TX1EN不使能

I2C0SlaveRegWrite(1,AD2410_SLAVEI2C_ADDR,0x44,0x00);         //TX移位0个TDM时隙

I2C0SlaveRegWrite(1,AD2410_SLAVEI2C_ADDR,0x45,0x00);         //RX移位0个TDM时隙

I2C0SlaveRegWrite(1,AD2410_SLAVEI2C_ADDR,0x47,0x01);         //禁用PDM1,使能PDM0

如果需要对SLAVE外围器件做初始化,也可以通过A2B总线来进行访问。

在之前的基础上,先将MASTER的0x01地址的寄存器上的PERI置1,NODE选择相应的SLAVE序号,然后通过I2C访问A2B的形式来访问SLAVE的外围器件。如果没有,可以忽略这步。

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x01,count|(1<<5));         // PERI置1

I2C0SlaveRegWrite(1,AD2410_SLAVEI2C_ADDR,reg_addr,data);//访问外围器件相应的地址

 

MASTER初始化

在完成所有的SLAVE初始化后,进行MASTER的初始化工作。先设置MASTER的上行和SLAVE下行SLOTS。

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x0d,AD2410_DNSLOTS);         //master的下行DNSLOTS

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x0e,AD2410_UPSLOTS);         //slave的上行总UPSLOTS

这之后进行MASTER的I2S数据流格式设置

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x41,0x52);         //I2S配置为上升沿为帧的开始,EARLY=1,16bit,TDM8

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x44,0x00);         //TX移位0个TDM时隙

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x45,0x00);         //RX移位0个TDM时隙

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x42,0x09);         //I2SCFG,I2S,数据不交叉,RX0EN,TX0EN使能,RX1EN,TX1EN不使能

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x10,0x22);         //UP和DN都是16bit

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x11,0x03);         //使能UP和DN

I2C0SlaveRegWrite(1,AD2410_I2C_ADDR,0x12,0x01);         //设置newstrict=1

A2B音频数据传输解析

下面已两个SLAVE和一个MASTER为例。

在他们都初始化后进行正常工作后,A2B中的音频数据顺序为

                                                             A2B数据流图

在PDM格式中,单声道数据会占据64bit空间,以16bit为例的话就是4个SLOT,这样的话,两个SLAVE都用PDM的话就是8个SLOT,为方便起见,将下行数据也设置为8个SLOT,当然,下行SLOTS可以设置为实际需要的数量。在A2B数据流中,前4个SLOT为SLAVE1的数据,后4个SLOT为SLAVE0的数据。在SLAVE1的数据中,DN0为实际可用的16bit音频数据流,而其他3个SLOT都为0。

A2B数据传输延迟

                                                                               A2B传输延时图

在上图中,MASTER的数据到达SLAVE需要经过这样的过程:MASTER->A2B总线->SLAVE,也就是说从MASTER到最近的SLAVE0也需要两个SYNC的周期,SLAVE序号增加1,所需时间也会增加一个SYNC周期。

TDM传输

在MASTER与DSP数据交互时,接口采用I2S/TDM,也就是说将I2S数据以TDM的形式进行传输。以8个上行和下行SLOT为例。DSP需要给MASTER提供的时钟分别为:SYNC = 48k,BCLK=16bit*8*48k=6.144M。在TDM数据流中,数据也是以一个SLOT为单位进行传输。在一个SYNC时钟周期内将8个SLOT数据传输完毕。I2S格式中,接收数据为BCLK的上升沿,发送数据为BCLK的下降沿,数据在同步信号到来后的一个BCLK后开始传输。MASTER和DSP需要设置成相同的形式。TDM的同步信号需要设置成一样的模式。比如在DSP中设置成脉冲模式,在MASTER中也要设置成相同的脉冲模式。而在SLAVE端则不受限制。

 

系统初始化流程图

左右声道数据分开

如上图所示,INTERLEAVED时,左右声道是左声道为TX0,右声道为TX1。在NON-INTERLEVED时,是TX0和TX1都是左右声道交叉传输。这一特性可以在使用32bit的TDM2的PDM麦克风时,在只使用一个MIC时,节约一个slot,在DSP终端实现多从机的传输,提高传输效率。

0 0