My callback function :
static _mqx_int set_CS (uint32_t cs_mask, void *user_data)
{
LWGPIO_STRUCT_PTR spigpio = (LWGPIO_STRUCT_PTR)user_data;
static boolean chip_selected = FALSE;
if (cs_mask)
{
if (!chip_selected)
{
if (cs_mask & SPI_EEPROM_CS)
{
if (lwgpio_get_value(spigpio) == LWGPIO_VALUE_HIGH)
{
lwgpio_set_value(spigpio, LWGPIO_VALUE_LOW);
_dspi_time_delay(5);
}
lwgpio_set_value(spigpio, LWGPIO_VALUE_HIGH);
_dspi_time_delay(5);
}
else /* IOExpander “ispi1 :1:” */
{
if (lwgpio_get_value(spigpio) == LWGPIO_VALUE_LOW)
{
lwgpio_set_value(spigpio, LWGPIO_VALUE_HIGH);
_dspi_time_delay(5);
}
lwgpio_set_value(spigpio, LWGPIO_VALUE_LOW);
_dspi_time_delay(5);
}
chip_selected = TRUE;
}
}
else
{
chip_selected = FALSE;
_dspi_time_delay(5);
lwgpio_toggle_value(spigpio);
}
return MQX_OK;
}
As you can see, I specially add 5 us delay between CS and SCLK.