Forum: Mikrocontroller und Digitale Elektronik SPI Verbindung mit dem AD7843


von Nils H. (irrenhaus)


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:
1
u8 touchX = 0;
2
u8 touchY = 0;
3
4
void touchTask(void *params) {
5
  SPI_InitTypeDef SPI_SPI2_InitStructure;
6
7
  RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
8
9
  GPIO_InitTypeDef GPIOSPI2_InitStructure;
10
  GPIOSPI2_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;  //13 = SPI2_SCK, 14 = SPI2_MISO, 15 = SPI2_MOSI
11
  GPIOSPI2_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
12
  GPIOSPI2_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
13
  GPIO_Init(GPIOB, &GPIOSPI2_InitStructure);
14
15
  GPIOSPI2_InitStructure.GPIO_Pin = GPIO_Pin_8;
16
  GPIOSPI2_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
17
  GPIOSPI2_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
18
  GPIO_Init(GPIOD, &GPIOSPI2_InitStructure);
19
20
  SPI_SPI2_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
21
  SPI_SPI2_InitStructure.SPI_Mode = SPI_Mode_Master;
22
  SPI_SPI2_InitStructure.SPI_DataSize = SPI_DataSize_8b;
23
  SPI_SPI2_InitStructure.SPI_CPOL = SPI_CPOL_Low;
24
  SPI_SPI2_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
25
  SPI_SPI2_InitStructure.SPI_NSS = SPI_NSS_Soft;
26
  SPI_SPI2_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
27
  SPI_SPI2_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
28
29
  SPI_Init(SPI2, &SPI_SPI2_InitStructure);
30
31
  SPI_Cmd(SPI2, ENABLE);
32
33
  GPIO_SetBits(GPIOE, GPIO_Pin_10);
34
35
  delay_ms(4000);
36
37
  for(;;) {
38
    GPIO_ResetBits(GPIOD, GPIO_Pin_8);
39
    /* Differential read of X coordinate */
40
    SPI_I2S_SendData(SPI2, 0x9B); //S[1]A2[0]A1[0]A0[1]MODE[1]SER/DFR[0]PD1[1]PD0[1]
41
    sprintf(dbgMessage, "0x9B sent");
42
43
    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
44
    sprintf(dbgMessage, "receiving");
45
46
    touchX = SPI_I2S_ReceiveData(SPI2);
47
    sprintf(dbgMessage, "X received");
48
49
    /* Differential read of Y coordinate */
50
    SPI_I2S_SendData(SPI2, 0xDB); //S[1]A2[1]A1[0]A0[1]MODE[1]SER/DFR[0]PD1[1]PD0[1]
51
    while((SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET));
52
    touchY = SPI_I2S_ReceiveData(SPI2);
53
54
    GPIO_SetBits(GPIOD, GPIO_Pin_8);
55
  }
56
}

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

von Olaf (Gast)


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

von gk (Gast)


Lesenswert?

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

von Nils H. (irrenhaus)


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
1
GPIO_ResetBits(GPIOD, GPIO_Pin_8);
in der Schleife auf Low (Chip aktiv) gezogen bzw. durch das letzte
1
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

von gk (Gast)


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

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.