summaryrefslogtreecommitdiff
path: root/src/lpc/ao_spi_lpc.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-05-19 20:22:20 -0700
committerKeith Packard <keithp@keithp.com>2013-05-19 20:39:19 -0700
commite383d7a28d01729c50f933ceda77ea767d1b8087 (patch)
treed0bda7f5d7933ee75523e0db2158fb88daf58a6d /src/lpc/ao_spi_lpc.c
parent07d261c08214837b5d5cac4d2be43e51a0c47868 (diff)
altos/lpc: Create TX/RX busy macros for SPI driver
Check for both fifo status *and* device busy to make sure the device is idle before we touch any registers. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lpc/ao_spi_lpc.c')
-rw-r--r--src/lpc/ao_spi_lpc.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/lpc/ao_spi_lpc.c b/src/lpc/ao_spi_lpc.c
index 05688f52..e7edca4c 100644
--- a/src/lpc/ao_spi_lpc.c
+++ b/src/lpc/ao_spi_lpc.c
@@ -23,21 +23,25 @@ static struct lpc_ssp * const ao_lpc_ssp[LPC_NUM_SPI] = { &lpc_ssp0, &lpc_ssp1 }
static uint8_t spi_dev_null;
+#define tx_busy(lpc_ssp) (lpc_ssp->sr & ((1 << LPC_SSP_SR_BSY) | (1 << LPC_SSP_SR_TNF))) != (1 << LPC_SSP_SR_TNF)
+#define rx_busy(lpc_ssp) (lpc_ssp->sr & ((1 << LPC_SSP_SR_BSY) | (1 << LPC_SSP_SR_RNE))) != (1 << LPC_SSP_SR_RNE)
+
#define spi_loop(len, put, get) do { \
while (len--) { \
/* Wait for space in the fifo */ \
- while ((lpc_ssp->sr & (1 << LPC_SSP_SR_TNF)) == 0) \
+ while (tx_busy(lpc_ssp)) \
; \
+ \
/* send a byte */ \
lpc_ssp->dr = put; \
\
+ /* Wait for byte to appear in the fifo */ \
+ while (rx_busy(lpc_ssp)) \
+ ; \
+ \
/* recv a byte */ \
get lpc_ssp->dr; \
} \
- \
- /* Wait for the fifo to drain */ \
- while ((lpc_ssp->sr & (1 << LPC_SSP_SR_BSY))) \
- ; \
} while (0);
void