| 1 | // L138_aic3106_init.c
 | 
  
    | 2 | //
 | 
  
    | 3 | 
 | 
  
    | 4 | #include "L138_aic3106_init.h"
 | 
  
    | 5 | #include "evmomapl138_spi.h"
 | 
  
    | 6 | #include "evmomapl138.h"
 | 
  
    | 7 | 
 | 
  
    | 8 | 
 | 
  
    | 9 | //#define PINMUX_GP08_REG_0          (0)
 | 
  
    | 10 | //#define PINMUX_GP08_MASK_0         (0xF0000000)
 | 
  
    | 11 | //#define PINMUX_GP08_VAL_0          (0x80000000)
 | 
  
    | 12 | //#define PINMUX_GP514_REG_0         (11)
 | 
  
    | 13 | //#define PINMUX_GP514_MASK_0        (0x000000F0)
 | 
  
    | 14 | //#define PINMUX_GP514_VAL_0         (0x80000080)
 | 
  
    | 15 | 
 | 
  
    | 16 | 
 | 
  
    | 17 | int16_t *pingIN, *pingOUT, *pongIN, *pongOUT;
 | 
  
    | 18 | 
 | 
  
    | 19 | AIC31_data_type AIC31_data;
 | 
  
    | 20 | 
 | 
  
    | 21 | typedef struct BITVAL    // used in function prbs()
 | 
  
    | 22 | {
 | 
  
    | 23 |  unsigned int b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1;
 | 
  
    | 24 |  unsigned int b7:1, b8:1, b9:1, b10:1, b11:1, b12:1,b13:1;
 | 
  
    | 25 |  unsigned int dweebie:2; //Fills the 2 bit hole - bits 14-15
 | 
  
    | 26 | } bitval;
 | 
  
    | 27 | 
 | 
  
    | 28 | typedef union SHIFT_REG
 | 
  
    | 29 | {
 | 
  
    | 30 |  unsigned int regval;
 | 
  
    | 31 |  bitval bt;
 | 
  
    | 32 | } shift_reg;
 | 
  
    | 33 | int fb = 1;                        // feedback variable
 | 
  
    | 34 | shift_reg sreg = {0xFFFF};         // shift register
 | 
  
    | 35 | 
 | 
  
    | 36 | uint32_t prand_seed = 1;       // used in function prand()
 | 
  
    | 37 | 
 | 
  
    | 38 | extern void vectors(void);
 | 
  
    | 39 | 
 | 
  
    | 40 | void output_sample(int32_t out_data)
 | 
  
    | 41 | {
 | 
  
    | 42 |   AIC31_data.uint = out_data;
 | 
  
    | 43 |   if (poll) while (!CHKBIT(MCASP->SRCTL15, XRDY));
 | 
  
    | 44 |   MCASP->XBUF0 = AIC31_data.uint;
 | 
  
    | 45 | }
 | 
  
    | 46 |    
 | 
  
    | 47 | void output_left_sample(int16_t out_data)
 | 
  
    | 48 | {
 | 
  
    | 49 |   AIC31_data.uint = 0;
 | 
  
    | 50 |   AIC31_data.channel[LEFT]=out_data;
 | 
  
    | 51 |   if (poll) while (!CHKBIT(MCASP->SRCTL15, XRDY));
 | 
  
    | 52 |   MCASP->XBUF0 = AIC31_data.uint;
 | 
  
    | 53 | }
 | 
  
    | 54 | 
 | 
  
    | 55 | 
 | 
  
    | 56 | void L138_init_mcasp_poll()
 | 
  
    | 57 | {
 | 
  
    | 58 | 
 | 
  
    | 59 | 	// globally reset McASP0
 | 
  
    | 60 | 		MCASP->GBLCTL  = 0;
 | 
  
    | 61 | 
 | 
  
    | 62 | //		   // configure McASP0 receive registers
 | 
  
    | 63 | 		MCASP->RMASK      = 0xFFFFFFFF;
 | 
  
    | 64 | 		MCASP->RFMT       = 0x000080F8;
 | 
  
    | 65 | 		MCASP->AFSRCTL    = 0x00000000;
 | 
  
    | 66 | 		MCASP->ACLKRCTL   = 0x00000000;
 | 
  
    | 67 | 		MCASP->AHCLKRCTL  = 0x00000000;
 | 
  
    | 68 | 		MCASP->RTDM       = 0x00000001; // TDM timeslot 0
 | 
  
    | 69 | 		MCASP->RINTCTL    = 0x00000000;
 | 
  
    | 70 | 		MCASP->RCLKCHK    = 0x00000000;
 | 
  
    | 71 | 
 | 
  
    | 72 | 		   // configure McASP0 transmit registers
 | 
  
    | 73 | 	    MCASP->XMASK      = 0xFFFFFFFF;
 | 
  
    | 74 | //		MCASP->XFMT       = 0x000080F8;
 | 
  
    | 75 | 		MCASP->XFMT       = 0x00018070;
 | 
  
    | 76 | //		MCASP->AFSXCTL    = 0x00000002;
 | 
  
    | 77 | 		MCASP->AFSXCTL    = 0x00000112;
 | 
  
    | 78 | 	//	MCASP->AFSXCTL    = 0x00000000;
 | 
  
    | 79 | //		MCASP->ACLKXCTL   = 0x00000000;
 | 
  
    | 80 | 		MCASP->ACLKXCTL   = 0x000000A3;
 | 
  
    | 81 | //		MCASP->AHCLKXCTL  = 0x00000000;
 | 
  
    | 82 | 		MCASP->AHCLKXCTL  = 0x00008004;
 | 
  
    | 83 | 		MCASP->XTDM       = 0x00000003; // TDM timeslot 0
 | 
  
    | 84 | 		MCASP->XINTCTL    = 0x00000000; // interrupt on transmit
 | 
  
    | 85 | 		MCASP->XCLKCHK    = 0x00000000;
 | 
  
    | 86 | 
 | 
  
    | 87 | 
 | 
  
    | 88 | 		   // config pin function and direction.
 | 
  
    | 89 | 		MCASP->PFUNC      = 0;
 | 
  
    | 90 | 	//	MCASP->PDIR       = 0x00020000;
 | 
  
    | 91 | 		MCASP->PDIR       = 0X14008000;
 | 
  
    | 92 | //		MCASP->PDIR       = 0x00008000;
 | 
  
    | 93 | 
 | 
  
    | 94 | 
 | 
  
    | 95 | 		   //
 | 
  
    | 96 | 		MCASP->XEVTCTL    = 0x00000000;
 | 
  
    | 97 | 		MCASP->DITCTL     = 0x00000000;
 | 
  
    | 98 | 		MCASP->DLBCTL     = 0x00000000;
 | 
  
    | 99 | 		MCASP->AMUTE      = 0x00000000;
 | 
  
    | 100 | 
 | 
  
    | 101 | 
 | 
  
    | 102 | 		   // Transmitter
 | 
  
    | 103 | 		SETBIT(MCASP->XGBLCTL, XHCLKRST);
 | 
  
    | 104 | 		while (!CHKBIT(MCASP->XGBLCTL, XHCLKRST)) {}
 | 
  
    | 105 | 		SETBIT(MCASP->XGBLCTL, XCLKRST);
 | 
  
    | 106 | 	    while (!CHKBIT(MCASP->XGBLCTL, XCLKRST)) {}
 | 
  
    | 107 | 		SETBIT(MCASP->XGBLCTL, XSRCLR); //TXSERCLRS
 | 
  
    | 108 | 		while (!CHKBIT(MCASP->XGBLCTL, XSRCLR)) {}
 | 
  
    | 109 | 		MCASP->XBUF0 = 0;
 | 
  
    | 110 | 
 | 
  
    | 111 | 		SETBIT(MCASP->XGBLCTL, XSMRST);
 | 
  
    | 112 | 		while (!CHKBIT(MCASP->XGBLCTL, XSMRST)) {}
 | 
  
    | 113 | 		SETBIT(MCASP->XGBLCTL, XFRST);
 | 
  
    | 114 | 		while (!CHKBIT(MCASP->XGBLCTL, XFRST)) {}
 | 
  
    | 115 | 		MCASP->XBUF0 = 0;
 | 
  
    | 116 | 
 | 
  
    | 117 | 		   // configure serialisers (15 for xmit, 12 for rcv)
 | 
  
    | 118 | 	    MCASP->SRCTL15    = 0x000D;
 | 
  
    | 119 | 		MCASP->SRCTL12    = 0x000E;
 | 
  
    | 120 | 
 | 
  
    | 121 | 		MCASP->XSTAT = 0xFFFFFFFF;        // Clear all
 | 
  
    | 122 | 
 | 
  
    | 123 | 	    while(!CHKBIT(MCASP->SRCTL15, XRDY)) {}
 | 
  
    | 124 | 	    MCASP->XBUF0 = 0;
 | 
  
    | 125 | 
 | 
  
    | 126 | 
 | 
  
    | 127 | 		   //Receiver
 | 
  
    | 128 | //		SETBIT(MCASP->RGBLCTL, RHCLKRST);
 | 
  
    | 129 | //		while (!CHKBIT(MCASP->RGBLCTL, RHCLKRST)) {}
 | 
  
    | 130 | //		SETBIT(MCASP->RGBLCTL, RSRCLR);
 | 
  
    | 131 | //		while (!CHKBIT(MCASP->RGBLCTL, RSRCLR)) {}
 | 
  
    | 132 | //		SETBIT(MCASP->RGBLCTL, RSMRST);
 | 
  
    | 133 | //		while (!CHKBIT(MCASP->RGBLCTL, RSMRST)) {}
 | 
  
    | 134 | //		SETBIT(MCASP->RGBLCTL, RFRST);
 | 
  
    | 135 | //		while (!CHKBIT(MCASP->RGBLCTL, RFRST)) {}
 | 
  
    | 136 | //
 | 
  
    | 137 | //		MCASP->RSTAT = 0x0000FFFF;        // Clear all
 | 
  
    | 138 | //
 | 
  
    | 139 | //		   // Write zero to serialiser buffers so that no underrun occurs after releasing the state machine
 | 
  
    | 140 | //
 | 
  
    | 141 | //		MCASP->RBUF12 = 0;
 | 
  
    | 142 | 
 | 
  
    | 143 | 	   // wait for transmit ready and send a dummy byte.
 | 
  
    | 144 | }
 | 
  
    | 145 | 
 | 
  
    | 146 | 
 | 
  
    | 147 | 
 | 
  
    | 148 | void L138_initialise_poll()
 | 
  
    | 149 | {
 | 
  
    | 150 |   
 | 
  
    | 151 |   poll = 1;     // used in input_sample() and output_sample() functions
 | 
  
    | 152 | 
 | 
  
    | 153 | //  spi_config_t spi_config;
 | 
  
    | 154 | 
 | 
  
    | 155 | 
 | 
  
    | 156 | //   bsl initialisation functions
 | 
  
    | 157 | //  EVMOMAPL138_init();
 | 
  
    | 158 | //  EVMOMAPL138_initRAM();
 | 
  
    | 159 | //  USTIMER_init();
 | 
  
    | 160 | 
 | 
  
    | 161 |   EVMOMAPL138_lpscTransition(PSC1, DOMAIN0, LPSC_MCASP0, PSC_ENABLE);
 | 
  
    | 162 |   EVMOMAPL138_lpscTransition(PSC1, DOMAIN0, LPSC_GPIO, PSC_ENABLE);
 | 
  
    | 163 |   EVMOMAPL138_pinmuxConfig(PINMUX_MCASP_REG_0, PINMUX_MCASP_MASK_0, PINMUX_MCASP_VAL_0);
 | 
  
    | 164 |   EVMOMAPL138_pinmuxConfig(PINMUX_MCASP_REG_1, PINMUX_MCASP_MASK_1, PINMUX_MCASP_VAL_1);
 | 
  
    | 165 | 
 | 
  
    | 166 | 
 | 
  
    | 167 |   CSR = 0x0000; // disable interrupts globally while initialising
 | 
  
    | 168 | 
 | 
  
    | 169 |   L138_init_mcasp_poll();
 | 
  
    | 170 | 
 | 
  
    | 171 |   ICR = 0xFFF0; 
 | 
  
    | 172 | }
 | 
  
    | 173 | 
 | 
  
    | 174 | int prbs(void) 			       //gen pseudo-random sequence {-1,1}
 | 
  
    | 175 | {
 | 
  
    | 176 |   int prnseq;			 
 | 
  
    | 177 |   if(sreg.bt.b0)
 | 
  
    | 178 | 	prnseq = -NOISELEVEL;		           //scaled negative noise level
 | 
  
    | 179 |   else
 | 
  
    | 180 | 	prnseq = NOISELEVEL;		           //scaled positive noise level
 | 
  
    | 181 |   fb =(sreg.bt.b0)^(sreg.bt.b1);   //XOR bits 0,1
 | 
  
    | 182 |   fb^=(sreg.bt.b11)^(sreg.bt.b13); //with bits 11,13 -> fb
 | 
  
    | 183 |   sreg.regval<<=1;
 | 
  
    | 184 |   sreg.bt.b0=fb;			       //close feedback path
 | 
  
    | 185 |   return prnseq;			       //return noise sequence value 
 | 
  
    | 186 | }
 | 
  
    | 187 | 
 | 
  
    | 188 | 
 | 
  
    | 189 | 
 | 
  
    | 190 | uint32_t rand31_next()
 | 
  
    | 191 | {
 | 
  
    | 192 |   uint32_t hi, lo;
 | 
  
    | 193 | 
 | 
  
    | 194 |   lo = 16807 * (prand_seed & 0xFFFF);
 | 
  
    | 195 |   hi = 16807 * (prand_seed >> 16);
 | 
  
    | 196 | 
 | 
  
    | 197 |   lo += (hi & 0x7FFF) << 16;
 | 
  
    | 198 |   lo += hi >> 15;
 | 
  
    | 199 | 
 | 
  
    | 200 |   if (lo > 0x7FFFFFFF) lo -= 0x7FFFFFFF;
 | 
  
    | 201 | 
 | 
  
    | 202 |   return(prand_seed = (uint32_t)lo);
 | 
  
    | 203 | }
 | 
  
    | 204 | 
 | 
  
    | 205 | int16_t prand()
 | 
  
    | 206 | {
 | 
  
    | 207 | return ((int16_t)(rand31_next()>>18)-4096);
 | 
  
    | 208 | }
 |