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);
}