Browse Source

fix ads7843 data fetching

The old code forgot to drop the MSB in the very first byte retrieved from ads7843 after a control byte. This will lead to data corruption especially in 16-Clocks per conversion mode.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1781 bbd45198-f89e-11dd-88c7-29a3b14d5316
chaos.proton@gmail.com 13 years ago
parent
commit
9de3512c8a
1 changed files with 13 additions and 5 deletions
  1. 13 5
      bsp/stm32f10x/touch.c

+ 13 - 5
bsp/stm32f10x/touch.c

@@ -92,14 +92,22 @@ static void rtgui_touch_calculate()
             rt_uint16_t tmpy[10];
             unsigned int i;
 
+            /* From the datasheet:
+             * When the very first CLK after the control byte comes in, the
+             * DOUT of ADS7843 is not valid. So we could only get 7bits from
+             * the first SPI_WriteByte. And the got the following 5 bits from
+             * another SPI_WriteByte.(aligned MSB)
+             */
             for(i=0; i<10; i++)
             {
                 CS_0();
-                WriteDataTo7843(TOUCH_MSR_X);                                    /* read X */
-                tmpx[i] = SPI_WriteByte(0x00)<<4;                      /* read MSB bit[11:8] */
-                tmpx[i] |= ((SPI_WriteByte(TOUCH_MSR_Y)>>4)&0x0F );    /* read LSB bit[7:0] */
-                tmpy[i] = SPI_WriteByte(0x00)<<4;                      /* read MSB bit[11:8] */
-                tmpy[i] |= ((SPI_WriteByte(0x00)>>4)&0x0F );           /* read LSB bit[7:0] */
+                WriteDataTo7843(TOUCH_MSR_X);
+                tmpx[i] = (SPI_WriteByte(0x00) & 0x7F) << 5;
+                tmpx[i] |= (SPI_WriteByte(TOUCH_MSR_Y) >> 3) & 0x1F;
+
+                tmpy[i] = (SPI_WriteByte(0x00) & 0x7F) << 5;
+                tmpy[i] |= (SPI_WriteByte(0x00) >> 3) & 0x1F;
+
                 WriteDataTo7843( 1<<7 ); /* ´ò¿ªÖÐ¶Ï */
                 CS_1();
             }