#include "p33FJ64MC802.h"
#include "ConfigSystem.h"


extern int  BufferA[4]  __attribute__((space(dma),aligned(256)));
extern int  BufferB[4]  __attribute__((space(dma),aligned(256)));
#define  SAMP_BUFF_SIZE	 		1		// Size of the input buffer per analog input
#define  NUM_ADCINPUT			4		// Number of channels enabled for channel scan

// DMA0 configuration
// Direction: Read from peripheral address 0-x300 (ADC1BUF0) and write to DMA RAM 
// AMODE: Register indirect with post increment
// MODE: Continuous, Ping-Pong Mode
// IRQ: ADC Interrupt
// ADC stores results stored alternatively between BufferA[] and BufferB[]

void initDma0(void)
{
	DMA0CONbits.AMODE = 0;			// Configure DMA for Register indirect with post increment
	DMA0CONbits.MODE  = 2;			// Configure DMA for Continuous Ping-Pong mode

	DMA0PAD=(int)&ADC1BUF0;     	
	DMA0CNT=(SAMP_BUFF_SIZE*NUM_ADCINPUT-1);	// 4 echantillons			
	
	DMA0REQ=13;		// interceprion It venant de l'ADC
	
	DMA0STA = __builtin_dmaoffset(BufferA);		
	DMA0STB = __builtin_dmaoffset(BufferB);

	IFS0bits.DMA0IF = 0;			//Clear the DMA interrupt flag bit
    IEC0bits.DMA0IE = 1;			//Set the DMA interrupt enable bit
	
	DMA0CONbits.CHEN=1;

}


// 4 capteurs à convertir:
// AN4 sur CH0,AN0 sur CH1,AN1 sur CH2,AN2 sur sur CH3
// scénario: automatic sample , trigger timer (declenchement auto des convertions sur IT timer)
// overflow timer => 4 conv séquentielles des voies
// IT ADC qd les 4 conv ont été réalisés

void  Init_DMA_Multivoies (void )
{

		/* config: CH0 , AN2, Tacq=2us Temps Echantillonneur/bloqueur automatique  */ 	
		/* Tad= 250ns */

 	
 		AD1CON1bits.ADON=0; // Eteint ADC avant config

		//Choix mode de conversion :A modifier selon besoin
		AD1CON1bits.SSRC   = 0b010;		// Trigger TIMER 3 CONV
		AD1CON1bits.ASAM   = 1;			// AUTO SAMPLING
		///////////////////////////////////////////////////
		
		// Choix format de conversion:ne PAS MODFIER
		AD1CON1bits.AD12B  = 0;		// 10-bit ADC operation
		AD1CON1bits.FORM   = 0;		// Data Output Format:  unsigned int (DOUT = 0000 00dd dddd dddd)
		////////////////////////////////////////////////////////
		
		
		//CONFIG Tension de référence : NE PAS MODIFIER: 
		AD1CON2bits.VCFG	=0;  	// VREFH=VDD et VREFL=VSS 
		_AD12B=0;			// ADC en 10 bits
		AD1CHS123bits.CH123NB=0; 	//SAMPLE A: CH1, CH2, CH3 negative input is VREF- (pour nous VSS)
		AD1CHS123bits.CH123NA=0;	//SAMPLE B: CH1, CH2, CH3 negative input is VREF- (pour nous VSS)
		AD1CHS0bits.CH0NB=0; 	//SAMPLE A: Channel 0 negative input is VREF-
		AD1CHS0bits.CH0NA=0;	//SAMPLE B:Channel 0 negative input is VREF-
		AD1CON1bits.SIMSAM = 1;		// CHANGEMENT ICI: E/B simultanée sur toutes les voies puis conv séquentielle)
		////////////////////////////////////////////////////////
		
		
		//Choix des voies et scénario de conversioin:A modifier selon besoin
		AD1CON2bits.CHPS  = 0b10;		// Selection des 4 blocs: CH0,CH1,CH2,CH3
			// BLOC 0
		AD1CON2bits.CSCNA = 0;		// pas de scan sur bloc entree CH0
		//AD1CSSLbits.CSS0=1;
 		//AD1CSSLbits.CSS1=1;
  
		AD1CHS0bits.CH0SA = 4; 		//MUXA +ve input selection : choix AN4 pour le bloc CH0
			//BLOC 1,2,3
		AD1CHS123bits.CH123SA=0	;  	////CH1 positive input is AN0, CH2 positive input is AN1, CH3 positive input is AN2
		//AD1CHS123bits.CH123SA=1	;  	//CH1 positive input is AN3, CH2 positive input is AN4, CH3 positive input is AN5
	
		
		AD1CON2bits.ALTS=0;		// pas de mode alterne
		//AD1CHS123bits.CH123SB=x; 	// utile en mode alterné SampleA/SampleB
		////////////////////////////////////////////////////////
		
		
		//Choix Tacq Tad: NE PAS MODFIER 
		AD1CON3bits.ADRC = 0;		// ADC Clock is derived from Systems Clock
		AD1CON3bits.ADCS = 9;       // Tad=Tcy*(ADCS+1)= (1/40M)*10 = 250ns (la limite est de 75ns) page 49
		AD1CON3bits.SAMC=15; 		// Tacq=SAMC * TAD = TEMPS DE SAMPLING =15 * 250ns= 3.75 us
		

		// DMA
		AD1CON1bits.ADDMABM = 1; 	 	// DMA buffers are built in conversion order mode
	//	_BUFM=0; //Buffer Fill Mode Select bit: 0=Always starts filling buffer at address 0x0
		AD1CON2bits.SMPI    = 0;		// SMPI    = 0 OBLIGATOIRE EN MODE ordered car increment de +1 à chaque transfert
		// AD1CON4bits.DMABL=xxx		ignoré en mode conversion order mode

		//Config IT
	


		IFS0bits.AD1IF = 0; 		// Clear the A/D interrupt flag bit
		
		IEC0bits.AD1IE = 0; 		// PAS d'IT en mode DMA -le transfert du résultat vers espace mémoire est auto
	
 


	//	AD1CON1bits.SAMP   = 0;
		AD1CON1bits.ADON = 1; 		// Turn on the A/D converter


}