Project

General

Profile

RE: Need Help for Audio MityDSP-L138F. DSP Platforms. No ... » MityDSP_DSD1791_Init.c

riyanto fisika, 08/30/2016 02:29 AM

 
// L138_aic3106_init.c
//

#include "L138_aic3106_init.h"
#include "evmomapl138_spi.h"
#include "evmomapl138.h"


//#define PINMUX_GP08_REG_0 (0)
//#define PINMUX_GP08_MASK_0 (0xF0000000)
//#define PINMUX_GP08_VAL_0 (0x80000000)
//#define PINMUX_GP514_REG_0 (11)
//#define PINMUX_GP514_MASK_0 (0x000000F0)
//#define PINMUX_GP514_VAL_0 (0x80000080)


int16_t *pingIN, *pingOUT, *pongIN, *pongOUT;

AIC31_data_type AIC31_data;

typedef struct BITVAL // used in function prbs()
{
unsigned int b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1;
unsigned int b7:1, b8:1, b9:1, b10:1, b11:1, b12:1,b13:1;
unsigned int dweebie:2; //Fills the 2 bit hole - bits 14-15
} bitval;

typedef union SHIFT_REG
{
unsigned int regval;
bitval bt;
} shift_reg;
int fb = 1; // feedback variable
shift_reg sreg = {0xFFFF}; // shift register

uint32_t prand_seed = 1; // used in function prand()

extern void vectors(void);

void output_sample(int32_t out_data)
{
AIC31_data.uint = out_data;
if (poll) while (!CHKBIT(MCASP->SRCTL15, XRDY));
MCASP->XBUF0 = AIC31_data.uint;
}
void output_left_sample(int16_t out_data)
{
AIC31_data.uint = 0;
AIC31_data.channel[LEFT]=out_data;
if (poll) while (!CHKBIT(MCASP->SRCTL15, XRDY));
MCASP->XBUF0 = AIC31_data.uint;
}


void L138_init_mcasp_poll()
{

// globally reset McASP0
MCASP->GBLCTL = 0;

// // configure McASP0 receive registers
MCASP->RMASK = 0xFFFFFFFF;
MCASP->RFMT = 0x000080F8;
MCASP->AFSRCTL = 0x00000000;
MCASP->ACLKRCTL = 0x00000000;
MCASP->AHCLKRCTL = 0x00000000;
MCASP->RTDM = 0x00000001; // TDM timeslot 0
MCASP->RINTCTL = 0x00000000;
MCASP->RCLKCHK = 0x00000000;

// configure McASP0 transmit registers
MCASP->XMASK = 0xFFFFFFFF;
// MCASP->XFMT = 0x000080F8;
MCASP->XFMT = 0x00018070;
// MCASP->AFSXCTL = 0x00000002;
MCASP->AFSXCTL = 0x00000112;
// MCASP->AFSXCTL = 0x00000000;
// MCASP->ACLKXCTL = 0x00000000;
MCASP->ACLKXCTL = 0x000000A3;
// MCASP->AHCLKXCTL = 0x00000000;
MCASP->AHCLKXCTL = 0x00008004;
MCASP->XTDM = 0x00000003; // TDM timeslot 0
MCASP->XINTCTL = 0x00000000; // interrupt on transmit
MCASP->XCLKCHK = 0x00000000;


// config pin function and direction.
MCASP->PFUNC = 0;
// MCASP->PDIR = 0x00020000;
MCASP->PDIR = 0X14008000;
// MCASP->PDIR = 0x00008000;


//
MCASP->XEVTCTL = 0x00000000;
MCASP->DITCTL = 0x00000000;
MCASP->DLBCTL = 0x00000000;
MCASP->AMUTE = 0x00000000;


// Transmitter
SETBIT(MCASP->XGBLCTL, XHCLKRST);
while (!CHKBIT(MCASP->XGBLCTL, XHCLKRST)) {}
SETBIT(MCASP->XGBLCTL, XCLKRST);
while (!CHKBIT(MCASP->XGBLCTL, XCLKRST)) {}
SETBIT(MCASP->XGBLCTL, XSRCLR); //TXSERCLRS
while (!CHKBIT(MCASP->XGBLCTL, XSRCLR)) {}
MCASP->XBUF0 = 0;

SETBIT(MCASP->XGBLCTL, XSMRST);
while (!CHKBIT(MCASP->XGBLCTL, XSMRST)) {}
SETBIT(MCASP->XGBLCTL, XFRST);
while (!CHKBIT(MCASP->XGBLCTL, XFRST)) {}
MCASP->XBUF0 = 0;

// configure serialisers (15 for xmit, 12 for rcv)
MCASP->SRCTL15 = 0x000D;
MCASP->SRCTL12 = 0x000E;

MCASP->XSTAT = 0xFFFFFFFF; // Clear all

while(!CHKBIT(MCASP->SRCTL15, XRDY)) {}
MCASP->XBUF0 = 0;


//Receiver
// SETBIT(MCASP->RGBLCTL, RHCLKRST);
// while (!CHKBIT(MCASP->RGBLCTL, RHCLKRST)) {}
// SETBIT(MCASP->RGBLCTL, RSRCLR);
// while (!CHKBIT(MCASP->RGBLCTL, RSRCLR)) {}
// SETBIT(MCASP->RGBLCTL, RSMRST);
// while (!CHKBIT(MCASP->RGBLCTL, RSMRST)) {}
// SETBIT(MCASP->RGBLCTL, RFRST);
// while (!CHKBIT(MCASP->RGBLCTL, RFRST)) {}
//
// MCASP->RSTAT = 0x0000FFFF; // Clear all
//
// // Write zero to serialiser buffers so that no underrun occurs after releasing the state machine
//
// MCASP->RBUF12 = 0;

// wait for transmit ready and send a dummy byte.
}



