Fix workaround logic
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1124 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
4cb20b0d4c
commit
8ebe322536
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user