192 lines
5.2 KiB
C
192 lines
5.2 KiB
C
#include "NUC100Series.h"
|
|
#include <gpio.h>
|
|
#include "uda1341.h"
|
|
|
|
uint32_t g_u32TxValue;
|
|
|
|
/*
|
|
* @brief This function provides the configured MFP registers
|
|
* @param None
|
|
* @return None
|
|
*/
|
|
void GPIO_INIT_I2S(void)
|
|
{
|
|
//SYS->ALT_MFP = 0x000003E0UL;
|
|
//SYS->ALT_MFP1 = 0x00000000UL;
|
|
//SYS->GPA_MFP = 0x00008000UL;
|
|
//SYS->GPB_MFP = 0x00000000UL;
|
|
//SYS->GPC_MFP = 0x0000000FUL;
|
|
//SYS->GPE_MFP = 0x00000000UL;
|
|
|
|
/* If the macros do not exist in your project, please refer to the corresponding header file in Header folder of the tool package */
|
|
SYS->ALT_MFP = SYS_ALT_MFP_PC3_I2S_DO | SYS_ALT_MFP_PC2_I2S_DI | SYS_ALT_MFP_PC1_I2S_BCLK | SYS_ALT_MFP_PC0_I2S_LRCLK | SYS_ALT_MFP_PA15_I2S_MCLK;
|
|
SYS->ALT_MFP1 = 0x00000000;
|
|
SYS->GPA_MFP = SYS_GPA_MFP_PA15_I2S_MCLK;
|
|
SYS->GPB_MFP = 0x00000000;
|
|
SYS->GPC_MFP = SYS_GPC_MFP_PC3_I2S_DO | SYS_GPC_MFP_PC2_I2S_DI | SYS_GPC_MFP_PC1_I2S_BCLK | SYS_GPC_MFP_PC0_I2S_LRCLK;
|
|
SYS->GPE_MFP = 0x00000000;
|
|
|
|
return;
|
|
}
|
|
|
|
void MyProject_init_ebi(void)
|
|
{
|
|
CLK_EnableModuleClock(EBI_MODULE);
|
|
|
|
return;
|
|
}
|
|
|
|
void MyProject_deinit_ebi(void)
|
|
{
|
|
CLK_DisableModuleClock(EBI_MODULE);
|
|
|
|
return;
|
|
}
|
|
|
|
void MyProject_init_i2s(void)
|
|
{
|
|
CLK_EnableModuleClock(I2S_MODULE);
|
|
CLK_SetModuleClock(I2S_MODULE, CLK_CLKSEL2_I2S_S_HCLK, MODULE_NoMsk);
|
|
|
|
return;
|
|
}
|
|
|
|
void MyProject_deinit_i2s(void)
|
|
{
|
|
CLK_DisableModuleClock(I2S_MODULE);
|
|
|
|
return;
|
|
}
|
|
|
|
void MyProject_init_isp(void)
|
|
{
|
|
CLK_EnableModuleClock(ISP_MODULE);
|
|
|
|
return;
|
|
}
|
|
|
|
void MyProject_deinit_isp(void)
|
|
{
|
|
CLK_DisableModuleClock(ISP_MODULE);
|
|
|
|
return;
|
|
}
|
|
|
|
void MyProject_init_systick(void)
|
|
{
|
|
CLK_EnableSysTick(CLK_CLKSEL0_STCLK_S_HIRC_DIV2, 0);
|
|
|
|
return;
|
|
}
|
|
|
|
void MyProject_deinit_systick(void)
|
|
{
|
|
CLK_DisableSysTick();
|
|
|
|
return;
|
|
}
|
|
|
|
void MyProject_init_base(void)
|
|
{
|
|
/* If the macros do not exist in your project, please refer to the related clk.h in Header folder of the tool package */
|
|
/* Enable clock source */
|
|
CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);
|
|
|
|
/* Waiting for clock source ready */
|
|
CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);
|
|
|
|
/* Set HCLK clock */
|
|
CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));
|
|
|
|
return;
|
|
}
|
|
|
|
void MyProject_init(void)
|
|
{
|
|
/*---------------------------------------------------------------------------------------------------------*/
|
|
/* Init System Clock */
|
|
/*---------------------------------------------------------------------------------------------------------*/
|
|
//CLK->PWRCON = (CLK->PWRCON & ~(0x0000000FUL)) | 0x00000014UL;
|
|
//CLK->PLLCON = (CLK->PLLCON & ~(0x000FFFFFUL)) | 0x0005C22EUL;
|
|
//CLK->CLKDIV = (CLK->CLKDIV & ~(0x00FF0FFFUL)) | 0x00000000UL;
|
|
//CLK->CLKDIV1 = (CLK->CLKDIV1 & ~(0x00FFFFFFUL)) | 0x00000000UL;
|
|
//CLK->CLKSEL0 = (CLK->CLKSEL0 & ~(0x0000003FUL)) | 0x0000003FUL;
|
|
//CLK->CLKSEL1 = (CLK->CLKSEL1 & ~(0xF37777FFUL)) | 0xFFFFFFFFUL;
|
|
//CLK->CLKSEL2 = (CLK->CLKSEL2 & ~(0x00030FFFUL)) | 0x000200FEUL;
|
|
//CLK->CLKSEL3 = (CLK->CLKSEL3 & ~(0x0000003FUL)) | 0x0000003FUL;
|
|
//CLK->AHBCLK = (CLK->AHBCLK & ~(0x0000000EUL)) | 0x0000000DUL;
|
|
//CLK->APBCLK = (CLK->APBCLK & ~(0xF8F7F37FUL)) | 0x20000000UL;
|
|
//CLK->APBCLK1 = (CLK->APBCLK1 & ~(0x00000007UL)) | 0x00000000UL;
|
|
//CLK->FRQDIV = (CLK->FRQDIV & ~(0x0000001FUL)) | 0x00000000UL;
|
|
//SysTick->CTRL = (SysTick->CTRL & ~(0x00000005UL)) | 0x00000001UL;
|
|
|
|
/* Unlock protected registers */
|
|
SYS_UnlockReg();
|
|
|
|
/* Enable base clock */
|
|
MyProject_init_base();
|
|
|
|
/* Enable module clock and set clock source */
|
|
MyProject_init_ebi();
|
|
MyProject_init_i2s();
|
|
MyProject_init_isp();
|
|
MyProject_init_systick();
|
|
|
|
/* Update System Core Clock */
|
|
/* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
|
|
SystemCoreClockUpdate();
|
|
|
|
/* Lock protected registers */
|
|
SYS_LockReg();
|
|
|
|
return;
|
|
}
|
|
|
|
void I2S_IRQHandler()
|
|
{
|
|
/* Write 4 Tx values to TX FIFO */
|
|
I2S_WRITE_TX_FIFO(I2S, g_u32TxValue);
|
|
I2S_WRITE_TX_FIFO(I2S, g_u32TxValue);
|
|
I2S_WRITE_TX_FIFO(I2S, g_u32TxValue);
|
|
I2S_WRITE_TX_FIFO(I2S, g_u32TxValue);
|
|
}
|
|
|
|
int main(){
|
|
uint32_t u32DataCount, u32RxValue1, u32RxValue2;
|
|
|
|
MyProject_init();
|
|
GPIO_INIT_I2S();
|
|
read_data(UDA1341_REG_DATA1);
|
|
set_data(UDA1341_REG_STATUS,STAT0_SC_256FS|STAT0_IF_I2S|STAT0_DC_FILTER);
|
|
set_data(UDA1341_REG_DATA0,DATA0_VOLUME(0) & DATA0_VOLUME_MASK);
|
|
|
|
I2S_Open(I2S,I2S_MODE_MASTER, 8000, I2S_DATABIT_16, I2S_STEREO, I2S_FORMAT_I2S);
|
|
I2S_EnableMCLK(I2S,256*8000);
|
|
|
|
NVIC_EnableIRQ(I2S_IRQn);
|
|
|
|
/* Initiate data counter */
|
|
u32DataCount = 0;
|
|
/* Initiate Tx value and Rx value */
|
|
g_u32TxValue = 0x0;
|
|
u32RxValue1 = 0;
|
|
u32RxValue2 = 0;
|
|
/* Enable Tx threshold level interrupt */
|
|
I2S_EnableInt(I2S, I2S_IE_TXTHIE_Msk);
|
|
|
|
while(1){
|
|
if((I2S->STATUS & I2S_STATUS_RXEMPTY_Msk) == 0)
|
|
{
|
|
u32DataCount++;
|
|
|
|
if(u32DataCount >= 1000)
|
|
{
|
|
g_u32TxValue = 0x0; /* g_u32TxValue: 0x55005501, 0x55025503, ..., 0x55FE55FF */
|
|
u32DataCount = 0;
|
|
}else{
|
|
g_u32TxValue += 0x11223344;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
} |