mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI Verbindung mit dem AD7843


Autor: Nils Hesse (irrenhaus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche gerade verzweifelt einen AD7843 per SPI von einem 
STM32F105V8 aus anzusprechen, um das Touch-Panel von dem MI0283QT-2 
Display auszulesen.

An sich sollte die Kommunikation mit dem AD7843 ja sehr simpel sein.
Doch leider reagiert dieser leider auf nichts, d.h., es kommen keine 
Daten an die ich auslesen könnte.

Mit einem Oszilloskop kann ich leider nicht ran, da weder ich eines 
besitze noch kenne ich jemanden der eines besitzt. Also sind meine 
Möglichkeiten auf Software und Multimeter beschränkt. Die Pins haben 
alle Verbindung zu den Pads & zum Controller, keine Kurzschlüsse, die CS 
Line wird so wie es sein soll auf LOW gezogen.

Das ganze läuft unter FreeRTOS und am SPI2 hängt außerdem noch eine 
SD-Karte. Das Display selbst hängt am SPI1.

Hier mein Code:
u8 touchX = 0;
u8 touchY = 0;

void touchTask(void *params) {
  SPI_InitTypeDef SPI_SPI2_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

  GPIO_InitTypeDef GPIOSPI2_InitStructure;
  GPIOSPI2_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;  //13 = SPI2_SCK, 14 = SPI2_MISO, 15 = SPI2_MOSI
  GPIOSPI2_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIOSPI2_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIOSPI2_InitStructure);

  GPIOSPI2_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIOSPI2_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIOSPI2_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIOSPI2_InitStructure);

  SPI_SPI2_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_SPI2_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_SPI2_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_SPI2_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_SPI2_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_SPI2_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_SPI2_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
  SPI_SPI2_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

  SPI_Init(SPI2, &SPI_SPI2_InitStructure);

  SPI_Cmd(SPI2, ENABLE);

  GPIO_SetBits(GPIOE, GPIO_Pin_10);

  delay_ms(4000);

  for(;;) {
    GPIO_ResetBits(GPIOD, GPIO_Pin_8);
    /* Differential read of X coordinate */
    SPI_I2S_SendData(SPI2, 0x9B); //S[1]A2[0]A1[0]A0[1]MODE[1]SER/DFR[0]PD1[1]PD0[1]
    sprintf(dbgMessage, "0x9B sent");

    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
    sprintf(dbgMessage, "receiving");

    touchX = SPI_I2S_ReceiveData(SPI2);
    sprintf(dbgMessage, "X received");

    /* Differential read of Y coordinate */
    SPI_I2S_SendData(SPI2, 0xDB); //S[1]A2[1]A1[0]A0[1]MODE[1]SER/DFR[0]PD1[1]PD0[1]
    while((SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET));
    touchY = SPI_I2S_ReceiveData(SPI2);

    GPIO_SetBits(GPIOD, GPIO_Pin_8);
  }
}

GPIOB, GPIOD, und GPIOE wurden an anderer Stelle bereits mit dem Takt 
versorgt. PE10 wird rein vorsichtshalber auf HIGH gelegt, damit ich 
nicht irgendwo Blödsinn gemacht habe, und die SD Karte doch noch in der 
Leitung hängt und es versaut.

Mein Systemtakt ist 72MHz, d.h. der SPI2 Clock ist 72MHz/128 = 562.5KHz. 
Aber auch ein ändern dieses Taktes (schneller und langsamer) hat nichts 
gebracht.

Die Ausführung bleibt immer an der Stelle hängen, wo auf einen Input am 
MISO Pin gewartet wird, was für mich heißt, dass der AD7843 nichts 
sendet.

DIN des AD7843 hängt an MOSI und DOUT an MISO.

Sieht evtl. jemand im obigen Code einen Fehler, oder hat eine Idee woran 
das liegen könnte?

Über ein eventuelles Initialisierungskommando oder ähnliches habe ich im 
Datenblatt des Touchcontrollers nichts gefunden.

Ich würde mich über eine kleine Hilfestellung sehr freuen.

Vielen Dank

Nils

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mein Systemtakt ist 72MHz, d.h. der SPI2 Clock ist 72MHz/128 = 562.5KHz.
> Aber auch ein ändern dieses Taktes (schneller und langsamer) hat nichts
> gebracht.

Da du keinen Oszi hast wuerde es aber vielleicht etwas bringen wenn du 
mal den Takt auf 0.1Hz reduzierst und an den relevanten Leitungen eine 
2mA LED anbringst....

Olaf

Autor: gk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An welchem Pin hängt den der /CS (Pin 15 des AD7843) und wie wird der 
angesteuert ?
gk

Autor: Nils Hesse (irrenhaus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich werds mal versuchen mit ner LED, verspreche mir allerdings keinen 
Erfolg, da die Pin- & Leiterbahnabstände doch sehr klein sind (QSOP16 
Gehäuse des AD7843, 10mil Leiterbahnen mit 8mil Abstand...).

Der /CS Pin des AD7843 hängt an PD8 und wird durch das erste
GPIO_ResetBits(GPIOD, GPIO_Pin_8);
in der Schleife auf Low (Chip aktiv) gezogen bzw. durch das letzte
GPIO_SetBits(GPIOD, GPIO_Pin_8);
wieder deaktiviert.

[edit]
Was mir gerade einfällt: Im Datenblatt steht, dass der ADC und das 
Senden vom Chip zum uC als Taktquelle die SPI SCK Leitung nutzt.
Nun weiß ich leider nicht wie das ist: Könnte es sein, dass der STM32 
nach dem Senden von Daten keinen Takt mehr auf die SCK Leitung legt?

Das hieße, dass ich sende und der AD7843 dann keinen Arbeitstakt mehr 
hat...
[/edit]

Vielen Dank schonmal
Grüße
Nils

Autor: gk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also prinzipielle Fehler sehe ich keine, d.h es könnte an der 
Initialisierung des STM32 liegen, den ich nicht kenne. Als Master sollte 
der zunächst die Sendebytes raustackern und mit dem selben Takt die 
Empfangsbytes einlesen. Vielleicht muss man die Portpins noch irgendwie 
konfigurieren, oder es liegt halt generell noch an der Initialisierung 
des STM.

gk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.