From e593ab4c83a79e62a3aab0cc6b1036a1673e25cf Mon Sep 17 00:00:00 2001 From: patacongo Date: Sun, 2 Nov 2008 22:34:35 +0000 Subject: Fix workaround logic git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1124 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/configs/mcu123-lpc214x/src/up_spi.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'nuttx/configs') diff --git a/nuttx/configs/mcu123-lpc214x/src/up_spi.c b/nuttx/configs/mcu123-lpc214x/src/up_spi.c index 9e201a5a0..0997aa01b 100644 --- a/nuttx/configs/mcu123-lpc214x/src/up_spi.c +++ b/nuttx/configs/mcu123-lpc214x/src/up_spi.c @@ -154,11 +154,16 @@ static void spi_select(FAR struct spi_dev_s *dev, boolean selected) while (!(getreg8(LPC214X_SPI1_SR) & LPC214X_SPI1SR_TNF)); putreg16(0xff, LPC214X_SPI1_DR); - /* Then wait until TX FIFO and TX shift buffer are empty */ + /* Wait until TX FIFO and TX shift buffer are empty */ while (getreg8(LPC214X_SPI1_SR) & LPC214X_SPI1SR_BSY); + + /* Wait until RX FIFO is not empty */ + while (!(getreg8(LPC214X_SPI1_SR) & LPC214X_SPI1SR_RNE)); + /* Then read and discard bytes until the RX FIFO is empty */ + do { (void)getreg16(LPC214X_SPI1_DR); @@ -290,7 +295,7 @@ static void spi_sndblock(FAR struct spi_dev_s *dev, FAR const ubyte *buffer, siz } } - /* Then discard all card responses until the TX FIFO is emptied. */ + /* Then discard all card responses until the RX & TX FIFOs are emptied. */ do { @@ -304,12 +309,13 @@ static void spi_sndblock(FAR struct spi_dev_s *dev, FAR const ubyte *buffer, siz (void)getreg16(LPC214X_SPI1_DR); } - /* There is a race condition where TFE may go FALSE just before - * RNE goes true. The nasty little delay in the following solves - * that (it could probably be tuned to improve performance). + /* There is a race condition where TFE may go TRUE just before + * RNE goes true and this loop terminates prematurely. The nasty little + * delay in the following solves that (it could probably be tuned + * to improve performance). */ - else if ((sr & LPC214X_SPI1SR_TFE) == 0) + else if ((sr & LPC214X_SPI1SR_TFE) != 0) { up_udelay(100); sr = getreg8(LPC214X_SPI1_SR); -- cgit v1.2.3