void L138_initialise_poll()
{
poll = 1; // used in input_sample() and output_sample() functions

// spi_config_t spi_config;


// bsl initialisation functions
// EVMOMAPL138_init();
// EVMOMAPL138_initRAM();
// USTIMER_init();

EVMOMAPL138_lpscTransition(PSC1, DOMAIN0, LPSC_MCASP0, PSC_ENABLE);
EVMOMAPL138_lpscTransition(PSC1, DOMAIN0, LPSC_GPIO, PSC_ENABLE);
EVMOMAPL138_pinmuxConfig(PINMUX_MCASP_REG_0, PINMUX_MCASP_MASK_0, PINMUX_MCASP_VAL_0);
EVMOMAPL138_pinmuxConfig(PINMUX_MCASP_REG_1, PINMUX_MCASP_MASK_1, PINMUX_MCASP_VAL_1);


CSR = 0x0000; // disable interrupts globally while initialising

L138_init_mcasp_poll();

ICR = 0xFFF0;
}

int prbs(void) //gen pseudo-random sequence {-1,1}
{
int prnseq;
if(sreg.bt.b0)
prnseq = -NOISELEVEL; //scaled negative noise level
else
prnseq = NOISELEVEL; //scaled positive noise level
fb =(sreg.bt.b0)^(sreg.bt.b1); //XOR bits 0,1
fb^=(sreg.bt.b11)^(sreg.bt.b13); //with bits 11,13 -> fb
sreg.regval<<=1;
sreg.bt.b0=fb; //close feedback path
return prnseq; //return noise sequence value
}



uint32_t rand31_next()
{
uint32_t hi, lo;

lo = 16807 * (prand_seed & 0xFFFF);
hi = 16807 * (prand_seed >> 16);

lo += (hi & 0x7FFF) << 16;
lo += hi >> 15;

if (lo > 0x7FFFFFFF) lo -= 0x7FFFFFFF;

return(prand_seed = (uint32_t)lo);
}

int16_t prand()
{
return ((int16_t)(rand31_next()>>18)-4096);
}
(1-1/2)