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