Strike the above. The PIC16F648A has no built in provisions for SPI. Only a USART. It would appear that I am limited to bit banging SPI, or using a MAX3100 as suggested.
For note:
// N
// 2 = 2 us
// 3 = 1.33 us
// 4 = 2.33 us
// 5 = 1.333 us
// 6 = 0.667 us
// 7 = 2.083 us
// 8 = 1.167 us
// 9 = 2.25 us
// 10 = 2 us
// 11 = 0.125 us
// 12 = 1.667 us
// 18 = 1.125 us
// 20 = 1 us
// 50 = 2 us
// 51 = 1.79 us
// 100 = 2.33 us
// 10000 = 42 ns
SPI.Configuration spi_config = new SPI.Configuration( Pins.GPIO_PIN_D10 , false, 500, 1, true, false, [b]N[/b], SPI.SPI_module.SPI1);
Various values are given for N and their corresponding bit widths, 2.33 microseconds being the largest observed, so this means a period of 4.66 microseconds between bits. I am assuming 0.25 microseconds per cycle of the PIC16F648A at 16 mhz. So this means with the quickest possible loop, up to 0.75 microseconds could pass after the falling edge of the clock.
// PORT B 16F648A
// BIT PIN I/O FUNC DESCRIPTION
// RB0 6 INPUT CS SPI SLAVE CPU2 INTERRUPT
// RB1 7 INPUT
// RB2 8 INPUT SCK SPI SLAVE CLOCK
// RB3 9 INPUT SI SPI SLAVE DATA
// RB4 10 INPUT
// RB5 11 OUTPUT FREQ MPH PULSE OUT
// RB6 12 INPUT ENB CPU1 ENABLE SIGNAL
// RB7 13 INPUT
// interrupt vector
// at this point, clock is assumed high and chip select is low
// global interrupt handling is disabled
// master is about to clock in data on the SPI bus which will last about 75 microseconds total (0.075 ms)
// bit widths of 2.33 microseconds / clock period of 4.66 microseconds
// cycle width measured to be 0.25 microseconds at 16 mhz
_asm
banksel _PORTB ; working with port B registers (call once?)
BIT1_LOOP
BTFSC _PORTB, 2 ; skip next line if RB2 clock is 0
; cycles: 2
GOTO BIT1_LOOP ; clock is still high, remain in loop
; cycles: 1
; total time: up to 0.75 us after falling edge of clock
MOVF _PORTB, 0 ; w = _PORTB
; cycles: 1
BTFSC _PORTB, 3 ; skip next line if RB3 is clear
; cycles: 2
BSF data, 0 ; set bit 0 of data high
; cycles: 1
; total time: up to 1.75 us after falling edge of clock
BIT2_LOOP
; .......
_endasm
Unless I've completely missed something, I think the above would do it? I wrote assembly for one semester in college and have never used the PIC opcodes ... uncharted waters for me.
edit:
Looking at the PIC16F648A data sheet, interrupt latency is the same regardless whether processing a 1 cycle or 2 cycle instruction. Interrupt should trigger within 2 cycles of chip select assertion (worst case). So assuming cycle time of 0.250 microseconds and using a frequency that yields bit width of 1.000 microseconds - is the SPI clock pin even required? Only talking 16 bits total, and using a crystal as the clock source of the PIC.