zhangbinmy 发表于 2017-2-11 11:10:39

S3C2440-IIS录音

  程序仍在调试中
  #include "2440addr.h"#include "music.h"#define L3MODE 1<<2   #define L3DATA 1<<3   #define L3CLOCK 1<<4#define U32 unsigned int#define U8 unsigned char int cmd,command, stop , temp;U8 iis_buffer;void __irq UART0_ISR(void){char ch;rSRCPND |= (0x1<<28);rINTPND |= (0x1<<28);rSUBSRCPND |= 0x1<<0;if(rUTRSTAT0 & 0x1){ch = rURXH0;while(!(rUTRSTAT0&0x4));rUTXH0 = ch;command = ch;switch(command){case 0xaa:cmd = 0x01;break;case 0xbb:stop = 1;break;case 0xcc:cmd = 0x02;break;}      }}void WriteL3(U8 data, U32 mode){   //mode = 0,地址模式;mode = 1,数据传输模式   int i, k;   if(mode == 0){   rGPBDAT = rGPBDAT & ~(L3MODE|L3DATA|L3CLOCK )|L3CLOCK;   }   else{   rGPBDAT = rGPBDAT & ~(L3MODE|L3DATA|L3CLOCK)|(L3CLOCK|L3MODE);      }   for(k = 0; k < 5; k++)   ;   for(i = 0; i < 8; i++){   if(data & 0x1){   rGPBDAT &= ~L3CLOCK;   rGPBDAT |= L3DATA;   for(k = 0; k < 5; k++)   ;      rGPBDAT |= L3CLOCK;   rGPBDAT |= L3DATA;   for(k = 0; k < 5; k++)   ;   }   else{   rGPBDAT &= ~L3CLOCK;   rGPBDAT &= ~L3DATA;   for(k = 0; k < 5; k++)   ;   rGPBDAT |= L3CLOCK;   rGPBDAT &= ~L3DATA;   for(k = 0; k < 5; k++)   ;   }   data >>= 1;   }   rGPBDAT = rGPBDAT & ~(L3MODE|L3DATA|L3CLOCK)|(L3CLOCK|L3MODE);   }void play(U8 buffer[], U32 length){   int i, fifo;   //UDA1341   //STATUS模式   rGPBDAT = rGPBDAT & ~(L3MODE|L3DATA|L3CLOCK)|(L3CLOCK|L3MODE);   WriteL3(0x14+2,0);   //复位   WriteL3(0x60,1);   WriteL3(0x14+2,0);   //00010000 系统时钟频率384fs   WriteL3(0x10,1);   WriteL3(0x14+2,0);   //11000001 输出增益,ADC关,DAC开   WriteL3(0xc1,1);      //IIS   //DMA禁止,在接受空闲状态,不产生IISLRCK信号,IIS预分频使能   rIISCON = (0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1);    //主设备时钟PCLK,主设备模式,发送模式,串行数据16位,主时钟是384fs,串行位时钟32fs   rIISMOD = (0<<9)|(0<<8)|(2<<6)|(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<0);   //预分频都是N=3   rIISPSR = (3<<5)|3;   //发送FIFO正常,发送FIFO使能   rIISFCON = (0<<15)|(1<<13);   //IIS start   rIISCON |= 0x1;       for(fifo = 0; fifo <= length; fifo += 64){   while(rIISCON &(1<<7));   for(i = 0; i < 32; i++)   rIISFIFO = (iis_buffer) + (iis_buffer<<8);      }   //IIS close   rIISCON = 0x0;      }void record(){int i, fifo;   rGPBDAT = rGPBDAT & ~(L3MODE|L3DATA|L3CLOCK)|(L3CLOCK|L3MODE);   WriteL3(0x14+2,0);   //复位   WriteL3(0x60,1);WriteL3(0x14+2,0);   //00010000 系统时钟频率384fs   WriteL3(0x10,1); WriteL3(0x14+2,0);   //10100010 输入增益,ADC开,DAC关   WriteL3(0xa2,1);WriteL3(0x14+0,0); WriteL3(0x7b,1);         //01,1110,11 BB 18dB~24dB Treble 6dBWriteL3(0xc0,1);WriteL3(0xe0,1);         //000,00000 MA 0dBWriteL3(0xc1,1);WriteL3(0xe0,1);         //001,00000 MB 0dBWriteL3(0xc4,1);WriteL3(0xf0,1);         //100,1,00,00 AGC使能      WriteL3(0xc2,1);WriteL3(0xf9,1);         //010,110,11 MIC 26dB input 1 * MA + input 2 * MB //IIS   //DMA禁止,在接受空闲状态,不产生IISLRCK信号,IIS预分频使能   rIISCON = (0<<5)|(0<<4)|(1<<3)|(0<<2)|(1<<1);    //主设备时钟PCLK,主设备模式,接收模式,串行数据16位,主时钟是384fs,串行位时钟32fs   rIISMOD = (0<<9)|(0<<8)|(1<<6)|(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<0);   //预分频都是N=3   rIISPSR = (3<<5)|3;   //发送FIFO正常,发送FIFO使能   rIISFCON = (0<<14)|(1<<12);   //IIS start   rIISCON |= 0x1;       for(fifo = 0; stop == 0; fifo += 64){   while(!(rIISCON &(1<<6)));   for(i = 0; i < 32; i++){temp = rIISFIFO;iis_buffer = temp & 0xff;iis_buffer = temp & 0xff00;}      }   //IIS close   rIISCON = 0x0;   }int Main(){cmd = 0; stop = 0;rULCON0 = 0x3;rUCON0 = (1<<11)|(1<<2)|(1<<0);rUBRDIV0 = 36;   rSRCPND = 0x1<<28;rINTPND = 0x1<<28;rSUBSRCPND = 0x1<<0;rINTMSK &= ~(0x1<<28);rINTSUBMSK &= ~(0x1<<0);pISR_UART0 = (U32)UART0_ISR;rGPBUP= rGPBUP& ~(0x7<<2) | (0x7<<2);   //The pull up function is disabled GPB 1 1100      rGPBCON = rGPBCON & ~(0x3f<<4) | (0x15<<4); //GPB=Output(L3CLOCK):Output(L3DATA):Output(L3MODE)   rGPBDAT = 0x1ec;   rGPEUP= rGPEUP& ~(0x1f) | 0x1f;    //The pull up function is disabled GPE 1 1111   rGPECON = rGPECON & ~(0x3ff) | 0x2aa;   //GPE=I2SSDO:I2SSDI:CDCLK:I2SSCLK:I2SLRCK   rMPLLCON = (150<<12)|(5<<4)|(0<<0);   while(1){while(!cmd);switch(cmd){case 0x01:record();break;case 0x02:   play(iis_buffer,sizeof(iis_buffer));break;}cmd = 0;stop = 0;}return 0;}
页: [1]
查看完整版本: S3C2440-IIS录音