Forum: Mikrocontroller und Digitale Elektronik ADS7843 Verständnisproblem


von Joel B. (Firma: µGFX) (tectu)


Lesenswert?

Hallo Leute,

Ich brauche mal euere hilfe, ich dreh hier gleich druch :D

Ich versuche hier den ADS7843 controller auszulesen (Touchpad 
controller).

Leider geht zur Zeit noch garnichts, und ich bin mir nicht sicher, ob 
ich nicht villeicht etwas komplett falsch verstehe.

Nach dem studieren des Datenblatts gehe ich davon aus, dass ich wirklich 
nur diese 8 controllbits (das Controllbyte) zum Controller senden muss, 
und dann frisch fröhlich nur das was zurück kommt lesen muss, richtig?

Was ich mache:

tpReadX() {
   1. CS line auf low
   2. 0x98 senden
   3. SPI lesen
   4. CS line auf high
}

tpReadY() {
   1. CS line auf low
   2. 0xd8 senden
   3. SPI lesen
   4. CS line auf high
}

Sollte das so nicht schon genügen um ganz einfach X- und Y-Koordinaten 
mit 8-Bit Auflösung aus dem Ding zu bekommen?

Falls das etwas hilft:  Ich nutze einen STM32F103VET mit ChibiOS.



~ Tectu

von Arc N. (arc)


Lesenswert?

Theoretisch schon, wenn mit "3. SPI lesen" nicht nur gemeint ist, dass 
entsprechende Register auszulesen...
Takt nach den ersten 8-Bit...

von Joel B. (Firma: µGFX) (tectu)


Lesenswert?

Naja, mit dem Punkt 3. hab ich schon so ziemlich das gemeint.
Im Sinne halt von "lesen was der Controller zurückgibt".

Was genau meinst du mit "Takt nach den ersten 8-Bit"?

von Arc N. (arc)


Lesenswert?

Mr. Anderson schrieb:
> Naja, mit dem Punkt 3. hab ich schon so ziemlich das gemeint.
> Im Sinne halt von "lesen was der Controller zurückgibt".
>
> Was genau meinst du mit "Takt nach den ersten 8-Bit"?

Der ADS überträgt ohne Takt nichts (Figure 5 im Datenblatt) D.h. nach 
dem 0x98 bzw. 0xd8 überträgt der ADS nichts mehr bzw. man müsste (je 
nach Implementation, kenne ChibiOS nicht) noch ein/zwei Dummy-Writes 
(und Reads) machen, um die Daten vom ADS zu bekommen.

von Gerhard G. (g_g)


Lesenswert?

Hallo,

so schaut eine funktionierendes Auslesen z.B aus.

buf_data[2] = readADC(0x94);  //Write Command Measure Y-Position
buf_data[2] = readADC(0x00);  //Read ADC data Y-Position
buf_data[3] = readADC(0x00);  //Read ADC data Y-Position
buf_data[0] = readADC(0xD4);  //Write Command Measure X-Position
buf_data[0] = readADC(0x00);  //Read ADC data X-Position
buf_data[1] = readADC(0x00);  //Read ADC data X-Position


Gruß G.G.

von Michael A. (mukululul)


Lesenswert?

Hallo,
vielleicht etwas spät aber vielleicht hilft es anderen....

bei mir funktioniert der ADS7843 mit folgender Config mit chibios/gfx:

in board.h

TP_Busy und TP_INT auf PIN_INPUT_PUD configurieren.
CS_TP (SPIx_NSS) auf PIN_OUTPUT_PP_50
SPI2_SCK         auf PIN_ALTERNATE_PP_50
SPI2 MISO        auf PIN_ALTERNATE_PP_50
SPI2_MOSI        auf PIN_ALTERNATE_PP_50

und diesen LLD Driver glue code in z.B. ginput_lld_mouse_XXXXXX.h

#ifndef _GINPUT_LLD_MOUSE_BOARD_H
#define _GINPUT_LLD_MOUSE_BOARD_H

static const SPIConfig spicfg = {
    NULL,
  GPIOB,// CS_TP
    12,
    SPI_CR1_BR_2 | SPI_CR1_BR_0,//baud prescaler 64x
};


/**
 * @brief   Initialise the board for the touch.
 *
 * @notapi
 */
static inline void init_board(void) {
  //SPID2.spi->CRCPR=7;//CRC
  spiStart(&SPID2, &spicfg);
}

/**
 * @brief   Check whether the surface is currently touched
 * @return  TRUE if the surface is currently touched
 *
 * @notapi
 */
static inline bool_t getpin_pressed(void) {
  return (!palReadPad(GPIOG, 7));//TP_INT
}
/**
 * @brief   Aquire the bus ready for readings
 *
 * @notapi
 */
static inline void aquire_bus(void) {
  spiAcquireBus(&SPID2);
  spiSelect(&SPID2);
  chThdSleep(10);
}

/**
 * @brief   Release the bus after readings
 *
 * @notapi
 */
static inline void release_bus(void) {
  spiUnselect(&SPID2);
  spiReleaseBus(&SPID2);
}

/**
 * @brief   Read a value from touch controller
 * @return  The value read from the controller
 *
 * params[in] port  The controller port to read.
 *
 * @notapi
 */
static inline uint16_t read_value(uint16_t port) {
    static uint8_t txbuf[3] = {0};
    static uint8_t rxbuf[3] = {0};
    uint16_t ret;

    txbuf[0] = port;

    spiExchange(&SPID2, 3, txbuf, rxbuf);

    ret = (rxbuf[1] << 5) | (rxbuf[2] >> 3);

  return ret;
}

#endif /* _GINPUT_LLD_MOUSE_BOARD_H */


Damit sollte es dann gehen.

Gruss
Michael

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.