1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| #pragma config FEXTOSC = OFF, RSTOSC = HFINT32, CLKOUTEN = OFF, CSWEN = ON, FCMEN = OFF
#pragma config MCLRE = ON, PWRTE = OFF, WDTE = OFF, LPBOREN = OFF, BOREN = OFF, BORV = LOW, PPS1WAY = OFF, STVREN = OFF, DEBUG = OFF
#pragma config WRT = OFF, LVP = ON
#pragma config CP = OFF, CPD = OFF
#include <xc.h>
#include <pic16f18345.h>
#include "SPI.h"
void main ()
{
OSCFRQbits.HFFRQ = 0b100;
// while(!OSCSTAT1bits.HFOR);
SPI_Config();
Generation_Freq( 1500,10 );
while(!SPI1_DataRdy());
}
void Generation_Freq ( unsigned long Fout_MHz, unsigned long Fref_MHz )
{
unsigned long N_Div = 0;
if (Fref_MHz != 10)
{
N_Div = Fref_MHz * 2;
SPI1_Write('R');
while(!SPI1_DataRdy());
for (int i=0;i<4;i++)
{
SPI1_Write(N_Div & 256);
while(!SPI1_DataRdy());
N_Div = N_Div >> 8;
}
}
N_Div = Fout_MHz * 2;
SPI1_Write('D');
while(!SPI1_DataRdy());
for (int i=0;i<4;i++)
{
SPI1_Write(N_Div & 256);
while(!SPI1_DataRdy());
N_Div = N_Div >> 8;
}
}
void SPI_Config( void )
{
TRIS_SCK1 = 0;
TRIS_SS1 = 0;
TRIS_SDO1 = 0;
SSP1STATbits.SMP = 1;
SSP1STATbits.CKE = 0;
SSP1CON1bits.CKP = 0;
SSP1CON1bits.SSPM = 0b0000;
SSP1CON1bits.SSPEN = 1;
return;
}
signed char SPI1_Write( unsigned char data_out )
{
unsigned char TempVar;
TempVar = SSP1BUF;
PIR1bits.SSP1IF = 0;
SSP1CON1bits.WCOL = 0;
SSP1BUF = data_out;
if ( SSP1CON1 & 0x80 )
return ( -1 );
else
while( !PIR1bits.SSP1IF );
return ( 0 );
}
unsigned char SPI1_DataRdy( void )
{
if ( SSP1STATbits.BF )
return ( +1 );
else
return ( 0 );
} |
Partager