Subversion Repositories Code-Repo

Compare Revisions

Ignore whitespace Rev 128 → Rev 129

/PIC Stuff/PIC_27J13/spi.c
6,40 → 6,32
 
void SPI2_Init(unsigned char speed) {
// Set up SPI2 with specified pins
RPINR22 = 7; // SPI2 CLK Input (Pin RB4)
RPOR7 = 11; // SPI2 CLK Output (Pin RB4)
RPINR22 = PPS_SPI2_CLK_IN; // SPI2 CLK Input (Pin RB4)
PPS_SPI2_CLK_OUT = 11; // SPI2 CLK Output (Pin RB4)
#ifndef SPI2_WRITE_ONLY
RPINR21 = 6; // SPI2 Data Input (Pin RB3)
RPINR21 = PPS_SPI2_MISO; // SPI2 Data Input (Pin RB3)
#endif
RPOR5 = 10; // SPI2 Data Output (MOSI) (Pin RB2)
PPS_SPI2_MOSI = 10; // SPI2 Data Output (MOSI) (Pin RB2)
 
TRISBbits.TRISB4 = 0; // SPI2 clock pin (Pin RB4)
SPI_CLK_TRIS = 0; // SPI2 clock pin (Pin RB4)
#ifndef SPI2_WRITE_ONLY
TRISBbits.TRISB3 = 1; // SPI2 data in pin (Pin RB3)(MISO)
SPI_MISO_TRIS = 1; // SPI2 data in pin (Pin RB3)(MISO)
#endif
TRISBbits.TRISB2 = 0; // SPI2 data out pin (Pin RB2)(MOSI)
SPI_MOSI_TRIS = 0; // SPI2 data out pin (Pin RB2)(MOSI)
 
TRISBbits.TRISB7 = 0; // SPI2 slave select (Pin RB7)
LATBbits.LATB7 = 1; // SPI2 SS high (Idle)
SPI_SLAVE_SELECT_TRIS = 0; // SPI2 slave select (Pin RB7)
SPI_SLAVE_SELECT_LAT = 1; // SPI2 SS high (Idle)
 
TRISBbits.TRISB6 = 0; // SPI2 reset (Pin RB6)
LATBbits.LATB6 = 1; // SPI2 reset active low
SPI_RESET_TRIS = 0; // SPI2 reset (Pin RB6)
SPI_RESET_LAT = 1; // SPI2 reset active low
 
TRISBbits.TRISB5 = 0; // SPI2 D/C select (Pin RB5)
LATBbits.LATB5 = 0;
SPI_DC_SELECT_TRIS = 0; // SPI2 D/C select (Pin RB5)
SPI_DC_SELECT_LAT = 0;
 
SSP2STATbits.SMP = 0; // Input is sampled in the middle of data output time
SSP2STATbits.CKE = 0; // Transmit occurs on transition from Idle to active clock state
 
SSP2CON1bits.SSPM = speed;
// if (speed == SPI2_FOSC_4)
// SSP2CON1bits.SSPM = 0b0000; // Clock = FOSC/4
// else if (speed == SPI2_FOSC_8)
// SSP2CON1bits.SSPM = 0b1010; // Clock = FOSC/8
// else if (speed == SPI2_FOSC_16)
// SSP2CON1bits.SSPM = 0b0001; // Clock = FOSC/16
// else
// SSP2CON1bits.SSPM = 0b0010; // Clock = FOSC/64
 
SSP2CON1bits.CKP = 1; // Idle state for clock is a high level
SSP2CON1bits.SSPEN = 1; // Enable MSSP module
79,7 → 71,7
SSP2BUF = spi_data_p->buffer_out[spi_data_p->buffer_out_ind];
spi_data_p->buffer_out_ind++;
} else {
LATBbits.LATB2 = 1; // Bring SS line high
SPI_SLAVE_SELECT_LAT = 1; // Bring SS line high
spi_data_p->buffer_out_ind = 0;
spi_data_p->buffer_out_len = 0;
}
95,12 → 87,12
for (i = 0; i < length; i++) {
spi_data_p->buffer_out[i] = msg[i];
}
LATBbits.LATB7 = 0; // Bring SS line low
SPI_SLAVE_SELECT_LAT = 0; // Bring SS line low
SSP2BUF = spi_data_p->buffer_out[0]; // Transmit first byte
#else
unsigned int i = 0;
unsigned char tmp = 0;
LATBbits.LATB7 = 0;
SPI_SLAVE_SELECT_LAT = 0;
while (i != length) {
SSP2BUF = msg[i];
i++;
119,7 → 111,7
tmp = SSP2BUF;
#endif
}
LATBbits.LATB7 = 1;
SPI_SLAVE_SELECT_LAT = 1;
#endif
}
 
129,7 → 121,7
#else
unsigned int i = 0;
unsigned char tmp = 0;
LATBbits.LATB7 = 0;
SPI_SLAVE_SELECT_LAT = 0;
while (i != length) {
SSP2BUF = c;
i++;
148,7 → 140,7
tmp = SSP2BUF;
#endif
}
LATBbits.LATB7 = 1;
SPI_SLAVE_SELECT_LAT = 1;
#endif
}
 
160,11 → 152,11
for (i = 0; i < length; i++) {
spi_data_p->buffer_out[i] = 0x0;
}
LATBbits.LATB7 = 0; // Bring SS line low
SPI_SLAVE_SELECT_LAT = 0; // Bring SS line low
SSP2BUF = spi_data_p->buffer_out[0]; // Transmit first byte
#else
unsigned char i = 0;
LATBbits.LATB7 = 0;
SPI_SLAVE_SELECT_LAT = 0;
 
for (i = 0; i < length; i++) {
SSP2BUF = 0x0;
178,7 → 170,7
}
spi_data_p->buffer_in_len++;
}
LATBbits.LATB7 = 1;
SPI_SLAVE_SELECT_LAT = 1;
#endif
}