Contoh loopback dari dan ke WAU serta pembentukan sinyal sinusoida
#include "NUC100Series.h" #include "gpio.h" #include "portinit.h" //lcd #include "lcd.h" #include "wau8822n.h" # define PLLCON_SETTING CLK_PLLCON_50MHz_HIRC # define PLL_CLOCK 50000000 # define HCLK_DIV 1 #define MUTE_OFF(x) PE->DOUT &= ~(1 << 14) #define MUTE_ON(x) PE->DOUT |= (1 << 14) //#define POOLING #define LOOPBACK 1 #define MONOTOSTEREO 1 #define GAIN 1//50 #define SIN_SAMPLES 32 int32_t i32SinIdx = 0; int16_t i16Sin[SIN_SAMPLES] = { 0,3203,6284,9124,11612,13655,15172,16106,16423,16107,15172,13655, 11613,9124,6284,3204,1,-3205,-6284,-9124,-11613,-13654,-15173,-16107, -16422,-16106,-15172,-13655,-11613,-9123,-6285,-3203 }; uint32_t g_u32TxValue; uint32_t connect=TRUE; void displayLCD(){ //PC15=0; print_Line(0, " Teknik Elektro "); printS(2*8+4,1*16,"Universitas"); //printS(x, y, char) printS(2*8,2*16,"Muhammadiyah"); printS(3*8,3*16, "Purwokert0"); connect=FALSE; } uint32_t spectrum[128]; volatile uint8_t ii=0; extern void wau(void){ uint8_t i; for(i=0;i<128;i++){ spectrum[i]=0; } SYS_UnlockReg(); // Unlock protected registers CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk | CLK_PWRCON_OSC10K_EN_Msk ); // Enable HXT external 12MHz cyrstal CLK_SetCoreClock(50000000); // Set HCLK frequency 50MHz SYS_LockReg(); // Lock protected registers Port_Init(SPI3PORT); init_LCD(); clear_LCD(); //I2C - I2S WAU8822 codec WAU8822_Config(); GPIO_SetMode(PE, BIT14, GPIO_PMD_OUTPUT); PE14=0; //PHone OUT Enable (NUC-LB-140) #ifdef POOLING //uint32_t u32Tmp; //open I2S function //st.u32SampleRate = 16000; //st.u8WordWidth = I2S_DATABIT_16; //st.u8AudioFormat = I2S_STEREO; //st.u8DataFormat = I2S_FORMAT_I2S; //st.u8Mode = I2S_MODE_SLAVE; //st.u8TxFIFOThreshold = I2S_FIFO_TX_LEVEL_WORD_0; //st.u8RxFIFOThreshold = I2S_FIFO_RX_LEVEL_WORD_8;//SMP_ONE I2S_Open(I2S,I2S_MODE_MASTER,32000,I2S_DATABIT_16,I2S_STEREO,I2S_FORMAT_I2S); // Set MCLK and enable MCLK I2S_EnableMCLK(I2S,6000000); while(1) { if((I2S->STATUS & I2S_STATUS_TXFULL_Msk) == 0) { u32Tmp = i16Sini[i32SinIdxi]; u32Tmp &= 0xFFFFUL; //u32Tmp |= u32Tmp << 16; //duplicate it to stereo to Tx FIFO I2S->TXFIFO = u32Tmp; i32SinIdxi++; if(i32SinIdxi >= SIN_SAMPLESi) i32SinIdxi = 0; } } #else //interrupt I2S_Open(I2S,I2S_MODE_SLAVE,32000,I2S_DATABIT_16,I2S_STEREO,I2S_FORMAT_I2S); I2S_EnableMCLK(I2S,12000000); I2S_EnableInt(I2S,I2S_IE_RXTHIE_Msk ); NVIC_EnableIRQ(I2S_IRQn); GPIO_SetMode(PC,BIT12,GPIO_PMD_OPEN_DRAIN);PA12=1; GPIO_SetMode(PC,BIT14,GPIO_PMD_OPEN_DRAIN); if(PE15==1) displayLCD(); while(1) { CLK_SysTickDelay(1000000); if(PE15==0) { if(connect==FALSE) { clear_LCD(); print_Line(0, "Line-In Sound OK"); } PC12 ^= 1; //in LIN connected connect=TRUE; }else{ if(connect){displayLCD();} } } #endif } void I2S_IRQHandler(void) { uint32_t u32Tmp=0; //unit32_t s = /* Fill sin samples to I2S until Tx FIFO full */ while((I2S->STATUS & I2S_STATUS_TXFULL_Msk) == 0) { #if LOOPBACK // Just loop Rx FIFO to Tx FIFO u32Tmp = I2S->RXFIFO; I2S->TXFIFO = (u32Tmp*GAIN); #elif MONOTOSTEREO // Mono data in Rx FIFO and duplicate it to stereo to Tx FIFO u32Tmp = I2S->RXFIFO*GAIN & 0xFFFF0000UL; u32Tmp |= u32Tmp >> 16; I2S->TXFIFO = u32Tmp; #else // Output Sin Wave u32Tmp = i16Sin[i32SinIdx]; u32Tmp &= 0xFFFFUL; u32Tmp |= u32Tmp << 16; I2S->TXFIFO = u32Tmp; i32SinIdx++; if(i32SinIdx >= SIN_SAMPLES) i32SinIdx = 0; #endif } ii = u32Tmp; PC->DOUT ^= (1 << 14); }