1.IIS:Inter-IC Sound,是由飞利浦公司开发,该接口支持IIS总线数据格式和MSB-justified数据格式,该接口对FIFO的数据访问采用了DMA模式取代了中断,并且可以在同一时间接收和发送数据
2.IIS:有四根数据线,IISDO,IISDI,IISSCLK,IISLRCK;注意IIS只负责音频信号的传输,如果需要实现录音的话,还需要其他的处理芯片。
IISDO,IISDI用于数据的输入和输出;
IISSCLK:为串行时钟 其频率= 声道数×采用频率×采用位数,假如采用双声道(左右声道),每次采用16位,采样频率40kHz,则IISSCLK =2×16×40 ;
IISLRCK:用于指示左声道或右声道,比如高电平表示正在传输的是左声道数据,实际上IISLRCK频率就等于采用频率;
另外如果是采用了录音芯片的话,比如本例中的UDA1341的话还需要CDCLK为该芯片提供系统同步时钟(编解码时钟)主要用于音频A/D,D/A采用时钟。一般为256fs、384fs或512fs
3.PCLK经过两个预分频器处理后分别得到IISSCLK、IISLRCK和CDCLK(预分频器A得到IISSCLK、IISLRCK,预分频器B得到CDCLK)。如下图:
A和B的分频值是相等的,CDCLK=PCLK/(N+1); 比如:采样fs=44.1kHZ ,CDCLK=384fs,PCLK =50KHZ,从而可以得到N的值
3.UDA134还需要L3(line 3 三根线)总线的支持,由于2440中没有这个总线,我们可以使用IO的方式进行模拟,L3总线包括:L3DATA,L3MODE,L3CLOCK,意思都可以顾名思义了,就不多解释。具体的都可以参考UDA134的数据手册。
UDA134有两种传输模式,地址模式和数据模式,地址模式当然就是地址数据,但是只有高6位表示地址,低2位表示的是传输的模式,是状态模式、数据0模式还是数据1模式,其中状态模式主要用于配置UDA1341的各类初始状态,数据模式主要用于改善音频输入、输出的效果。
L3 MODE为低时是地址模式,L3 MODE为高时是数据传输模式地址模式是用于选择设备和定义目标寄存器,在这种模式下,8位数据的含义是:高6位是设备地址(UDA1341的地址为000101),低两位是后面数据模式下寄存器的类型(00:DATA0,01:DATA1,10:STATUS)。只要没有再改变地址模式下的数据,则数据模式下的数据始终是传输到上一个地址模式所定义的寄存器内。
在传输数据模式下,STATUS是用于设置复位,系统时钟频率、数据输入模式、DC滤波等内容。DATA0分为直接寻址模式和扩展寻址模式,直接寻址模式是直接进行模式的控制,包括音量、静音等等,而扩展寻址模式是在直接寻址模式下先设置3位扩展地址,再在直接寻址模式下设置5位扩展数据。在DATA1下,可以读取到被检测峰值
4.部分代码:
- #define L3C (1<<4) //gpb4:L3CLOCK
- #define L3D (1<<3) //gpb3:L3DATA
- #define L3M (1<<2) //gpb2:L3MODE
- //通过io口模拟L3总线写数据
- //mode:1为地址模式,0为数据模式
- //关于地址模式和数据模式以及传输时序注意参考数据手册
- static void wrtieL3(U8 data, U8 mode)
- {
- int i;
- if(mode == 1)
- {
- rGPBDAT = rGPBDAT&(~(L3D | L3M |L3C)) |L3C; //地址模式,根据手册L3M为LOW,L3C为high
- } else {
- rGPBDAT = rGPBDAT & (~(L3D |L3M |L3C)) |(L3M|L3C); //数据模式 L3M为高
- }
- Delay(1);
- //传输数据
- for(i = 0; i<8; i++)
- {
- rGPBDAT &=~L3C;
- Delay(1);
- rGPBDAT |=L3D;
- data>>1;
- }
- rGPBDAT = rGPBDAT & ~(L3D | L3M | L3C) | (L3C | L3M); //L3M=H,L3C=H
- }
- //播放音乐,music为存放的数组,length 为音乐的长度
- void play_music(char *music,int length)
- {
- rGPBDAT = rGPBDAT & (~(L3M |L3C |L3D)) |(L3M|L3C); //将L3CLOCK和L3MODE置高,准备开始传输
- 根据UDA1341TS数据手册14页中的操作顺序,首先在地址模式下,
- //选择操作地址000101xx +10(STATUS)=0X16
- wrtieL3(0x16,1) ;
- wrtieL3(0x60,0); // 0,1 ,10,000,0 复位
- wrtieL3(0x16,1) ;
- WriteL3(0x10,0); //0,0,01, 000,0 : 状态0, 384fs,IIS,no DC-filtering
- wrtieL3(0x16,1) ;
- WriteL3(0xc1,0); //1,0,0,0, 0,0,01:状态1,
- //Gain of DAC 6 dB,Gain of ADC 0dB,ADC non-inverting,
- //DAC non-inverting,Single speed playback,ADC-Off DAC-On
- //配置s3c2440的IIS寄存器
- //预分频器为3,所以CDCLK=PCLK/(3+1)=16.928kHz
- rIISPSR = 3<<5|3;
- //无效DMA,输入空闲,预分频器有效
- rIISCON = (0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1);
- //PCLK为时钟源,输出模式,IIS模式,每个声道16位,CODECLK=384fs,SCLK=32fs
- rIISMOD = (0<<9)|(0<<8)|(2<<6)|(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<0);
- rIISFCON = (0<<15)|(1<<13); //输出FIFO正常模式,输出FIFO使能
- flag=1;
- count=0;
- //开启IIS
- rIISCON |= 0x1;
- while(flag)
- {
- if((rIISCON & (1<<7))==0) //检查输出FIFO是否为空
- {
- //FIFO中的数据为16位,深度为32
- //当输出FIFO为空时,一次性向FIFO写入32个16位数据
- for(i=0;i<32;i++)
- {
- rIISFIFO=(buffer[2*i+count])+(buffer[2*i+1+count]<<8);
- }
- count+=64;
- if(count>length)
- flag=0; //音频数据传输完,则退出
- }
- }
- rIISCON = 0x0; //关闭IIS
- }
- // init the conrresponding pins
- void IIS_test()
- {
- //fs=44.1kHZ,CODECLK =384fs=16.9344MHZ
- //配置L3接口总线,GPB2:L3MODE, GPB3:L3DATA, GPB4:L3CLOCK
- rGPBCON = rGPBCON & ((0<<4) | (0<<6) |(0<<8));
- rGPBCON = rGPBCON |((1<<4) |(1<<6) |(1<<8));
- rGPBUP = 0x7ff;
- rGPBDAT = 0x1e4;
- rGPEUP |=0x1f; //disable pull up
- rGPECON = rGPECON & ~(0x3ff) | 0x2aa;
- play_music();
- }