nRF52 SPI: use PPI API instead of direct register access

This commit is contained in:
Matias N
2021-01-30 17:28:17 -03:00
committed by Brennan Ashton
parent 22437698f1
commit e9a45ea183
2 changed files with 13 additions and 12 deletions
+1
View File
@@ -621,6 +621,7 @@ menu "SPI Configuration"
config NRF52_SPI_MASTER_WORKAROUND_1BYTE_TRANSFER
bool "Master 1 Byte transfer anomaly workaround"
depends on NRF52_SPI_MASTER && ARCH_CHIP_NRF52832
select NRF52_PPI
default y
---help---
Enable the workaround to fix SPI Master 1 byte transfer bug
+12 -12
View File
@@ -44,7 +44,7 @@
#ifdef CONFIG_NRF52_SPI_MASTER_WORKAROUND_1BYTE_TRANSFER
# include "hardware/nrf52_gpiote.h"
# include "hardware/nrf52_ppi.h"
# include "nrf52_ppi.h"
#endif
/****************************************************************************
@@ -63,7 +63,7 @@
/* Reserve PPI channel and GPIOTE channel for 1 byte transfer workaround */
#ifdef CONFIG_NRF52_SPI_MASTER_WORKAROUND_1BYTE_TRANSFER
# define SPI_1B_WORKAROUND_PPI_CHAN (18)
# define SPI_1B_WORKAROUND_PPI_CHAN (NRF52_PPI_NUM_CONFIGURABLE_CHANNELS - 1)
# define SPI_1B_WORKAROUND_GPIOTE_CHAN (7)
#endif
@@ -1016,29 +1016,29 @@ static void nrf52_spi_1b_workaround(FAR struct spi_dev_s *dev, bool enable)
/* Stop the SPIM instance when SCK toggles */
putreg32(NRF52_GPIOTE_EVENTS_IN(SPI_1B_WORKAROUND_GPIOTE_CHAN),
NRF52_PPI_CHEEP(SPI_1B_WORKAROUND_PPI_CHAN));
nrf52_ppi_set_event_ep(SPI_1B_WORKAROUND_PPI_CHAN,
NRF52_GPIOTE_EVENTS_IN(
SPI_1B_WORKAROUND_GPIOTE_CHAN));
putreg32((priv->base + NRF52_SPIM_TASK_STOP_OFFSET),
NRF52_PPI_CHTEP(SPI_1B_WORKAROUND_PPI_CHAN));
nrf52_ppi_set_task_ep(SPI_1B_WORKAROUND_PPI_CHAN,
priv->base + NRF52_SPIM_TASK_STOP_OFFSET);
/* Enable PPI channel */
modifyreg32(NRF52_PPI_CHEN, 0,
PPI_CHEN_CH(SPI_1B_WORKAROUND_PPI_CHAN));
nrf52_ppi_channel_enable(SPI_1B_WORKAROUND_PPI_CHAN, true);
}
else
{
/* Disable event */
putreg32(0, NRF52_GPIOTE_CONFIG(SPI_1B_WORKAROUND_GPIOTE_CHAN));
putreg32(0, NRF52_PPI_CHEEP(SPI_1B_WORKAROUND_PPI_CHAN));
putreg32(0, NRF52_PPI_CHTEP(SPI_1B_WORKAROUND_PPI_CHAN));
nrf52_ppi_set_event_ep(SPI_1B_WORKAROUND_PPI_CHAN, 0);
nrf52_ppi_set_task_ep(SPI_1B_WORKAROUND_PPI_CHAN, 0);
/* Disable PPI channel */
modifyreg32(NRF52_PPI_CHEN,
PPI_CHEN_CH(SPI_1B_WORKAROUND_PPI_CHAN), 0);
nrf52_ppi_channel_enable(SPI_1B_WORKAROUND_PPI_CHAN, false);
}
}
#endif