MLC interface driver
MLC_drv.c
Go to the documentation of this file.
1 
11 /*
12  * Platform independent include section
13  */
14 
15 #include "platform.h"
16 #include "MLC_drv.h"
17 #include <stdint.h>
18 #include <stdio.h>
19 
20 /*
21  * Platform dependent include section
22  */
23 
24 #if MCU_TYPE == MCU_TYPE_TMS320F28335
25 #include "DSP2833x_Device.h"
26 #include "DSP2833x_Examples.h"
27 #endif
28 
29 #if MCU_TYPE == MCU_TYPE_TMS320F2812
30 #include "DSP281x_Device.h"
31 #include "DSP281x_Examples.h"
32 #endif
33 
34 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
35 #include "emif.h"
36 #include "sys_common.h"
37 #include "system.h"
38 #include "het.h"
39 #include "gio.h"
40 #include "spi.h"
41 #include "sys_vim.h"
42 #include "sys_dma.h"
43 #endif
44 
45 /*
46  * Platform dependent #define section
47  */
48 
49 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
50 #define PIN_STARTCONVA (uint32)(1U << 21U)
51 #define PIN_STARTCONVB (uint32)(1U << 20U)
52 #define PIN_STARTCONVC (uint32)(1U << 22U)
53 
54 #define READ_ADC_ALL 0xFF
55 
56 #define MLC_READ_32(addr) *((volatile uint32_t*)BASE_ADDRESS+addr)
57 
58 #endif
59 
60 /*
61  * Plaform independent define section
62  */
63 
64 // arrays for storing results
65 #define AD_LEN 16
66 
67 /*
68  * Platform dependent global variables section
69  */
70 
71 // place ad results to RAM which can be DMA accessed
72 #if MCU_TYPE == MCU_TYPE_TMS320F28335
73 #pragma DATA_SECTION(AD_dma_res_1, "DMARAML6")
74 volatile int16_t AD_dma_res_1[16];
75 #pragma DATA_SECTION(AD_dma_res_2, "DMARAML6")
76 volatile int16_t AD_dma_res_2[16];
77 #pragma DATA_SECTION(AD_dma_res_3, "DMARAML6")
78 volatile int16_t AD_dma_res_3[16];
79 #endif
80 
81 #if MCU_TYPE == MCU_TYPE_TMS320F2812
82 volatile int16_t AD_dma_res_1[16];
83 volatile int16_t AD_dma_res_2[16];
84 volatile int16_t AD_dma_res_3[16];
85 #endif
86 
87 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
88 volatile int16_t AD_dma_res_1[16];
89 volatile int16_t AD_dma_res_2[16];
90 volatile int16_t AD_dma_res_3[16];
91 
92 t_isrFuncPTR adc_convend_handler;
93 
94 g_dmaCTRL g_dmaCTRLPKT; /* dma control packet configuration stack */
95 
96 spiDAT1_t spi2_conf;
97 
98 #endif
99 
100 /*
101  * Platform independent global variables
102  */
103 
104 // create pointers to ADC buffers
105 volatile int16_t* AD_res_1 = AD_dma_res_1;
106 volatile int16_t* AD_res_2 = AD_dma_res_2;
107 volatile int16_t* AD_res_3 = AD_dma_res_3;
108 
109 volatile mlc_adc_result* AD_res_1_struct = (mlc_adc_result*) AD_dma_res_1;
110 volatile mlc_adc_result* AD_res_2_struct = (mlc_adc_result*) AD_dma_res_2;
111 volatile mlc_adc_result* AD_res_3_struct = (mlc_adc_result*) AD_dma_res_3;
112 
113 // dac
114 uint16_t dac_values[8];
115 uint16_t dac_sel_ch[8];
116 
117 // pwr outputs buffer
118 volatile uint16_t pwr_out_state = 0;
119 // debug LEDs state
120 volatile uint16_t dbg_state = 0;
121 
123 volatile int temp;
124 
125 mlc_info_t MLC_info_struct;
126 mlc_info_t* pMLC_info_struct = &MLC_info_struct;
127 uint16_t ad_conf = 0;
128 uint16_t ad_soc_conf = 0;
129 
130 /*
131  * Interrupt handlers
132  */
133 
134 //#if USE_AD_INTERRUPT == 1
135 #if MCU_TYPE == MCU_TYPE_TMS320F2812 || MCU_TYPE == MCU_TYPE_TMS320F28335
136 // TMS320Fxxxx needs this while TMS570 not
137 interrupt
138 #endif
139 void isr_conv_end(void){
140  // unimplemented ... consider implementing your own handler.
141  //ESTOP0;
142 #if MCU_TYPE == MCU_TYPE_TMS320F28335
143  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
144 #endif
145 
146 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
147  asm(" MOV R0, R0"); // NOP
148 #endif
149 }
150 
151 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement ISR of ADC conv end
152 
162 void dmaConfigCtrlPacket(uint32 sadd,uint32 dadd,uint32 dsize)
163 {
164  g_dmaCTRLPKT.SADD = sadd; /* source address */
165  g_dmaCTRLPKT.DADD = dadd; /* destination address */
166  g_dmaCTRLPKT.CHCTRL = 0; /* channel control */
167  g_dmaCTRLPKT.FRCNT = 1; /* frame count */
168  g_dmaCTRLPKT.ELCNT = dsize; /* element count */
169  g_dmaCTRLPKT.ELDOFFSET = 4; /* element destination offset */
170  g_dmaCTRLPKT.ELSOFFSET = 0; /* element destination offset */
171  g_dmaCTRLPKT.FRDOFFSET = 0; /* frame destination offset */
172  g_dmaCTRLPKT.FRSOFFSET = 0; /* frame destination offset */
173  g_dmaCTRLPKT.PORTASGN = 4; /* port b */
174  g_dmaCTRLPKT.RDSIZE = ACCESS_16_BIT; /* read size */
175  g_dmaCTRLPKT.WRSIZE = ACCESS_16_BIT; /* write size */
176  g_dmaCTRLPKT.TTYPE = FRAME_TRANSFER ; /* transfer type */
177  g_dmaCTRLPKT.ADDMODERD = ADDR_OFFSET; /* address mode read */
178  g_dmaCTRLPKT.ADDMODEWR = ADDR_INC1; /* address mode write */
179  g_dmaCTRLPKT.AUTOINIT = AUTOINIT_ON; /* autoinit */
180 }
181 
182 #pragma CODE_STATE(gio_isr_handler, 32)
183 #pragma INTERRUPT(gio_isr_handler, IRQ)
184 
185 void gio_isr_handler(void){
186  // check if it is GIOA5 and autoclear int flag
187  int32_t offset = gioREG->OFF1 - 1U;
188  // adc conversion end isr
189  if (offset == 5){
190  // some code
191  adc_convend_handler();
192  }
193 }
194 #endif
195 
196 //#endif
197 #if MCU_TYPE == MCU_TYPE_TMS320F2812 || MCU_TYPE == MCU_TYPE_TMS320F28335
198 interrupt
199 #endif
200 void dma_transfer_end(void){
201  // unimplemented ... consider implementing your own handler.
202  //ESTOP0;
203 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement DMA transfer end
204  asm(" MOV R0, R0"); // NOP
205 #endif
206 
207 #if MCU_TYPE == MCU_TYPE_TMS320F28335
208  PieCtrlRegs.PIEACK.all = PIEACK_GROUP7;
209 #endif
210 }
211 
212 /*
213  * Support functions
214  */
215 #ifndef TMS570LS3137_CLK
216  #define TMS570LS3137_CLK 180000000
217 #endif
218 
219 #define DELAY_1US 13
220 
221 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
222  /*
223  * Simple delay function with 1us resolution, 330s is maximal delay
224  */
225  void DELAY_US(float us){
226  register uint32_t i;
227  for (i=0;i<(uint32_t)(us*DELAY_1US);i++){
228  }
229  }
230 #endif
231 
232 /*
233  * Init of GPIO, 28335 needs to switch pins to XINTF
234 */
235 
236 void MLC_init_F28335(void){
237 
238 #if MCU_TYPE == MCU_TYPE_TMS320F28335
239  EALLOW;
240  // XZCS0
241  GpioCtrlRegs.GPBMUX1.bit.GPIO36 = 0x3;
242 #if USE_EXT_RAM == 1
243  // XZCS7
244  GpioCtrlRegs.GPBMUX1.bit.GPIO37 = 0x3;
245 #endif
246  // XWE0
247  GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 0x3;
248  // XA0 - XA7
249  GpioCtrlRegs.GPBMUX1.bit.GPIO40 = 0x3;
250  GpioCtrlRegs.GPBMUX1.bit.GPIO41 = 0x3;
251  GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 0x3;
252  GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 0x3;
253  GpioCtrlRegs.GPBMUX1.bit.GPIO44 = 0x3;
254  GpioCtrlRegs.GPBMUX1.bit.GPIO45 = 0x3;
255  GpioCtrlRegs.GPBMUX1.bit.GPIO46 = 0x3;
256  GpioCtrlRegs.GPBMUX1.bit.GPIO47 = 0x3;
257 
258  // XD15 - XD0
259  GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 0x3;
260  GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 0x3;
261  GpioCtrlRegs.GPCMUX1.bit.GPIO66 = 0x3;
262  GpioCtrlRegs.GPCMUX1.bit.GPIO67 = 0x3;
263  GpioCtrlRegs.GPCMUX1.bit.GPIO68 = 0x3;
264  GpioCtrlRegs.GPCMUX1.bit.GPIO69 = 0x3;
265  GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 0x3;
266  GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 0x3;
267  GpioCtrlRegs.GPCMUX1.bit.GPIO72 = 0x3;
268  GpioCtrlRegs.GPCMUX1.bit.GPIO73 = 0x3;
269  GpioCtrlRegs.GPCMUX1.bit.GPIO74 = 0x3;
270  GpioCtrlRegs.GPCMUX1.bit.GPIO75 = 0x3;
271  GpioCtrlRegs.GPCMUX1.bit.GPIO76 = 0x3;
272  GpioCtrlRegs.GPCMUX1.bit.GPIO77 = 0x3;
273  GpioCtrlRegs.GPCMUX1.bit.GPIO78 = 0x3;
274  GpioCtrlRegs.GPCMUX1.bit.GPIO79 = 0x3;
275 
276  // TODO: reduce XA only to used ones
277  // XA8 - XA15
278  GpioCtrlRegs.GPCMUX2.bit.GPIO80 = 0x3;
279  GpioCtrlRegs.GPCMUX2.bit.GPIO81 = 0x3;
280  GpioCtrlRegs.GPCMUX2.bit.GPIO82 = 0x3;
281  GpioCtrlRegs.GPCMUX2.bit.GPIO83 = 0x3;
282  GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 0x3;
283  GpioCtrlRegs.GPCMUX2.bit.GPIO85 = 0x3;
284  GpioCtrlRegs.GPCMUX2.bit.GPIO86 = 0x3;
285  GpioCtrlRegs.GPCMUX2.bit.GPIO87 = 0x3;
286  // XA - 16
287  GpioCtrlRegs.GPBMUX1.bit.GPIO39 = 0x3;
288 
289 #if USE_256kB_RAM == 1
290  // enable XA17 as XINTF -> allow addresing of 256kB
291  GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0x3;
292 #endif
293 
294 /*
295  * Initialize GPIO according to MLC interface hardware
296  */
297  // configure pins for AD converter - outputs
298  // CONVSTA
299  GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0x0;
300  GpioCtrlRegs.GPBDIR.bit.GPIO32 = 0x1;
301  // CONVSTB
302  GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 0x0;
303  GpioCtrlRegs.GPBDIR.bit.GPIO33 = 0x1;
304 
305  // prepare first conversion - goto idle state
306  GpioDataRegs.GPBSET.bit.GPIO32 = 0x1;
307  GpioDataRegs.GPBSET.bit.GPIO33 = 0x1;
308 
309  // AD busy - input
310  GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 0x0;
311  GpioCtrlRegs.GPADIR.bit.GPIO25 = 0x0;
312 
313  // FRST data - input
314  GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 0x0;
315  GpioCtrlRegs.GPBDIR.bit.GPIO35 = 0x0;
316 
317  // Buttons
318  GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 0x0;
319  GpioCtrlRegs.GPADIR.bit.GPIO29 = 0x0;
320  GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 0x0;
321  GpioCtrlRegs.GPADIR.bit.GPIO30 = 0x0;
322 #if USE_256kB_RAM != 1
323  // use XA17 as button input
324  GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0x0;
325  GpioCtrlRegs.GPADIR.bit.GPIO31 = 0x0;
326 #endif
327  GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 0x0;
328  GpioCtrlRegs.GPADIR.bit.GPIO28 = 0x0;
329 
330 
331  // IRC input 50,51,53 EQEP1
332  GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 0x1;
333  GpioCtrlRegs.GPBMUX2.bit.GPIO51 = 0x1;
334  GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0x1;
335 
336  GpioCtrlRegs.GPBQSEL2.bit.GPIO50 = 0x1;
337  GpioCtrlRegs.GPBQSEL2.bit.GPIO51 = 0x1;
338  GpioCtrlRegs.GPBQSEL2.bit.GPIO53 = 0x1;
339  GpioCtrlRegs.GPBCTRL.bit.QUALPRD2 = 0x0F;
340 
341 
342  GpioCtrlRegs.GPBQSEL2.bit.GPIO50 = 0; // Synch to SYSCLKOUT
343  GpioCtrlRegs.GPBQSEL2.bit.GPIO51 = 0; // Synch to SYSCLKOUT
344  GpioCtrlRegs.GPBQSEL2.bit.GPIO53 = 0; // Synch to SYSCLKOUT
345 
346  EDIS;
347 
348 /*
349  * Configure XINTF timings
350  */
351 
352 /*
353  ---------|___________|----------
354 
355  <XRDLEAD> <XRDACTIVE> <XRDTRAIL>
356 
357  < adresa >
358  ------------------<data>--------
359 */
360  // 26 ns cycle granularity
361  EALLOW;
362  // 16-bit data bus wide interface
363  XintfRegs.XTIMING0.bit.XSIZE = 0x3;
364 
365  // do not use READY
366  XintfRegs.XTIMING0.bit.USEREADY = 0x0;
367  XintfRegs.XTIMING0.bit.READYMODE = 0x0;
368 
369  // XINTF read timing
370  XintfRegs.XTIMING0.bit.XRDLEAD = 0x1;//1 //26ns
371  XintfRegs.XTIMING0.bit.XRDACTIVE = 0x3;//3 //78ns
372  XintfRegs.XTIMING0.bit.XRDTRAIL = 0x0;//0 //0ns -- not valid ?
373 
374  // XINTF write timing
375  XintfRegs.XTIMING0.bit.XWRLEAD = 0x1;//1 //26ns
376  XintfRegs.XTIMING0.bit.XWRACTIVE = 0x1;//1 //26ns
377  XintfRegs.XTIMING0.bit.XWRTRAIL = 0x2;//2 //52ns
378 
379  // scale 1:2
380  XintfRegs.XTIMING0.bit.X2TIMING = 0x1;
381  EDIS;
382 
383 
384 #if USE_EXT_RAM == 1
385  EALLOW;
386  // setup ZONE7
387  // 16-bit wide interface
388  XintfRegs.XTIMING7.bit.XSIZE = 0x3;
389 
390  // do not use READY
391  XintfRegs.XTIMING7.bit.USEREADY = 0x0;
392  XintfRegs.XTIMING7.bit.READYMODE = 0x0;
393 
394  // XINTF read timing
395  XintfRegs.XTIMING7.bit.XRDLEAD = 0x1;
396  XintfRegs.XTIMING7.bit.XRDACTIVE = 0x1;
397  XintfRegs.XTIMING7.bit.XRDTRAIL = 0x1;
398 
399  // XINTF write timing
400  XintfRegs.XTIMING7.bit.XWRLEAD = 0x1;
401  XintfRegs.XTIMING7.bit.XWRACTIVE = 0x1;
402  XintfRegs.XTIMING7.bit.XWRTRAIL = 0x1;
403 
404  // scale 1:1
405  XintfRegs.XTIMING7.bit.X2TIMING = 0x0;
406  EDIS;
407 #endif
408  EALLOW;
409  // XTIMCLK=SYSCLKOUT = when 0 or 75MHz when 1
410  XintfRegs.XINTCNF2.bit.XTIMCLK = 0x1; // 75MHz
411  // tune output clock to be:
412  // 1/2 of XTIMCLK when 1 or 1/1 when 0
413  // 26.6ns is one unit
414  XintfRegs.XINTCNF2.bit.CLKMODE = 0x1; // 37.5MHz
415 
416  EDIS;
417  // wait until all configuration passes pipeline
418  asm(" RPT #7 || NOP");
419 
420 #if FORCE_PCB_REV != 0
421  mlc_pcb_rev = FORCE_PCB_REV;
422 #else
423  // read PCB revision (stored in CPLD firmware)
424  MLC_info_struct.pcb_hw_ver = MLC_READ(READ_PCB_REV);
425 #endif
426 
427  // read firmware revision of CPLD
428  MLC_info_struct.cpld_fw_ver = MLC_READ(READ_VER);
429  // and FPGA
430  MLC_info_struct.fpga_fw_ver = MLC_READ(READ_FPGA_VER);
431 
432 #if ALLOW_XINTF_SPEEDUP == 1
433 
434  // check if we can enable speedup, depends on PCB revision and firmware
435  if ((MLC_info_struct.pcb_hw_ver > PCB_REV_1) && (MLC_info_struct.cpld_fw_ver > 3)){
436  DBG_INFO_PUTS("XINTF is set to higher speed.");
437  // 13 ns cycle granularity
438  EALLOW;
439  // XINTF read timing
440  XintfRegs.XTIMING0.bit.XRDLEAD = 0x1; //13ns
441  XintfRegs.XTIMING0.bit.XRDACTIVE = 0x5; //65ns
442  XintfRegs.XTIMING0.bit.XRDTRAIL = 0x0; //0ns -- not valid ?
443 
444  // XINTF write timing
445  XintfRegs.XTIMING0.bit.XWRLEAD = 0x1; //13ns
446  XintfRegs.XTIMING0.bit.XWRACTIVE = 0x2; //26ns
447  XintfRegs.XTIMING0.bit.XWRTRAIL = 0x3; //39ns
448 
449  // scale 1:1
450  XintfRegs.XTIMING0.bit.X2TIMING = 0x0;
451  EDIS;
452  // wait untill all config pass pipeline
453  asm(" RPT #7 || NOP");
454  } else {
455  //DBG_INFO_PUTS("Can not setup XINTF to higher speed, FW of CPLD does not allow this. Upgrade to version 4 or higher.");
456  }
457 #endif
458 
459 
460  // CONVSTC
461  // check PCB revison
462  if (MLC_info_struct.pcb_hw_ver > PCB_REV_1){
463  EALLOW;
464  GpioCtrlRegs.GPBMUX2.bit.GPIO61= 0x0;
465  GpioCtrlRegs.GPBDIR.bit.GPIO61 = 0x1;
466  GpioDataRegs.GPBSET.bit.GPIO61 = 0x1;
467  EDIS;
468  }
469 
470  // revision 3 of FW has global enable
471  if (MLC_info_struct.cpld_fw_ver > 2){
472  EALLOW;
473  GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0x0;
474  GpioCtrlRegs.GPBDIR.bit.GPIO60 = 0x1;
475  GpioDataRegs.GPBSET.bit.GPIO60 = 0x1;
476  EDIS;
477  }
478 
479 //#if USE_DMA == 1
480 
481  // run even if debug request halt
482  //DmaRegs.DEBUGCTRL.bit.FREE = 1;
483 
484 
485  EALLOW;
486  // disable DMA for CH1
487  DmaRegs.CH1.CONTROL.bit.RUN = 0;
488  // disable DMA for CH2
489  DmaRegs.CH2.CONTROL.bit.RUN = 0;
490  // disable DMA for CH3
491  DmaRegs.CH3.CONTROL.bit.RUN = 0;
492  EDIS;
493 
494 #if USE_ADC_DMA == 1
495  EALLOW;
496  // allow DMA
497  DmaRegs.CH1.CONTROL.bit.RUN = 1;
498  // allow interrupt
499  DmaRegs.CH1.MODE.bit.CHINTE = 1;
500  // data size 16b
501  DmaRegs.CH1.MODE.bit.DATASIZE = 0;
502  // set to continuous mode - after transfer DMA is reset and wait
503  // for another interrupt event
504  DmaRegs.CH1.MODE.bit.CONTINUOUS = 1;
505  // generate interrupt when transfer done
506  DmaRegs.CH1.MODE.bit.CHINTMODE = 1;
507  // enable start of DMA from interrupt
508  //DmaRegs.CH1.MODE.bit.PERINTE = 1;
509  // select proper interrupt source for start of transfer
510  // in our case it is XINT1 which is connected to BUSY of ADC
511  DmaRegs.CH1.MODE.bit.PERINTSEL = 3;
512  // burst setup - 16 words
513  DmaRegs.CH1.BURST_SIZE.bit.BURSTSIZE = 15;
514  // burst step source - no address change
515  DmaRegs.CH1.SRC_BURST_STEP = 0;
516  // burst step destination - add 1 to address
517  DmaRegs.CH1.DST_BURST_STEP = 1;
518  // transfer size - one burst
519  DmaRegs.CH1.TRANSFER_SIZE = 0;
520  // begin address
521  DmaRegs.CH1.SRC_ADDR_SHADOW = BASE_ADDRESS + READ_AD1;
522  // dest address
523  DmaRegs.CH1.DST_ADDR_SHADOW = (Uint32)AD_dma_res_1;
524  // setup isr handler
525  //MLC_enable_DMA_isr(AD_CH1, dma_transfer_end);
526  // clear all flags
527  DmaRegs.CH1.CONTROL.bit.ERRCLR = 1;
528  DmaRegs.CH1.CONTROL.bit.SYNCCLR = 1;
529  DmaRegs.CH1.CONTROL.bit.PERINTCLR = 1;
530 
531  // allow DMA
532  DmaRegs.CH2.CONTROL.bit.RUN = 1;
533  // allow interrupt
534  DmaRegs.CH2.MODE.bit.CHINTE = 1;
535  // data size 16b
536  DmaRegs.CH2.MODE.bit.DATASIZE = 0;
537  // set to continuous mode - after transfer DMA is reset and wait
538  // for another interrupt event
539  DmaRegs.CH2.MODE.bit.CONTINUOUS = 1;
540  // allow interrupt when done only when other channels are disabled
541  // generate interrupt when transfer done
542  DmaRegs.CH2.MODE.bit.CHINTMODE = 1;
543  // enable start of DMA from interrupt
544  //DmaRegs.CH2.MODE.bit.PERINTE = 1;
545  // select proper interrupt source for start of transfer
546  // in our case it is XINT1
547  DmaRegs.CH2.MODE.bit.PERINTSEL = 3;
548  // burst setup - 16 words
549  DmaRegs.CH2.BURST_SIZE.bit.BURSTSIZE = 15;
550  // burst step source - no address change
551  DmaRegs.CH2.SRC_BURST_STEP = 0;
552  // burst step destination - add 1 to address
553  DmaRegs.CH2.DST_BURST_STEP = 1;
554  // transfer size - one burst
555  DmaRegs.CH2.TRANSFER_SIZE = 0;
556  // begin address
557  DmaRegs.CH2.SRC_ADDR_SHADOW = BASE_ADDRESS + READ_AD2;
558  // dest address
559  DmaRegs.CH2.DST_ADDR_SHADOW = (Uint32)AD_dma_res_2;
560  // setup isr handler
561  //MLC_enable_DMA_isr(AD_CH2, dma_transfer_end);
562 
563  // clear all flags
564  DmaRegs.CH2.CONTROL.bit.ERRCLR = 1;
565  DmaRegs.CH2.CONTROL.bit.SYNCCLR = 1;
566  DmaRegs.CH2.CONTROL.bit.PERINTCLR = 1;
567 
568  // allow DMA
569  DmaRegs.CH3.CONTROL.bit.RUN = 1;
570  // allow interrupt
571  DmaRegs.CH3.MODE.bit.CHINTE = 1;
572  // data size 16b
573  DmaRegs.CH3.MODE.bit.DATASIZE = 0;
574  // set to continuous mode - after transfer DMA is reset and wait
575  // for another interrupt event
576  DmaRegs.CH3.MODE.bit.CONTINUOUS = 1;
577  // generate interrupt when transfer done
578  DmaRegs.CH3.MODE.bit.CHINTMODE = 1;
579  // enable start of DMA from interrupt
580  //DmaRegs.CH3.MODE.bit.PERINTE = 1;
581  // select proper interrupt source for start of transfer
582  // in our case it is XINT1
583  DmaRegs.CH3.MODE.bit.PERINTSEL = 3;
584  // burst setup - 16 words
585  DmaRegs.CH3.BURST_SIZE.bit.BURSTSIZE = 15;
586  // burst step source - no address change
587  DmaRegs.CH3.SRC_BURST_STEP = 0;
588  // burst step destination - add 1 to address
589  DmaRegs.CH3.DST_BURST_STEP = 1;
590  // transfer size - one burst
591  DmaRegs.CH3.TRANSFER_SIZE = 0;
592  // begin address
593  DmaRegs.CH3.SRC_ADDR_SHADOW = BASE_ADDRESS + READ_AD3;
594  // dest address
595  DmaRegs.CH3.DST_ADDR_SHADOW = (Uint32)AD_dma_res_3;
596  // setup default isr handler
597  //MLC_enable_DMA_isr(AD_CH3, dma_transfer_end);
598  // clear all flags
599  DmaRegs.CH3.CONTROL.bit.ERRCLR = 1;
600  DmaRegs.CH3.CONTROL.bit.SYNCCLR = 1;
601  DmaRegs.CH3.CONTROL.bit.PERINTCLR = 1;
602  EDIS;
603 #endif
604 #endif
605 }
606 
607 /*
608  * F2812 init routine
609  */
610 
611 void MLC_init_F2812(void){
612 #if MCU_TYPE == MCU_TYPE_TMS320F2812
613  EALLOW;
614  // configure pins for AD converter - outputs
615  // CONVSTA
616  GpioMuxRegs.GPDMUX.bit.T2CTRIP_SOCA_GPIOD1 = 0x0;
617  GpioMuxRegs.GPDDIR.bit.GPIOD1 = 0x1;
618  // CONVSTB
619  GpioMuxRegs.GPDMUX.bit.T4CTRIP_SOCB_GPIOD6 = 0x0;
620  GpioMuxRegs.GPDDIR.bit.GPIOD6 = 0x1;
621 
622  // prepare first conversion - goto idle state
623  GpioDataRegs.GPDSET.bit.GPIOD1 = 0x1;
624  GpioDataRegs.GPDSET.bit.GPIOD6 = 0x1;
625 
626  // AD busy - input
627  GpioMuxRegs.GPEMUX.bit.XNMI_XINT13_GPIOE2 = 0x0;
628  GpioMuxRegs.GPEDIR.bit.GPIOE2 = 0x0;
629 
630  // FRST data - input --UNSUPORTED ! in rev. 1
631  GpioMuxRegs.GPFMUX.bit.MDXA_GPIOF12 = 0x0;
632  GpioMuxRegs.GPFDIR.bit.GPIOF12 = 0x0;
633 
634  // Buttons
635  GpioMuxRegs.GPFMUX.bit.MCLKXA_GPIOF8 = 0x0;
636  GpioMuxRegs.GPFDIR.bit.GPIOF8 = 0x0;
637  GpioMuxRegs.GPFMUX.bit.MCLKRA_GPIOF9 = 0x0;
638  GpioMuxRegs.GPFDIR.bit.GPIOF9 = 0x0;
639  GpioMuxRegs.GPFMUX.bit.MFSRA_GPIOF11 = 0x0;
640  GpioMuxRegs.GPFDIR.bit.GPIOF11 = 0x0;
641  GpioMuxRegs.GPFMUX.bit.MFSXA_GPIOF10 = 0x0;
642  GpioMuxRegs.GPFDIR.bit.GPIOF10 = 0x0;
643 
644 
645 
646  // IRC input 50,51,53 EQEP1
647  GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIOA8 = 0x1;
648  GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9 = 0x1;
649  GpioMuxRegs.GPAMUX.bit.CAP3QI1_GPIOA10 = 0x1;
650 
651  EDIS;
652  /*
653  ---------|___________|----------
654 
655  <XRDLEAD> <XRDACTIVE> <XRDTRAIL>
656 
657  < adresa >
658  ------------------<data>--------
659  */
660  EALLOW;
661  // 16-bit data bus wide interface
662  XintfRegs.XTIMING1.bit.XSIZE = 0x3;
663 
664  // do not use READY
665  XintfRegs.XTIMING1.bit.USEREADY = 0x0;
666  XintfRegs.XTIMING0.bit.READYMODE = 0x0;
667 
668  // XINTF read timing
669  XintfRegs.XTIMING1.bit.XRDLEAD = 0x1;//1
670  XintfRegs.XTIMING1.bit.XRDACTIVE = 0x3;//3
671  XintfRegs.XTIMING1.bit.XRDTRAIL = 0x0;//0
672 
673  // XINTF write timing
674  XintfRegs.XTIMING1.bit.XWRLEAD = 0x1;//1
675  XintfRegs.XTIMING1.bit.XWRACTIVE = 0x2;//1
676  XintfRegs.XTIMING1.bit.XWRTRAIL = 0x1;//2
677 
678  // scale 1:2
679  XintfRegs.XTIMING1.bit.X2TIMING = 0x1;
680  EDIS;
681 
682 
683  #if USE_EXT_RAM == 1
684  EALLOW;
685  // setup ZONE7
686  // 16-bit wide interface
687  XintfRegs.XTIMING7.bit.XSIZE = 0x3;
688 
689  // do not use READY
690  XintfRegs.XTIMING7.bit.USEREADY = 0x0;
691  XintfRegs.XTIMING7.bit.READYMODE = 0x0;
692 
693  // XINTF read timing
694  XintfRegs.XTIMING7.bit.XRDLEAD = 0x1;
695  XintfRegs.XTIMING7.bit.XRDACTIVE = 0x1;
696  XintfRegs.XTIMING7.bit.XRDTRAIL = 0x1;
697 
698  // XINTF write timing
699  XintfRegs.XTIMING7.bit.XWRLEAD = 0x1;
700  XintfRegs.XTIMING7.bit.XWRACTIVE = 0x1;
701  XintfRegs.XTIMING7.bit.XWRTRAIL = 0x1;
702 
703  // scale 1:1
704  XintfRegs.XTIMING7.bit.X2TIMING = 0x0;
705  EDIS;
706  #endif
707  EALLOW;
708  // XTIMCLK=SYSCLKOUT = when 0 or 75MHz when 1
709  XintfRegs.XINTCNF2.bit.XTIMCLK = 0x1; // 75MHz
710  // tune output clock to be:
711  // 1/2 of XTIMCLK when 1 or 1/1 when 0
712  XintfRegs.XINTCNF2.bit.CLKMODE = 0x1; // 37.5MHz
713 
714  EDIS;
715  // wait until all configuration passes pipeline
716  asm(" RPT #7 || NOP");
717 
718  #if FORCE_PCB_REV != 0
719  mlc_pcb_rev = FORCE_PCB_REV;
720  #else
721  // read PCB revision (stored in CPLD firmware)
722  MLC_info_struct.pcb_hw_ver = MLC_READ(READ_PCB_REV);
723  #endif
724 
725  // read firmware revision of CPLD
726  MLC_info_struct.cpld_fw_ver = MLC_READ(READ_VER);
727  // and FPGA
728  MLC_info_struct.fpga_fw_ver = MLC_READ(READ_FPGA_VER);
729 
730  #if ALLOW_XINTF_SPEEDUP == 1
731 
732  // check if we can enable speedup, depends on PCB revision and firmware
733  if ((mlc_pcb_rev > PCB_REV_1) && (mlc_fw_rev > 3)){
734  DBG_INFO_PUTS("XINTF is set to higher speed.");
735  EALLOW;
736  // XINTF read timing
737  XintfRegs.XTIMING1.bit.XRDLEAD = 0x1;
738  XintfRegs.XTIMING1.bit.XRDACTIVE = 0x5;
739  XintfRegs.XTIMING1.bit.XRDTRAIL = 0x0;
740 
741  // XINTF write timing
742  XintfRegs.XTIMING1.bit.XWRLEAD = 0x1;
743  XintfRegs.XTIMING1.bit.XWRACTIVE = 0x2;
744  XintfRegs.XTIMING1.bit.XWRTRAIL = 0x3;
745 
746  // scale 1:1
747  XintfRegs.XTIMING1.bit.X2TIMING = 0x0;
748  EDIS;
749  // wait untill all config pass pipeline
750  asm(" RPT #7 || NOP");
751  } else {
752  DBG_INFO_PUTS("Can not setup XINTF to higher speed, FW of CPLD does not allow this. Upgrade to version 4 or higher.");
753  }
754  #endif
755 
756  // CONVSTC
757  // check PCB revison
758  if (MLC_info_struct.pcb_hw_ver > PCB_REV_1){
759  EALLOW;
760  GpioMuxRegs.GPAMUX.bit.TCLKINA_GPIOA12 = 0x0;
761  GpioMuxRegs.GPADIR.bit.GPIOA12 = 0x1;
762  GpioDataRegs.GPASET.bit.GPIOA12 = 0x1;
763  EDIS;
764  }
765 
766  // revision 3 of FW has global enable
767  if (MLC_info_struct.cpld_fw_ver > 2){
768  EALLOW;
769  GpioMuxRegs.GPAMUX.bit.TDIRA_GPIOA11 = 0x0;
770  GpioMuxRegs.GPADIR.bit.GPIOA11 = 0x1;
771  GpioDataRegs.GPASET.bit.GPIOA11 = 0x1;
772  EDIS;
773  }
774 #endif
775 }
776 
777 /*
778  * LS3137 init routine
779  */
780 
781 void MLC_init_LS3137(void){
782 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
783  systemInit(); // init system, including pinmux, PLL etc.
784  systemREG1->GPREG1 |= 0x80000000; // this must be there for proper function of EMIF, see SPNU499B p. 158
785  emif_ASYNC1Init(); // setup peripherals EMIF
786  emif_ASYNC2Init(); // setup ext. RAM EMIF
787 
788  // read firmware revision of CPLD
789  MLC_info_struct.cpld_fw_ver = MLC_READ(READ_VER);
790  // and FPGA
791  MLC_info_struct.fpga_fw_ver = MLC_READ(READ_FPGA_VER);
792 
793 
794  gioInit(); //setup GIOA/GIOB
795 
796  // init default GPIOA5 handler - conv end
797  adc_convend_handler = isr_conv_end;
798  // setup VIM
799  vimInit();
800  // GIO will trigger gio_isr_handler
801  vimChannelMap(9,9, &gio_isr_handler);
802 
803  // DMA setup
804  dmaEnable(); // enable DMA controller
805  dmaReqAssign(0,1); //channel 0
806  dmaReqAssign(1,2); //channel 1
807  dmaReqAssign(2,3); //channel 2
808 
809  // setup CH0 - ADC1
810  dmaConfigCtrlPacket((uint32_t)((uint16_t*)BASE_ADDRESS+READ_AD1), (uint32_t)AD_res_1, 16);
811  dmaSetCtrlPacket(DMA_CH0, g_dmaCTRLPKT);
812 
813  // setup CH1 - ADC2
814  dmaConfigCtrlPacket((uint32_t)((uint16_t*)BASE_ADDRESS+READ_AD2), (uint32_t)AD_res_2, 16);
815  dmaSetCtrlPacket(DMA_CH1, g_dmaCTRLPKT);
816 
817  // setup CH2 - ADC3
818  dmaConfigCtrlPacket((uint32_t)((uint16_t*)BASE_ADDRESS+READ_AD3), (uint32_t)AD_res_3, 16);
819  dmaSetCtrlPacket(DMA_CH2, g_dmaCTRLPKT);
820 #endif
821 }
822 
823 // basic multiplatform init
824 void MLC_init(void)
825 {
826 #if MCU_TYPE == MCU_TYPE_TMS320F28335
827  MLC_init_F28335();
828 #endif
829 
830 #if MCU_TYPE == MCU_TYPE_TMS320F2812
831  MLC_init_F2812();
832 #endif
833 
834 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
835  MLC_init_LS3137();
836 #endif
837 
838  // setup ADC
839  MLC_ADC_reset();
842 
843  // test for ext module
844  MLC_WRITE(RW_EXT_LED_REG, 0xAAAA);
845  if (MLC_READ(RW_EXT_LED_REG) == 0xAAAA){
846  MLC_info_struct.mod_fw_ver = MLC_READ(READ_EXT_VER);
847  } else {
848  MLC_info_struct.mod_fw_ver = 0x00;
849  DBG_INFO_PUTS("External module is not present.");
850  }
851 
852 }
853 
854 
856  if (MLC_info_struct.cpld_fw_ver > 2){
857 #if MCU_TYPE == MCU_TYPE_TMS320F28335
858  GpioDataRegs.GPBCLEAR.bit.GPIO60 = 0x1;
859 #endif
860 
861 #if MCU_TYPE == MCU_TYPE_TMS320F2812
862  GpioDataRegs.GPACLEAR.bit.GPIOA11 = 0x1;
863 #endif
864 
865 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
866  // clear global enable
867  gioSetBit(gioPORTA, 1, 0);
868 #endif
869  }
870 }
871 
873  if (MLC_info_struct.cpld_fw_ver > 2){
874 #if MCU_TYPE == MCU_TYPE_TMS320F28335
875  GpioDataRegs.GPBSET.bit.GPIO60 = 0x1;
876 #endif
877 
878 #if MCU_TYPE == MCU_TYPE_TMS320F2812
879  GpioDataRegs.GPASET.bit.GPIOA11 = 0x1;
880 #endif
881 
882 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
883  // clear global enable
884  gioSetBit(gioPORTA, 1, 1);
885 #endif
886  }
887 }
888 
889 // TMS320F2812 does not support DMA transfers
890 #if MCU_TYPE == MCU_TYPE_TMS320F28335 || MCU_TYPE == MCU_TYPE_TMS570LS3137
891 uint16_t MLC_DMA_active(){
892 #if MCU_TYPE == MCU_TYPE_TMS320F28335
893  return DmaRegs.PRIORITYSTAT.bit.ACTIVESTS;
894 #endif
895 
896 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement DMA transfer progress function
897  return 0;
898 #endif
899 }
900 
902 #if MCU_TYPE == MCU_TYPE_TMS320F28335
903 
904  EALLOW;
905  // enable start of DMA from ADC EOC interrupt
906  DmaRegs.CH1.MODE.bit.PERINTE = 1;
907  DmaRegs.CH2.MODE.bit.PERINTE = 1;
908  DmaRegs.CH3.MODE.bit.PERINTE = 1;
909  EDIS;
910 #endif
911 
912 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement activation of ADC DMA
913 #endif
914 }
915 
917 #if MCU_TYPE == MCU_TYPE_TMS320F28335
918  EALLOW;
919  // enable start of DMA from ADC EOC interrupt
920  DmaRegs.CH1.MODE.bit.PERINTE = 0;
921  DmaRegs.CH2.MODE.bit.PERINTE = 0;
922  DmaRegs.CH3.MODE.bit.PERINTE = 0;
923  EDIS;
924 #endif
925 
926 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement deactivation of ADC DMA
927 #endif
928 }
929 
930 #endif
931 
932 void MLC_DMA_enable_isr(uint16_t channel, interrupt void* handler){
933 #if MCU_TYPE == MCU_TYPE_TMS320F28335
934  DINT;
935  EALLOW;
936  //make sure that PIE has power
937  PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
938  // enable group 7 - DMA interrupt
939  IER |= M_INT7;
940  switch (channel) {
941  case AD_CH1:
942  // CH1 uses .1
943  PieCtrlRegs.PIEIER7.bit.INTx1 = 0x1;
944  PieVectTable.DINTCH1 = handler;
945  break;
946  case AD_CH2:
947  // CH2 uses .2
948  PieCtrlRegs.PIEIER7.bit.INTx2 = 0x1;
949  PieVectTable.DINTCH2 = handler;
950  break;
951  case AD_CH3:
952  // CH3 uses .3
953  PieCtrlRegs.PIEIER7.bit.INTx3 = 0x1;
954  PieVectTable.DINTCH3 = handler;
955  break;
956  default:
957  break;
958  }
959  EDIS;
960  EINT;
961 #endif
962 
963 // TODO: implement MLC_DMA_enable_isr
964 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
965  dmaEnable(); // enable DMA controller
966  dmaReqAssign(0,1); //channel 0
967  dmaConfigCtrlPacket((uint32_t)(BASE_ADDRESS + READ_AD1), (uint32_t)&AD_dma_res_1, 16);
968  dmaSetChEnable(DMA_CH0, DMA_SW);
969 #endif
970 }
971 
972 void MLC_DMA_disable_isr(uint16_t channel){
973 
974 // TODO: implement MLC_DMA_disable_isr
975 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
976 #endif
977 
978 #if MCU_TYPE == MCU_TYPE_TMS320F28335
979  DINT;
980  EALLOW;
981  //make sure that PIE has power
982  PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
983  // enable group 7 - DMA interrupt
984  //IER |= M_INT7;
985  switch (channel) {
986  case DMA_ADCH1:
987  // CH1 uses .1
988  PieCtrlRegs.PIEIER7.bit.INTx1 = 0x0;
989  break;
990  case DMA_ADCH2:
991  // CH2 uses .2
992  PieCtrlRegs.PIEIER7.bit.INTx2 = 0x0;
993  break;
994  case DMA_ADCH3:
995  // CH3 uses .3
996  PieCtrlRegs.PIEIER7.bit.INTx3 = 0x0;
997  break;
998  default:
999  break;
1000  }
1001  EDIS;
1002  EINT;
1003 #endif
1004 }
1005 //#endif // DMA functions exclusion end
1006 
1007 // setup non-default interrupt handler
1008 void MLC_ADC_enable_isr(interrupt void* handler){
1009 
1010 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1011  DINT;
1012  EALLOW;
1013  //make sure that PIE has power
1014  PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
1015  // enable INT1.4 - XINT1
1016  IER |= M_INT1;
1017  PieCtrlRegs.PIEIER1.bit.INTx4 = 0x1;
1018  // enable pin 25
1019  GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 25;
1020  // use default handler if user passes null pointer
1021  if (handler == NULL){
1022  PieVectTable.XINT1 = isr_conv_end;
1023  } else {
1024  PieVectTable.XINT1 = handler;
1025  }
1026  // Configure XINT1
1027  XIntruptRegs.XINT1CR.bit.POLARITY = 0; // Falling edge interrupt
1028  XIntruptRegs.XINT1CR.bit.ENABLE = 1; // Enable Xint1
1029  EDIS;
1030  EINT;
1031 #endif
1032 
1033 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1034 #endif
1035 
1036 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement ADC convert ISR
1037  gioEnableNotification(gioPORTA, 5);
1038 #endif
1039 
1040 }
1041 
1042 // disable XINT1
1044 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1045  DINT;
1046  EALLOW;
1047  PieCtrlRegs.PIEIER1.bit.INTx4 = 0x0;
1048  EDIS;
1049  EINT;
1050 #endif
1051 
1052 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1053 #endif
1054 
1055 //TODO: Implement disabling of ADC convend
1056 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
1057 #endif
1058 }
1059 
1060 // resets AD converters
1061 void MLC_ADC_reset(void){
1062  unsigned int i;
1063  // clear results
1064  for (i=0;i<AD_LEN;i++){
1065  AD_res_1[i] = 0;
1066  AD_res_2[i] = 0;
1067  AD_res_3[i] = 0;
1068  }
1069  // clear also DMA buffers
1070  for (i=0;i<16;i++){
1071  AD_dma_res_1[i] = 0;
1072  AD_dma_res_2[i] = 0;
1073  AD_dma_res_3[i] = 0;
1074  }
1075  // reset ADs
1076  MLC_WRITE(WRITE_SETRES_AD, 0x0000);
1077  DELAY_US(10);
1078  // release reset
1079  MLC_WRITE(WRITE_CLRRES_AD, 0x0000);
1080  DELAY_US(10);
1081 }
1082 
1083 //
1085 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1086  // start all converters
1087  GpioDataRegs.GPBCLEAR.bit.GPIO32 = 0x1;
1088  GpioDataRegs.GPBCLEAR.bit.GPIO33 = 0x1;
1089  if (MLC_info_struct.pcb_hw_ver != PCB_REV_1){
1090  GpioDataRegs.GPBCLEAR.bit.GPIO61 = 0x1;
1091  }
1092  DELAY_US(0.1);
1093  GpioDataRegs.GPBSET.bit.GPIO32 = 0x1;
1094  GpioDataRegs.GPBSET.bit.GPIO33 = 0x1;
1095  if (MLC_info_struct.pcb_hw_ver != PCB_REV_1){
1096  GpioDataRegs.GPBSET.bit.GPIO61 = 0x1;
1097  }
1098 #endif
1099 
1100 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1101  // start all converters
1102  GpioDataRegs.GPDCLEAR.bit.GPIOD1 = 0x1;
1103  GpioDataRegs.GPDCLEAR.bit.GPIOD6 = 0x1;
1104  if (MLC_info_struct.pcb_hw_ver != PCB_REV_1){
1105  GpioDataRegs.GPACLEAR.bit.GPIOA12 = 0x1;
1106  }
1107  DELAY_US(0.1);
1108  GpioDataRegs.GPDSET.bit.GPIOD1 = 0x1;
1109  GpioDataRegs.GPDSET.bit.GPIOD6 = 0x1;
1110  if (MLC_info_struct.pcb_hw_ver != PCB_REV_1){
1111  GpioDataRegs.GPASET.bit.GPIOA12 = 0x1;
1112  }
1113 #endif
1114 
1115 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
1116  hetREG1->DCLR = (PIN_STARTCONVA | PIN_STARTCONVB | PIN_STARTCONVC);
1117  DELAY_US(0.1);
1118  hetREG1->DSET = (PIN_STARTCONVA | PIN_STARTCONVB | PIN_STARTCONVC);
1119 #endif
1120 }
1121 
1122 void MLC_ADC_start_one_conv(uint16_t channel){
1123 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1124  switch(channel){
1125  case AD_CH1:
1126  GpioDataRegs.GPBCLEAR.bit.GPIO32 = 0x1;
1127  DELAY_US(0.1);
1128  GpioDataRegs.GPBSET.bit.GPIO32 = 0x1;
1129  break;
1130  case AD_CH2:
1131  GpioDataRegs.GPBCLEAR.bit.GPIO33 = 0x1;
1132  DELAY_US(0.1);
1133  GpioDataRegs.GPBSET.bit.GPIO33 = 0x1;
1134  break;
1135  case AD_CH3:
1136  if (MLC_info_struct.pcb_hw_ver != PCB_REV_1){
1137  GpioDataRegs.GPBCLEAR.bit.GPIO61 = 0x1;
1138  DELAY_US(0.1);
1139  GpioDataRegs.GPBSET.bit.GPIO61 = 0x1;
1140  }
1141  break;
1142  }
1143 #endif
1144 
1145 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1146  switch(channel){
1147  case AD_CH1:
1148  GpioDataRegs.GPDCLEAR.bit.GPIOD1 = 0x1;
1149  DELAY_US(0.1);
1150  GpioDataRegs.GPDSET.bit.GPIOD1 = 0x1;
1151  break;
1152  case AD_CH2:
1153  GpioDataRegs.GPDCLEAR.bit.GPIOD6 = 0x1;
1154  DELAY_US(0.1);
1155  GpioDataRegs.GPDSET.bit.GPIOD6 = 0x1;
1156  break;
1157  case AD_CH3:
1158  if (MLC_info_struct.pcb_hw_ver != PCB_REV_1){
1159  GpioDataRegs.GPACLEAR.bit.GPIOA12 = 0x1;
1160  DELAY_US(0.1);
1161  GpioDataRegs.GPASET.bit.GPIOA12 = 0x1;
1162  }
1163  break;
1164  }
1165 #endif
1166 
1167 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
1168  switch(channel){
1169  case AD_CH1:
1170  hetREG1->DCLR = PIN_STARTCONVA;
1171  DELAY_US(0.1);
1172  hetREG1->DSET = PIN_STARTCONVA;
1173  break;
1174  case AD_CH2:
1175  hetREG1->DCLR = PIN_STARTCONVB;
1176  DELAY_US(0.1);
1177  hetREG1->DSET = PIN_STARTCONVB;
1178  break;
1179  case AD_CH3:
1180  if (MLC_info_struct.pcb_hw_ver != PCB_REV_1){
1181  hetREG1->DCLR = PIN_STARTCONVC;
1182  DELAY_US(0.1);
1183  hetREG1->DSET = PIN_STARTCONVC;
1184  }
1185  break;
1186  }
1187 #endif
1188 }
1189 
1190 //
1191 void MLC_ADC_setup(unsigned int os_1, unsigned int os_2, unsigned int os_3, unsigned int rng_1, unsigned int rng_2, unsigned int rng_3){
1192  unsigned int old_conf;
1193 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1194  // disable interrupt
1195  old_conf = PieCtrlRegs.PIEIER1.bit.INTx4;
1196  PieCtrlRegs.PIEIER1.bit.INTx4 = 0x0;
1197 
1198  // write configuration, i.e. sets pins through CPLD
1199  ad_conf = (os_1 | (os_2 << 3) | (os_3 << 6) | (rng_1 << 9) | (rng_2 << 10) | (rng_3 << 11)) | ad_soc_conf;
1200  MLC_WRITE(WRITE_AD_CONF, ad_conf);
1201  // we must wait for changes are accepted by A/D
1202  DELAY_US(200);
1203  // restore interrupt
1204  PieCtrlRegs.PIEIER1.bit.INTx4 = old_conf;
1205  // enable AD interrupt
1206  //MLC_ADC_enable_isr(NULL);
1207 #endif
1208 
1209 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1210  // disable interrupt
1211  //old_conf = PieCtrlRegs.PIEIER1.bit.INTx4;
1212  //PieCtrlRegs.PIEIER1.bit.INTx4 = 0x0;
1213 
1214  // TODO: 2812: implement ISR support
1215 
1216  // write configuration, i.e. sets pins through CPLD
1217  ad_conf = (os_1 | (os_2 << 3) | (os_3 << 6) | (rng_1 << 9) | (rng_2 << 10) | (rng_3 << 11)) | ad_soc_conf;
1218  MLC_WRITE(WRITE_AD_CONF, ad_conf);
1219  // we must wait for changes are accepted by A/D
1220  DELAY_US(200);
1221  // restore interrupt
1222  //PieCtrlRegs.PIEIER1.bit.INTx4 = old_conf;
1223  // enable AD interrupt
1224  MLC_ADC_enable_isr(NULL);
1225 #endif
1226 
1227 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
1228  // write configuration, i.e. sets pins through CPLD
1229  ad_conf = (os_1 | (os_2 << 3) | (os_3 << 6) | (rng_1 << 9) | (rng_2 << 10) | (rng_3 << 11)) | ad_soc_conf;
1230  MLC_WRITE(WRITE_AD_CONF, ad_conf);
1231  // we must wait for changes are accepted by A/D
1232  DELAY_US(200);
1233  // enable AD interrupt
1234  MLC_ADC_enable_isr(NULL);
1235 #endif
1236 }
1237 
1238 // wait for busy
1239 unsigned int MLC_ADC_wait(void){
1240  unsigned int timeout = 0;
1241 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1242  while (GpioDataRegs.GPADAT.bit.GPIO25 == 0x1) timeout++;
1243 #endif
1244 
1245 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1246  while (GpioDataRegs.GPEDAT.bit.GPIOE2 == 0x1) timeout++;
1247 #endif
1248 
1249 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
1250  while (gioGetBit(gioPORTA, 5) == 0x1) timeout++;
1251 #endif
1252  return timeout;
1253 }
1254 
1255 /*
1256  * MLC_ADC_read has two different implementations, one for TMS570LS3137 which utilizes SW triggered DMA and TMS320Fxxxx version with direct readings
1257  */
1258 
1259 volatile int16_t* MLC_ADC_read(volatile int16_t* ad_res, uint16_t ad_addr){
1260 
1261 #if QUICK_READ == 0
1262  unsigned int i;
1263 #endif
1264 
1265 #if USE_FRSTDATA == 1
1266  // wait for FRST data
1267  ad_res[0] = MLC_READ(ad_addr);
1268 
1269 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1270  while (GpioDataRegs.GPBDAT.bit.GPIO35 == 0x0){
1271 #endif
1272 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1273  while (GpioDataRegs.GPFDAT.bit.GPIOF12 == 0x0){
1274 #endif
1275 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
1276  while (gioGetBit(gioPORTB, 7) == 0x0)
1277  {
1278 #endif
1279  ad_res[0] = MLC_READ(ad_addr);
1280  }
1281  ad_res[1] = MLC_READ(ad_addr);
1282 #elif MCU_TYPE != MCU_TYPE_TMS570LS3137
1283  ad_res[0] = MLC_READ(ad_addr);
1284  ad_res[1] = MLC_READ(ad_addr);
1285  //DELAY_US(1);
1286 #endif
1287 
1288 /*
1289  * Do not correct sign of CH1 of ADCs when using PCBv1.
1290  * This behavior provides same results with DMA transfer and "hand" transfers
1291  * of ADC data.
1292  */
1293 
1294 #if QUICK_READ == 0
1295  for (i=2;i<16;i++){
1296  // correct bad sign in revision 0.1 of PCB
1297  //if ((i==2) && (mlc_pcb_rev == PCB_REV_1))
1298  // (ad_res)[i] = -1*MLC_READ(ad_addr);
1299  //else
1300  (ad_res)[i] = MLC_READ(ad_addr);
1301  //temp = MLC_READ(ad_addr);
1302  }
1303 #elif MCU_TYPE != MCU_TYPE_TMS570LS3137
1304 // if (mlc_pcb_rev == PCB_REV_1){
1305 // ad_res[2] = -MLC_READ(ad_addr);
1306 // ad_res[3] = -MLC_READ(ad_addr);
1307 // } else {
1308  ad_res[2] = MLC_READ(ad_addr);
1309  ad_res[3] = MLC_READ(ad_addr);
1310 // }
1311  ad_res[4] = MLC_READ(ad_addr);
1312  ad_res[5] = MLC_READ(ad_addr);
1313  ad_res[6] = MLC_READ(ad_addr);
1314  ad_res[7] = MLC_READ(ad_addr);
1315  ad_res[8] = MLC_READ(ad_addr);
1316  ad_res[9] = MLC_READ(ad_addr);
1317  ad_res[10] = MLC_READ(ad_addr);
1318  ad_res[11] = MLC_READ(ad_addr);
1319  ad_res[12] = MLC_READ(ad_addr);
1320  ad_res[13] = MLC_READ(ad_addr);
1321  ad_res[14] = MLC_READ(ad_addr);
1322  ad_res[15] = MLC_READ(ad_addr);
1323 #endif
1324 
1325 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 && QUICK_READ == 1 && USE_FRSTDATA == 0
1326  // according to address software toggle DMA transfer
1327  switch (ad_addr) {
1328  case READ_AD1:
1329  dmaSetChEnable(DMA_CH0, DMA_SW);
1330  break;
1331  case READ_AD2:
1332  dmaSetChEnable(DMA_CH1, DMA_SW);
1333  break;
1334  case READ_AD3:
1335  dmaSetChEnable(DMA_CH2, DMA_SW);
1336  break;
1337  case READ_ADC_ALL:
1338  dmaSetChEnable(DMA_CH0, DMA_SW);
1339  dmaSetChEnable(DMA_CH1, DMA_SW);
1340  dmaSetChEnable(DMA_CH2, DMA_SW);
1341  break;
1342  default:
1343  break;
1344  }
1345  // wait for transfer finish
1346  while (dmaREG->SWCHENAS & (1U << DMA_CH0 | 1U << DMA_CH1 | 1U << DMA_CH2)){
1347  asm(" nop ");
1348  }
1349 #endif
1350  return ad_res;
1351 }
1352 
1353 // returns pointer to array where are measured values stored
1354 volatile int16_t* MLC_ADC1_get_res_ptr(void){
1355  return AD_res_1;
1356 }
1357 
1358 volatile int16_t* MLC_ADC2_get_res_ptr(void){
1359  return AD_res_2;
1360 }
1361 
1362 volatile int16_t* MLC_ADC3_get_res_ptr(void){
1363  return AD_res_3;
1364 }
1365 
1367  return AD_res_1_struct;
1368 }
1369 
1371  return AD_res_2_struct;
1372 }
1373 
1375  return AD_res_3_struct;
1376 }
1377 
1378 //
1379 volatile int16_t* MLC_ADC1_read(void){
1380  return MLC_ADC_read(AD_res_1,READ_AD1);
1381 }
1382 
1383 //
1384 volatile int16_t* MLC_ADC2_read(void){
1385  return MLC_ADC_read(AD_res_2,READ_AD2);
1386 }
1387 
1388 //
1389 volatile int16_t* MLC_ADC3_read(void){
1390  return MLC_ADC_read(AD_res_3,READ_AD3);
1391 }
1392 
1393 float MLC_ADC_calc_volt(int16_t value, uint16_t range){
1394  return (float)value*range/16384;
1395 }
1396 
1397 void MLC_LCD_write_to(uint16_t pos, char chr)
1398 {
1399  MLC_WRITE(WRITE_LCD_DISP, (pos<<8) | chr);
1400 }
1401 
1402 
1403 // writes string to LCD disp
1404 void MLC_LCD_write_str(char* pStr, uint16_t pos){
1405  char* pTemp;
1406  unsigned char index = pos;
1407  pTemp = pStr;
1408  // parse string
1409  while (*pTemp){
1410  MLC_WRITE(WRITE_LCD_DISP, index << 8 | *pTemp++);
1411  index++;
1412  }
1413 }
1414 
1415 void MLC_LCD_clrscr(void){
1416  char i;
1417  for (i=0;i<32;i++){
1418  MLC_WRITE(WRITE_LCD_DISP, (i<<8) | ' ');
1419  }
1420 }
1421 
1422 void MLC_ADC_setup_SOC(uint16_t adsoc){
1423  ad_soc_conf = adsoc;
1424  ad_conf = (ad_conf & 0x0FFF) | adsoc;
1425  MLC_WRITE(WRITE_AD_CONF, ad_conf);
1426 }
1427 
1428 void MLC_DAC_init(void)
1429 {
1430 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1431  EALLOW;
1432  // setup pins of SPI
1433  GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;
1434  GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0;
1435  GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0;
1436 
1437  GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1;
1438  GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1;
1439  GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1;
1440 
1441  GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3;
1442  GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3;
1443  GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3;
1444 
1445  EDIS;
1446 #endif
1447 
1448 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1449  EALLOW;
1450  GpioMuxRegs.GPFMUX.bit.SPICLKA_GPIOF2 = 1;
1451  GpioMuxRegs.GPFMUX.bit.SPISIMOA_GPIOF0 = 1;
1452  GpioMuxRegs.GPFMUX.bit.SPISTEA_GPIOF3 = 1;
1453  EDIS;
1454 #endif
1455 
1456 
1457 #if MCU_TYPE == MCU_TYPE_TMS320F2812 || MCU_TYPE == MCU_TYPE_TMS320F28335
1458  // Inicializace SPI FIFO (pouziva se pouze TxFIFO)
1459  SpiaRegs.SPIFFTX.all=0xE040;
1460  SpiaRegs.SPIFFRX.all=0x405f; // RXFIFO vypnuto (drzeno v RESET stavu)
1461  SpiaRegs.SPIFFCT.all=1; // zpozdeni zapisu TXFIFO -> SPIDAT ... DAC vyzaduje minimalne 50ns
1462  // nutno vyzkouset ... zpozdeni 2 odpovida cca 100ns
1463 
1464  SpiaRegs.SPICCR.bit.SPISWRESET =0; // zablokovani SPI
1465  SpiaRegs.SPICTL.all =0x0006; // Enable master mode, normal phase,
1466  SpiaRegs.SPIBRR =0x0; // SPICLK max = LSPCLK/4
1467  SpiaRegs.SPIPRI.bit.FREE = 1; // debug udalosti neovlivnuji cinnost SPI
1468  SpiaRegs.SPICCR.all =0x008F; // odblokovani SPI a nastaveni prenosu 16-bit slova
1469 #endif
1470 
1471 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
1472  // setup SPI parameters
1473  spi2_conf.CSNR = 0; // select CS0
1474  spi2_conf.CS_HOLD = 0; // no hold of CS
1475  spi2_conf.DFSEL = 0; // data fomat 0 select
1476  spi2_conf.WDEL = 0; // no delay
1477  // init SPI
1478  spiInit();
1479 #endif
1480  // reset and setup DACs
1481  MLC_DAC_reset();
1482 
1483  // preset ADC channels
1492 }
1493 
1494 void MLC_DAC_control(uint16_t cmd)
1495 {
1496 #if MCU_TYPE == MCU_TYPE_TMS320F2812 || MCU_TYPE == MCU_TYPE_TMS320F28335
1497  SpiaRegs.SPITXBUF=cmd;
1498 #endif
1499 
1500 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
1501  spiTransmitData(spiREG2, &spi2_conf, 1, &cmd);
1502 #endif
1503 }
1504 
1505 
1506 void MLC_DAC_reset(void)
1507 {
1508  uint16_t config = 0x8000;
1509 
1510 #if MCU_TYPE == MCU_TYPE_TMS320F2812 || MCU_TYPE == MCU_TYPE_TMS320F28335
1511  // reset DAC
1512  SpiaRegs.SPITXBUF=0xF000;
1513  //SpiaRegs.SPITXBUF=0xE000;
1514 
1515  // wait for reset done
1516  DELAY_US(1000);
1517 
1518  // set LDAC to ignored
1519  SpiaRegs.SPITXBUF=0xA000;
1520 #endif
1521 
1522 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement it
1523  config = 0xF000;
1524  spiTransmitData(spiREG2, &spi2_conf, 1, &config);
1525  DELAY_US(1000);
1526  config = 0xA000;
1527  spiTransmitData(spiREG2, &spi2_conf, 1, &config);
1528  config = 0x8000;
1529 #endif
1530  // setup DAs
1531  // gain 2xVref, Ref buffered
1532 #if DAC_USE_GAINx2 == 1
1533  config |= 0x0030;
1534 #endif
1535 #if DAC_USE_REF_BUFFER == 1
1536  config |= 0x000C;
1537 #endif
1538 #if DAC_USE_VCC_AS_REF == 1
1539  config |= 0x0003;
1540 #endif
1541 
1542 #if MCU_TYPE == MCU_TYPE_TMS320F2812 || MCU_TYPE == MCU_TYPE_TMS320F28335
1543  SpiaRegs.SPITXBUF=config;
1544 #endif
1545 
1546 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement it
1547  spiTransmitData(spiREG2, &spi2_conf, 1, &config);
1548 #endif
1549 }
1550 
1551 void MLC_DAC_write(uint16_t count)
1552 {
1553  unsigned int i;
1554  uint16_t data[8];
1555 
1556  // avoid over indexing
1557  if (count > 8){
1558  count = 8;
1559  }
1560 
1561  for (i=0;i<count;i++){
1562  // send data to DAC, take care about bad values, they will not interfere with dac_sel_ch
1563 #if MCU_TYPE == MCU_TYPE_TMS320F2812 || MCU_TYPE == MCU_TYPE_TMS320F28335
1564  SpiaRegs.SPITXBUF = ((*(dac_values+i)&0x0FFF)|(*(dac_sel_ch+i)<<12));
1565 #endif
1566 
1567 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement better send of buffer with DMA
1568 // *(dac_values+i) = ((*(dac_values+i)&0x0FFF)|(*(dac_sel_ch+i)<<12));
1569  data[i] = ((*(dac_values+i)&0x0FFF)|(*(dac_sel_ch+i)<<12));
1570 #endif
1571  }
1572 #if MCU_TYPE == MCU_TYPE_TMS570LS3137
1573  spiTransmitData(spiREG2, &spi2_conf, count, data);
1574 #endif
1575 }
1576 
1577 // konfigurace USART modulu
1578 void MLC_SCI_init(unsigned long int baudrate)
1579 {
1580 
1581 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1582  unsigned int temp;
1583  EALLOW;
1584  // Select GPIOs to be Sci pins
1585  GpioCtrlRegs.GPBMUX2.bit.GPIO62 = 0x1;
1586  GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 0x1;
1587  EDIS;
1588 
1589  // 1-stopbit, bez parity, 8b data
1590  ScicRegs.SCICCR.all = 0x0007;
1591  ScicRegs.SCICCR.bit.LOOPBKENA = 0;
1592  // reset and allow RX and TX
1593  ScicRegs.SCICTL1.all =0x0003;
1594 
1595 #if USE_SCI_TX_FIFO == 1
1596  ScicRegs.SCIFFTX.bit.SCIFFENA = 1;
1597  ScicRegs.SCIFFTX.bit.TXFIFOXRESET = 0;
1598  ScicRegs.SCIFFTX.bit.TXFIFOXRESET = 1;
1599 #endif
1600 
1601 #if USE_SCI_RX_FIFO == 1
1602  ScicRegs.SCIFFTX.bit.SCIFFENA = 1;
1603  ScicRegs.SCIFFRX.bit.RXFIFORESET = 0;
1604  ScicRegs.SCIFFRX.bit.RXFIFORESET = 1;
1605 #endif
1606 
1607  // calculate baudrate
1608  // 150000000/32/baudrate
1609  temp = ((150000000 >> 5)/baudrate)-1;
1610  // setup baudrate
1611  ScicRegs.SCIHBAUD = (temp & 0xFF00)>>8;
1612  ScicRegs.SCILBAUD = (temp & 0x00FF);
1613  // release from reset and allow RX and TX
1614  ScicRegs.SCICTL1.all =0x0023;
1615  // soft mode - it solves data corruption when debugger access DSP
1616  ScicRegs.SCIPRI.bit.SOFT = 0x1;
1617 #endif
1618 
1619 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1620  EALLOW;
1621  GpioMuxRegs.GPGMUX.bit.SCITXDB_GPIOG4 = 0x1;
1622  GpioMuxRegs.GPGMUX.bit.SCIRXDB_GPIOG5 = 0x1;
1623  EDIS;
1624 
1625  ScibRegs.SCICCR.all = 0x0007;
1626  ScibRegs.SCICCR.bit.LOOPBKENA = 0;
1627  // reset and allow RX and TX
1628  ScibRegs.SCICTL1.all =0x0003;
1629 
1630 #if USE_SCI_TX_FIFO == 1
1631  ScibRegs.SCIFFTX.bit.SCIFFENA = 1;
1632  ScibRegs.SCIFFTX.bit.TXFIFOXRESET = 0;
1633  ScibRegs.SCIFFTX.bit.TXFIFOXRESET = 1;
1634 #endif
1635 
1636 #if USE_SCI_RX_FIFO == 1
1637  ScibRegs.SCIFFTX.bit.SCIFFENA = 1;
1638  ScibRegs.SCIFFRX.bit.RXFIFORESET = 0;
1639  ScibRegs.SCIFFRX.bit.RXFIFORESET = 1;
1640 #endif
1641 #endif
1642 
1643 #if MCU_TYPE == MCU_TYPE_TMS320F2812 || MCU_TYPE == MCU_TYPE_TMS320F28335
1644  // calculate baudrate
1645  // 150000000/32/baudrate
1646  temp = ((150000000 >> 5)/baudrate)-1;
1647  // setup baudrate
1648  ScibRegs.SCIHBAUD = (temp & 0xFF00)>>8;
1649  ScibRegs.SCILBAUD = (temp & 0x00FF);
1650  // release from reset and allow RX and TX
1651  ScibRegs.SCICTL1.all =0x0023;
1652  // soft mode - it solves data corruption when debugger access DSP
1653  ScibRegs.SCIPRI.bit.SOFT = 0x1;
1654 #endif
1655 }
1656 
1658 {
1659 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1660 #if USE_SCI_RX_FIFO == 0
1661  return ScicRegs.SCIRXST.bit.RXRDY;
1662 #else
1663  return ScicRegs.SCIFFRX.bit.RXFFST;
1664 #endif
1665 #endif
1666 
1667 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1668 #if USE_SCI_RX_FIFO == 0
1669  return ScibRegs.SCIRXST.bit.RXRDY;
1670 #else
1671  return ScibRegs.SCIFFRX.bit.RXFIFST;
1672 #endif
1673 #endif
1674 
1675 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement it
1676  return 0;
1677 #endif
1678 }
1679 
1681 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1682  return ScicRegs.SCICTL2.bit.TXEMPTY;
1683 #endif
1684 
1685 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1686  return ScibRegs.SCICTL2.bit.TXEMPTY;
1687 #endif
1688 
1689 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement it
1690  return 0;
1691 #endif
1692 }
1693 
1695 {
1696 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1697  // wait for char
1698 #if USE_SCI_RX_FIFO == 0
1699  while (ScicRegs.SCIRXST.bit.RXRDY == 0);
1700 #else
1701  while (ScicRegs.SCIFFRX.bit.RXFFST == 0);
1702 #endif
1703  return ScicRegs.SCIRXBUF.all;
1704 #endif
1705 
1706 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1707 #if USE_SCI_RX_FIFO == 0
1708  while (ScibRegs.SCIRXST.bit.RXRDY == 0);
1709 #else
1710  while (ScibRegs.SCIFFRX.bit.RXFIFST == 0);
1711 #endif
1712  return ScibRegs.SCIRXBUF.all;
1713 #endif
1714 
1715 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement it
1716  return 0;
1717 #endif
1718 
1719 }
1720 
1721 // blocking send char
1722 void MLC_SCI_send_char(char c)
1723 {
1724 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1725  // wait for send
1726 #if USE_SCI_TX_FIFO == 0
1727  while (ScicRegs.SCICTL2.bit.TXEMPTY == 0);
1728 #else
1729  while (ScicRegs.SCIFFTX.bit.TXFFST > 0xF);
1730 #endif
1731  ScicRegs.SCITXBUF = c;
1732 #endif
1733 
1734 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1735 #if USE_SCI_TX_FIFO == 0
1736  while (ScibRegs.SCICTL2.bit.TXEMPTY == 0);
1737 #else
1738  while (ScibRegs.SCIFFTX.bit.TXFFST > 0xF);
1739 #endif
1740  ScibRegs.SCITXBUF = c;
1741 #endif
1742 
1743 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement it
1744 #endif
1745 }
1746 
1748 {
1749 #if MCU_TYPE == MCU_TYPE_TMS320F28335
1750  MLC_SCI_send_char(c);
1751  while (!ScicRegs.SCICTL2.bit.TXEMPTY);
1752 #endif
1753 
1754 #if MCU_TYPE == MCU_TYPE_TMS320F2812
1755  MLC_SCI_send_char(c);
1756  while (!ScibRegs.SCICTL2.bit.TXEMPTY);
1757 #endif
1758 
1759 #if MCU_TYPE == MCU_TYPE_TMS570LS3137 //TODO: Implement it
1760 #endif
1761 }
1762 
1763 // blocking send str
1764 void MLC_SCI_send_str(char* str)
1765 {
1766  while (*str != '\0')
1767  {
1768  MLC_SCI_send_char(*str++);
1769  }
1770 }
1771 
1772 // set pwr output while other untouched
1773 void MLC_PWR_on(uint16_t pwr){
1774  pwr_out_state |= pwr ;
1775  MLC_WRITE(WRITE_PWR_OUT, pwr_out_state);
1776 }
1777 
1778 // reset pwr output while other untouched
1779 void MLC_PWR_off(uint16_t pwr){
1780  pwr_out_state &= ~pwr;
1781  MLC_WRITE(WRITE_PWR_OUT, pwr_out_state);
1782 }
1783 
1784 // set debug output while other untouched
1785 void MLC_DBG_set(uint16_t dbg){
1786  dbg_state |= dbg;
1787  MLC_WRITE(WRITE_DBGLEDS, dbg_state);
1788 }
1789 
1790 // clear debug output while other untouched
1791 void MLC_DBG_clear(uint16_t dbg){
1792  dbg_state &= ~dbg;
1793  MLC_WRITE(WRITE_DBGLEDS, dbg_state);
1794 }
1795 
1796 /* EOF */
#define DAC_CH_B
Definition: MLC_drv.h:723
void MLC_init(void)
Definition: MLC_drv.c:824
volatile int16_t * MLC_ADC1_read(void)
Definition: MLC_drv.c:1379
float MLC_ADC_calc_volt(int16_t value, uint16_t range)
Definition: MLC_drv.c:1393
#define AD_CH2
Definition: MLC_drv.h:319
void MLC_SCI_init(uint32_t baudrate)
void MLC_DMA_activate()
Definition: MLC_drv.c:901
#define AD_CH3
Definition: MLC_drv.h:320
uint16_t mod_fw_ver
Definition: MLC_drv.h:174
volatile int16_t * MLC_ADC3_read(void)
Definition: MLC_drv.c:1389
void MLC_global_enable()
Definition: MLC_drv.c:855
#define AD_CH1
Definition: MLC_drv.h:318
void MLC_LCD_write_to(uint16_t pos, char chr)
Definition: MLC_drv.c:1397
void MLC_ADC_setup_SOC(uint16_t adsoc)
Definition: MLC_drv.c:1422
void MLC_SCI_send_char(char c)
Definition: MLC_drv.c:1722
void MLC_ADC_start_one_conv(uint16_t channel)
Definition: MLC_drv.c:1122
volatile mlc_adc_result * MLC_ADC3_get_res_strptr(void)
Definition: MLC_drv.c:1374
volatile int16_t * MLC_ADC1_get_res_ptr(void)
Definition: MLC_drv.c:1354
#define AD_OS0
Definition: MLC_drv.h:330
#define MLC_WRITE(addr, data)
Definition: MLC_drv.h:480
#define READ_AD3
Definition: MLC_drv.h:245
void MLC_LCD_write_str(char *pStr, uint16_t pos)
Definition: MLC_drv.c:1404
uint16_t dac_sel_ch[8]
Definition: MLC_drv.c:115
uint16_t MLC_DMA_active()
Definition: MLC_drv.c:891
#define READ_AD1
Definition: MLC_drv.h:243
#define AD_RNG_5V
Definition: MLC_drv.h:344
void MLC_DAC_reset(void)
Definition: MLC_drv.c:1506
void MLC_PWR_on(uint16_t pwr)
Definition: MLC_drv.c:1773
void MLC_ADC_reset(void)
Definition: MLC_drv.c:1061
#define RW_EXT_LED_REG
#define DAC_CH_H
Definition: MLC_drv.h:729
void dmaConfigCtrlPacket(uint32 sadd, uint32 dadd, uint32 dsize)
Definition: MLC_drv.c:162
uint16_t pcb_hw_ver
Definition: MLC_drv.h:172
#define DMA_ADCH1
Definition: MLC_drv.h:374
#define DMA_ADCH3
Definition: MLC_drv.h:376
void MLC_SCI_send_str(char *str)
Definition: MLC_drv.c:1764
void MLC_DMA_disable_isr(uint16_t channel)
Definition: MLC_drv.c:972
void MLC_DAC_control(uint16_t cmd)
Definition: MLC_drv.c:1494
char MLC_SCI_char_avail(void)
Definition: MLC_drv.c:1657
volatile int16_t * MLC_ADC2_get_res_ptr(void)
Definition: MLC_drv.c:1358
#define DAC_CH_F
Definition: MLC_drv.h:727
#define WRITE_CLRRES_AD
Definition: MLC_drv.h:238
#define BASE_ADDRESS
Definition: MLC_drv.h:228
volatile mlc_adc_result * MLC_ADC2_get_res_strptr(void)
Definition: MLC_drv.c:1370
void MLC_DBG_clear(uint16_t dbg)
Definition: MLC_drv.c:1791
#define READ_EXT_VER
void MLC_PWR_off(uint16_t pwr)
Definition: MLC_drv.c:1779
#define DAC_CH_C
Definition: MLC_drv.h:724
#define DBG_INFO_PUTS(str)
Definition: MLC_drv.h:793
unsigned int MLC_ADC_wait(void)
Definition: MLC_drv.c:1239
#define READ_VER
Definition: MLC_drv.h:242
uint16_t dac_values[8]
Definition: MLC_drv.c:114
char MLC_SCI_recv_char(void)
Definition: MLC_drv.c:1694
#define READ_AD2
Definition: MLC_drv.h:244
#define WRITE_SETRES_AD
Definition: MLC_drv.h:237
#define AD_SOC_ALL_DEFAULT
Definition: MLC_drv.h:354
volatile int16_t * MLC_ADC3_get_res_ptr(void)
Definition: MLC_drv.c:1362
#define WRITE_AD_CONF
Definition: MLC_drv.h:235
#define DMA_ADCH2
Definition: MLC_drv.h:375
#define WRITE_PWR_OUT
Definition: MLC_drv.h:236
#define PCB_REV_1
Definition: MLC_drv.h:384
#define READ_FPGA_VER
Definition: MLC_drv.h:263
void MLC_DAC_write(uint16_t count)
Definition: MLC_drv.c:1551
void MLC_SCI_send_char_wait(char c)
Definition: MLC_drv.c:1747
#define WRITE_LCD_DISP
Definition: MLC_drv.h:278
Header file for MLC driver.
void MLC_LCD_clrscr(void)
Definition: MLC_drv.c:1415
void MLC_DMA_deactivate()
Definition: MLC_drv.c:916
#define DAC_CH_A
Definition: MLC_drv.h:722
char MLC_SCI_wait_send(void)
Definition: MLC_drv.c:1680
volatile int temp
Definition: MLC_drv.c:123
volatile int16_t * MLC_ADC_read(volatile int16_t *ad_res, uint16_t ad_addr)
Definition: MLC_drv.c:1259
#define MLC_READ(addr)
Definition: MLC_drv.h:486
void MLC_global_disable()
Definition: MLC_drv.c:872
void MLC_DAC_init(void)
Definition: MLC_drv.c:1428
void MLC_ADC_enable_isr(interrupt void *handler)
Definition: MLC_drv.c:1008
#define WRITE_DBGLEDS
Definition: MLC_drv.h:239
#define DAC_CH_G
Definition: MLC_drv.h:728
void MLC_ADC_setup(unsigned int os_1, unsigned int os_2, unsigned int os_3, unsigned int rng_1, unsigned int rng_2, unsigned int rng_3)
Definition: MLC_drv.c:1191
void MLC_ADC_start_conv(void)
Definition: MLC_drv.c:1084
void MLC_ADC_disable_isr(void)
Definition: MLC_drv.c:1043
void MLC_DMA_enable_isr(uint16_t channel, interrupt void *handler)
Definition: MLC_drv.c:932
#define DAC_CH_D
Definition: MLC_drv.h:725
#define FORCE_PCB_REV
void MLC_DBG_set(uint16_t dbg)
Definition: MLC_drv.c:1785
volatile int16_t * MLC_ADC2_read(void)
Definition: MLC_drv.c:1384
uint16_t fpga_fw_ver
Definition: MLC_drv.h:171
mlc_info_t * pMLC_info_struct
Definition: MLC_drv.c:126
#define DAC_CH_E
Definition: MLC_drv.h:726
uint16_t cpld_fw_ver
Definition: MLC_drv.h:170
void DELAY_US(float us)
Definition: MLC_drv.c:225
#define READ_PCB_REV
Definition: MLC_drv.h:249
volatile mlc_adc_result * MLC_ADC1_get_res_strptr(void)
Definition: MLC_drv.c:1366