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终端实现多从机的传输,提高传输效率。
- AD2410的使用总结
- MiddleGen的使用总结
- DataReader的使用总结
- Powerdesigner的使用总结
- VC的使用总结
- CToolBar的使用总结
- #define的使用总结
- 反射的使用总结
- VC的使用总结
- lvm的使用总结
- JUnit的使用总结
- ComboBox的使用总结
- createTextRange()的使用总结
- CToolBar的使用总结
- vi 的使用总结
- 使用wxwidgets的总结
- XMLBEANS的使用总结
- locale的使用总结
- ACM训练表
- Java线程池使用说明
- 笔记001--Hashtable/HashMap与key/value为null的关系
- linux本地进程间socket通信是否经过网卡?
- 知道得越多编程越慢怎么办?
- AD2410的使用总结
- 用冒泡法和选择法对10个学生成绩进行排名
- TOJ 2988.PLMM
- HDOJ 2124 Repair the Wall(修城墙,贪心)
- zookeeper客户端四字符指令
- java中length,length(),size()区别 http://blog.csdn.net/sk880609/article/details/7524006
- CCNA系列十二之ACL
- NDK开发总结
- poj题目分类_很有层次感