// Christian Dupaty Lycee Fourcade 13120 Gardanne 01/2003
/* Librairie pour MAX515 sur BUS SPI (PIC18)
 initSPI_max515 initialise le port SPI pour MAX515 avec F=Fosc/4
 Selection boitier sur /SS (PORTA5) pas d'interruption
 void max515(unsigned int v) envoie la valeur v(0<=v<=1023) vers le max515

Brochage MAX515 CNA 10 bits
1 – DIN sur RC5/SDO
2 – SCLK sur RC3/SCK
3 - /CS sur RA5 (ou ailleur)
4 – DOUT (non connecté)
5 – GND
6 – REFIN (ref 2,5v Microchip MCP1525 par exemple)
7 – Vout (sortie 0-5v du CNA)
8 – VDD (5v)
*/

#include <p18f252.h>

void initSPI_max515(void)  // initialisise SPI sur PIC18
{
DDRAbits.RA5=0;	// PRA5 en sortie (/SS)
PORTAbits.RA5=1; // CS=1
DDRCbits.RC3=0;	//SCK en sortie
PORTCbits.RC3=0;
DDRCbits.RC5=0;	//SDO en sortie
PORTCbits.RC5=0;
PIR1bits.SSPIF=0;

SSPSTAT=0b01000000; //echantillonne au milieu de la donnée, sur front montant
SSPCON1=0b00100000;	// active SPI, IDLE=0, clock=FOSC/4

PIR1bits.SSPIF=0;	// SSPIF indique une fin d'emmission par un 1
}

void max515(unsigned int v)   // envoie v sur CAN MAX515
{unsigned char fort,faible;	// poids forts et faibles de v
		v<<=2;		// formatage des données pour compatibilité avec MAX515
		fort=v>>8;
		faible=v & 0b0000000011111111;
	
		PORTAbits.RA5=0; // CS=0
		SSPBUF=fort;				// emmision poids forts		 
		while(!PIR1bits.SSPIF);	// attend la fin de l'émission
		PIR1bits.SSPIF=0;
		SSPBUF=faible;			// emmisiion poids faibles
		while(!PIR1bits.SSPIF);// attend la fin de l'émission
		PIR1bits.SSPIF=0;
		PORTAbits.RA5=1; // CS=1
}

/* programme de test de la librairie
void main(void)
{	
int val=0x0;

initSPI_max515();
while(1)
		{
		max515(val);
		}
}
*/



