// code for SPI Master device // Jurgen Strydom 2007 09 04 // www.flatspike.com #include #include #pragma config WDT = OFF, OSC = INTIO2, LVP = OFF, MCLRE = OFF #define SW_DIN_PIN PORTAbits.RA0 // Data in #define TRIS_SW_DIN_PIN TRISAbits.TRISA0 #define SW_DOUT_PIN PORTAbits.RA1 // Data out #define TRIS_SW_DOUT_PIN TRISAbits.TRISA1 #define SW_SCK_PIN PORTBbits.RB2 // Clock #define TRIS_SW_SCK_PIN TRISAbits.TRISA2 #define SW_CS_PIN PORTBbits.RB3 // Chip Select #define TRIS_SW_CS_PIN TRISAbits.TRISA3 unsigned char b, Din, Dout; void main (void); void SPI_master_char (void); //---------------------------------------------------------------------------- void main (void) { // OSC settings OSCCONbits.IRCF2 = 1; //Set osc to be 8 MHZ OSCCONbits.IRCF1 = 1; //OSCCON<2:0> = 111; OSCCONbits.IRCF0 = 1; // // other stuff ADCON1 = 0b11111111; // SPI settings TRISA = 0; PORTA = 0; TRISB = 0; PORTB = 0; TRIS_SW_DIN_PIN = 1; // Data in TRIS_SW_DOUT_PIN = 0;// Data out TRIS_SW_SCK_PIN = 0;// Clock TRIS_SW_CS_PIN = 0;// Chip Select PORTBbits.RB1 = 1; Delay10KTCYx(200); PORTBbits.RB1 = 0; while(1) { Delay10KTCYx(50); Dout = 170; SPI_master_char(); } } //---------------------------------------------------------------------------- // SPI stuff /* SW_DIN_PIN // Data in SW_DOUT_PIN // Data out SW_SCK_PIN // Clock SW_CS_PIN // Chip Select */ void SPI_master_char(void) { SW_SCK_PIN = 0; SW_CS_PIN = 1; Delay10TCYx(10); b = 8; for (b = 8; b >0 ; b--) { Rlcf(Dout,1,1); SW_DOUT_PIN = STATUSbits.C; SW_SCK_PIN = 1; Delay10TCYx(10); STATUSbits.C = SW_DIN_PIN; Rlcf(Din,1,1); SW_SCK_PIN = 0; Delay10TCYx(10); } SW_CS_PIN = 0; }