/* Shift a SPI frame as slave. */ static void spi_stm32_shift_s(SPI_TypeDef *spi, struct spi_stm32_data *data) { u8_t tx_frame; u8_t rx_frame; tx_frame = spi_stm32_next_tx(data); if (LL_SPI_IsActiveFlag_TXE(spi)) { LL_SPI_TransmitData8(spi, tx_frame); /* The update is ignored if TX is off. */ spi_context_update_tx(&data->ctx, 1); } if (LL_SPI_IsActiveFlag_RXNE(spi)) { rx_frame = LL_SPI_ReceiveData8(spi); if (spi_context_rx_on(&data->ctx)) { *data->ctx.rx_buf = rx_frame; spi_context_update_rx(&data->ctx, 1); } } }
static void pull_data(struct device *dev) { const struct spi_dw_config *info = dev->config->config_info; struct spi_dw_data *spi = dev->driver_data; DBG_COUNTER_INIT(); while (read_rxflr(info->regs)) { u32_t data = read_dr(info->regs); DBG_COUNTER_INC(); if (spi_context_rx_buf_on(&spi->ctx)) { switch (spi->dfs) { case 1: UNALIGNED_PUT(data, (u8_t *)spi->ctx.rx_buf); break; case 2: UNALIGNED_PUT(data, (u16_t *)spi->ctx.rx_buf); break; #ifndef CONFIG_ARC case 4: UNALIGNED_PUT(data, (u32_t *)spi->ctx.rx_buf); break; #endif } } spi_context_update_rx(&spi->ctx, spi->dfs, 1); spi->fifo_diff--; } if (!spi->ctx.rx_len && spi->ctx.tx_len < DW_SPI_FIFO_DEPTH) { write_rxftlr(spi->ctx.tx_len - 1, info->regs); } else if (read_rxftlr(info->regs) >= spi->ctx.rx_len) { write_rxftlr(spi->ctx.rx_len - 1, info->regs); } LOG_DBG("Pulled: %d", DBG_COUNTER_RESULT()); }