#define CS PORTC.F0 // just an example
long read_reg(char adr)
{
union char_long {
long l,
char c[4]
} result;
CS = 1;
Spi_Write(1);
Spi_Write(adr | 0x80);
result.c[2]=Spi_Read(0);
result.c[1]=Spi_Read(0);
result.c[0]=Spi_Read(0);
CS = 0;
// sign extension of negative register values
if (result.c[2] & 0x80)
result.c[3]= 0xff;
return result.l;
}
// CKP = 0, CKE =1, SMP = 0, SSPM = 0010
// MASTER_OSC_DIV16 may also work, depending on clock frequency
Spi_Init_Advanced(MASTER_OSC_DIV64, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, HIGH_2_LOW);
TRISC.F0 = 0; // Init CS output
CS = 0;