For what it's worth, here is the code:
//Keep old settings, then optimize our code
//#pragma GCC push_options
#pragma GCC optimize ("O3")
uint8_t SPI_send_byte_gpio(uint32_t head, uint8_t data)
{
uint8_t counter;
uint16_t pin_sck;
uint16_t pin_mosi;
uint16_t pin_miso;
uint8_t receiveddata = 0;
uint8_t miso_value;
/*determine which gpio pins to use */
switch( head)
{
case SPI_LEFT:
pin_sck = LEFT_SCK;
pin_mosi = LEFT_MOSI;
pin_miso = LEFT_MISO;
break;
case SPI_LEFT_CTR:
pin_sck = LEFT_CTR_SCK;
pin_mosi = LEFT_CTR_MOSI;
pin_miso = LEFT_CTR_MISO;
break;
case SPI_RIGHT_CTR:
pin_sck = RIGHT_CTR_SCK;
pin_mosi = RIGHT_CTR_MOSI;
pin_miso = RIGHT_CTR_MISO;
break;
case SPI_RIGHT:
pin_sck = RIGHT_SCK;
pin_mosi = RIGHT_MOSI;
pin_miso = RIGHT_MISO;
break;
default:
return 0;
}
//Loop through each bit
for(counter = 8; counter; counter--)
{
if (data & 0x80)
{
/*MOSI = 1;*/
GPIO_DRV_SetPinOutput(pin_mosi);
}
else
{
/*MOSI = 0;*/
GPIO_DRV_ClearPinOutput(pin_mosi);
}
data <<= 1;
/*SCK = 1; a slave latches input data bit */
GPIO_DRV_SetPinOutput(pin_sck);
/* read MISO - assigned to a GPIO pin in processor expert */
miso_value = GPIO_DRV_ReadPinInput( pin_miso);
if (miso_value)
{
data |= 0x01;
}
/* SCK = 0; a slave shifts out next output data bit */
GPIO_DRV_ClearPinOutput(pin_sck);
}/* end of for */
/* return the received data */
return(data);
}
//Restore all GCC options
//#pragma GCC pop_options
#pragma GCC optimize ("O0")