#include #include #define SCK1 LATBbits.LATB12; #define SDI LATBbits.LATB11; #define CS1 LATBbits.LATB10; #define CS2 LATBbits.LATB9; /*************************** SPI Initialisierung ****************************/ void SPI_init( void) { SPI1STATbits.SPISIDL = 0; // Continue module operation in Idle mode SPI1CON1bits.DISSDO = 1; // SDOx pin is not used by module; pin funktions as I/O SPI1CON1bits.MODE16 = 1; // Communication is word-wide (16 bits) SPI1CON1bits.SMP = 0; // 0 = input data sampled at middle of data output time SPI1CON1bits.CKE = 0; // 1 = Serial output data changes on transition from active clock state to idle clock state // if "falling" is true, then data is checked on falling edges of SCLK SPI1CON1bits.SSEN = 0; // Not used in Master mode SPI1CON1bits.CKP = 0; // Idle state for clock is a low level; active state is a high level SPI1CON1bits.MSTEN = 1; // Master mode // Prescaler Config = 512:1 (slowest possible) SPI1CON1bits.SPRE = 0; // secondary prescaler 8:1 SPI1CON1bits.PPRE = 0; // primary prescaler 64:1 SPI1CON2bits.FRMEN = 0; // Framed SPIx support disabled SPI1CON2bits.SPIFSD = 0; // Framed sync pulse output (master) SPI1CON2bits.FRMPOL = 0; // Frame sync pulse is active-low SPI1CON2bits.FRMDLY = 0; // Frame sync pulse precedes first bit clock } short Temp1 = 0x0000; short Temp2 = 0x0000; /*************************** SPI Read ****************************/ //////////////// Temeratur 1 //////////////////// short SPI_Temperatur1 ( void) { // int Temp1 = 0x0000; short delaycount = 0; SPI1STATbits.SPIEN = 0; SPI_init(); // 1 SPI1STATbits.SPIEN = 1; for(delaycount=0; delaycount<1; delaycount++) { LATBbits.LATB10 = 0; SPI1BUF = Temp1; while (!SPI1STATbits.SPIRBF); Temp1 = SPI1BUF; LATBbits.LATB10 = 1; } return Temp1; } //////////////// Temeratur 2 //////////////////// short SPI_Temperatur2 ( void) { // int Temp2 = 0x0000; short delaycount = 0; SPI1STATbits.SPIEN = 0; SPI_init(); // 1 SPI1STATbits.SPIEN = 1; for(delaycount=0; delaycount<1; delaycount++) { LATBbits.LATB9 = 0; SPI1BUF = Temp2; while (!SPI1STATbits.SPIRBF); Temp2 = SPI1BUF; LATBbits.LATB9 = 1; } return Temp2; } /************************************************************** **************************** Main ***************************** **************************************************************/ int main (void) { /************************************************************ * Clocksetting * * Fosc = Fin*(M/N1*N2) * * Fcy = Fosc/2 ---> 40MIPS (M = 16) / 80MIPS (M=32) * ************************************************************/ CLKDIVbits.PLLPOST = 0b00; // N2 = 2 CLKDIVbits.PLLPRE = 0b00010; // N1 = 4 // PLLFBDbits.PLLDIV = 0b000010000; // M = 16 PLLFBDbits.PLLDIV = 0b000100000; // M = 32 TRISA = 0b00000; TRISB = 0b0110100000000000; //set Input/Output Pins of RB => RB11 (SPI in) input /************************************* SPI Remapping **************************************/ RPINR20bits.SDI1R = 0b1011; // Setze SPI1 Data In auf Pin RP11 RPOR6bits.RP12R = 0b01000; // Setze SPI1 Clock out auf Pin RP12 while(1) { int i=1; unsigned long long SPI; /**************************** SPI für Temperatursensoren *********************************/ if(SPI==0b111111111) { SPI_Temperatur1(); } if(SPI==0b1111111111) { SPI_Temperatur2(); } if(SPI==0b11111111111) { SPI=0b0; } SPI ++; /* if(Temp1<0b0000000000001010) // < 10°C { LATAbits.LATA0 = 1; } else LATAbits.LATA0 = 0; // LED-PIN festlegen!!! if(Temp1<0b0000000000010100) // < 20°C { LATAbits.LATA1 = 1; } else LATAbits.LATA1 = 0; // LED-PIN festlegen!!! if(Temp1==0b0000000000011110) // < 30°C { LATAbits.LATA0 = 1; } else LATAbits.LATA0 = 0; // LED-PIN festlegen!!! */ } // while(1) } // main()