Slot 0:TAG
Bit 15 1表示该帧数据有效
Bit 14 1表示后面Slot 1中数据有效
Bit 13 1表示后面Slot 2中数据有效
Bit [12:3] 1表示后面Slot 3--12中数据有效
Bit 2 备用
Bit [1:0] Codec ID field
Slot 1:Command Address
bit 19 读或写标志,0--写标志,1--读标志
bit [18:12] 64个16位寄存器索引号
bit [11:0] 备用
Slot 2:Command Data
bit [19:4] 控制寄存器的写入数据(操作为读时,要用0填满)
bit [3:0] 备用(填0)
Slot 3:PCM放音左声道
高16位有效,未用到的低位填0
Slot 4:PCM放音右声道
高16位有效,未用到的低位填0
Slot 5:MODEM Line 1 DAC
高16位有效,未用到的低位填0
Slot 6:PCM放音中央通道
高16位有效,未用到的低位填0
Slot 7:PCM放音环绕左声道
高16位有效,未用到的低位填0
Slot 8:PCM放音环绕右声道
高16位有效,未用到的低位填0
Slot 9:PCM放音低音效果声道
高16位有效,未用到的低位填0
Slot 10:未用
PRD表一般都不止一个,它们在内存中依次放置,就是说,如果第1个PRD表放在0x1000这个内存地址上,则第2个PRD表应该放在0x1008这个位置,第3个PDR放在0x1010,......,以此类推,直到出现最后一个PRD表;最后一个PRD表的标志是EOT位置1或者JMP位置1,不能EOT和JMP同时置1,EOT(End of Transfer)置1表明这是最后一个PRD,这个PRD后停止数据传输;JMP(JUMP)置1表明跳跃到其他PRD,这是PRD的第1个DWORD不是指存放数据的内存地址,而是指JMP要跳跃到的下一个PRD表的内存地址,这种情况下表明Size的16个bit无效;有效地利用JMP位,可以方便地制造出循环播放的效果,我们可以在所有PRD的最后放置一个PRD,该PRD置JMP位,同时把跳跃地址指向第1个PRD,于是循环播放的效果就出来了。
EOP(End of Page)是在还有下一个PRD时使用,当该页数据传输完毕后,ACC遇到EOP位,就会产生一个中断,同时转到下一个PRD,如果在下一个EOP出现之前,中断没有处理完毕的话,将出现一个错误,通常情况下会利用这个中断来填写另一个PRD表,以此来完成较长音频的播放,否则遇到很长的音频文件,岂不是要耗尽内存;但我们在本例中为了突出重点,不准备播放很长的音频文件,同时,不采用中断方式。
如何和Codec进行通讯呢?这里还有两个ACC的寄存器必须要介绍,一个偏移量为08h的Codec状态寄存器(Codec Status Register)(ACC_CODEC_STATUS),另一个是偏移为0Ch的Codec控制寄存器(Codec Control Register)(ACC_CODEC_CNTL)。
Codec控制寄存器:主要用于向Codec发出控制命令
bit 31(RW_CMD):0--写Codec寄存器,1--读Codec寄存器
bit 30:24(CMD_ADD):读/写Codec寄存器的地址,前面说过Codec寄存器地址为7位
bit 23:22(COMM_SEL):与那个Codec进行通讯,00--Codec 1,01--Codec 2
bit 16(CMD_NEW):当填写完命令后,将此位置1,当命令发出后,硬件将此位置0
bit 15:0(CMD_DATA):只有写入命令时有效,欲写入Codec寄存器的数据。
Codec状态寄存器:
bit 31:24(STS_ADD):表明STS_DATA数据是哪个寄存器的
bit 23(PRM_RDY_STS):1--主Codec准备好,如果此位不为1,软件不能存取相应的Codec
bit 22(SEC_RDY_STS):1--第2个Codec准备好,如果此位不为1,软件不能存取相应的Codec
bit 17(STS_NEW):当收到一个合法的Codec状态数据后,硬件会将此位置1,
bit 15:0(STS_DATA):从Codec收到的Codec的状态数据