altos/avr: Clear SPI receive buffer before clocking new data in
authorKeith Packard <keithp@keithp.com>
Wed, 12 Oct 2011 00:10:45 +0000 (18:10 -0600)
committerKeith Packard <keithp@keithp.com>
Wed, 12 Oct 2011 00:57:32 +0000 (18:57 -0600)
I don't know why this is necessary, but the receive buffer gets
'extra' data added somehow.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/avr/ao_spi_usart.c

index 1996fcd9e98a9cee798aaaf3ace662c2b623924a..5ea11da6a093527a6ae96cb4caa0f8cd5ccdcaed 100644 (file)
@@ -43,15 +43,17 @@ ao_spi_send(void __xdata *block, uint16_t len) __reentrant
 
 /* Receive bytes over SPI.
  *
 
 /* Receive bytes over SPI.
  *
- * This sets up tow DMA engines, one reading the data and another
- * writing constant values to the SPI transmitter as that is what
- * clocks the data coming in.
+ * Poll, sending zeros and reading data back
  */
 void
 ao_spi_recv(void __xdata *block, uint16_t len) __reentrant
 {
        uint8_t *d = block;
 
  */
 void
 ao_spi_recv(void __xdata *block, uint16_t len) __reentrant
 {
        uint8_t *d = block;
 
+       /* Clear any pending data */
+       while (UCSR1A & (1 << RXC1))
+               (void) UDR1;
+       
        while (len--) {
                while (!(UCSR1A & (1 << UDRE1)));
                UDR1 = 0;
        while (len--) {
                while (!(UCSR1A & (1 << UDRE1)));
                UDR1 = 0;