int main (void) { init(); led_on(); uart_str("Hello!\r\n"); spi_slave(); led_off(); while (1) { switch (spi_recv()) { case 0: break; case 1: // CPU wants to read a value. this means we are now the master, to transfer the value back. spi_master(); spi_send(uart_read()); spi_slave(); break; case 2: // CPU wrote a value. Output it to serial. uart_write(spi_recv()); break; default: break; } } }
void spitest_init() { #if 1 struct spi *spi; static struct spi_slave *slave[3]; struct spi_opt opt = { .lsb = false, .cpol = false, .cpha = false, .cs = 0, .csLowInactive = false, .gpio = SPI_OPT_GPIO_DIS, .size = 8, .wdelay = 0, .cs_hold = 8, .cs_delay = 500, .bautrate = 500000, }; spi = spi_init(1, SPI_3WIRE_CS, NULL); CONFIG_ASSERT(spi != NULL); slave[0] = spiSlave_init(spi, &opt); CONFIG_ASSERT(slave[0] != NULL); opt.cs_hold = 6; opt.cs_delay = 8; opt.cs = 1; slave[1] = spiSlave_init(spi, &opt); CONFIG_ASSERT(slave[1] != NULL); opt.cs = 2; slave[2] = spiSlave_init(spi, &opt); CONFIG_ASSERT(slave[2] != NULL); #else struct spi *spi; static struct spi_slave *slave[3]; struct spi_ops ops = { .lsb = false, .cpol = false, .cpha = false, .cs = SPI_OPT_CS_DIS, .csLowInactive = false, .gpio = PTD5, .size = 8, .wdelay = 0, .cs_hold = 8, .cs_delay = 500, .bautrate = 500000, }; spi = spi_init(1); CONFIG_ASSERT(spi != NULL); ops.cpol = false; ops.cpha = false; ops.gpio = PTD5; /* CS 0 */ slave[0] = spi_slave(spi, &ops); CONFIG_ASSERT(slave[0] != NULL); ops.cpol = false; ops.cpha = false; ops.cs_hold = 6; ops.cs_delay = 8; ops.gpio = PTD4; /* CS 1 */ slave[1] = spi_slave(spi, &ops); CONFIG_ASSERT(slave[1] != NULL); ops.cpol = false; ops.cpha = false; ops.gpio = PTD3; /* CS 2 */ slave[2] = spi_slave(spi, &ops); CONFIG_ASSERT(slave[2] != NULL); #endif OS_CREATE_TASK(spiTask, "SPI Test Task", 512, slave, 1, taskSPI); }