Forum: Mikrocontroller und Digitale Elektronik STM32 XPT2046 SPI


von Phoenix89 (Gast)


Lesenswert?

Hallo,

ich "experimentiere" das erste mal mit der HAL-Bibliothek für STM32.
(Dies soll kein Thread für das für und wieder der HAL-Bibliothek 
werden!)


Hardware: STM32F407VET6 + ILI9325 (Grafikdisplay) + XPT2046 
(Touchcontroller).

Ich habe ein Problem mit dem lesen vom SPI Bus des XPT2046. Mit einem 
LogicAnalyzer sieht es auf dem Bus so aus wie ich es erwarte (/CC ist 
low, Clock tut, Datenänderungen bei negativer Flanke). 1 Lesevorgang 
entsprechen 6us.

Problem:
Der Befehl "HAL_SPI_Receive(..)" schreibt in die Variable "temp" einfach 
nur 0, obwohl auf MISO was los ist..
1
static int RD_AD(void)  
2
{ 
3
  unsigned short buf;
4
  uint8_t temp = 20; // wahllos auf einen Wert != 0
5
6
  HAL_SPI_Receive(&HSPI2,&temp,1,1); 
7
                     // temp = 0, warum?
8
  buf=temp<<8;
9
10
  HAL_SPI_Receive(&HSPI2,&temp,1,1);
11
12
  buf |= temp; 
13
  buf>>=3; 
14
  buf&=0xfff; 
15
  return buf; 
16
}

Initialisierung:
1
void TP_Init(void) 
2
{ 
3
  GPIO_InitTypeDef GPIO_InitStruct;
4
5
  __HAL_RCC_SPI2_CLK_ENABLE();
6
7
  /**SPI2 GPIO Configuration
8
  PB12     ------> SPI2_NSS
9
  PB13     ------> SPI2_SCK
10
  PB14     ------> SPI2_MISO
11
  PB15     ------> SPI2_MOSI
12
  */
13
14
  GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
15
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
16
  GPIO_InitStruct.Pull = GPIO_NOPULL;
17
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
18
  GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
19
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
20
21
  GPIO_InitStruct.Pin = GPIO_PIN_14;
22
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
23
  GPIO_InitStruct.Pull = GPIO_PULLUP;
24
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
25
  GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
26
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
27
28
  GPIO_InitStruct.Pin = GPIO_PIN_12;
29
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
30
  GPIO_InitStruct.Pull = GPIO_NOPULL;
31
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
32
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
33
34
  HAL_GPIO_WritePin(T_CS_Port, T_CS_PIN, GPIO_PIN_SET);
35
36
  SPI_Init();
37
}
1
static void SPI_Init(void) 
2
{ 
3
4
  /* SPI2 parameter configuration*/
5
  HSPI2.Instance = SPI2;
6
  HSPI2.Init.Mode = SPI_MODE_MASTER;
7
  HSPI2.Init.Direction = SPI_DIRECTION_2LINES;
8
  HSPI2.Init.DataSize = SPI_DATASIZE_8BIT;
9
  HSPI2.Init.CLKPolarity = SPI_POLARITY_LOW;
10
  HSPI2.Init.CLKPhase = SPI_PHASE_1EDGE;
11
  HSPI2.Init.NSS = SPI_NSS_SOFT;
12
  HSPI2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
13
  HSPI2.Init.FirstBit = SPI_FIRSTBIT_MSB;
14
  HSPI2.Init.TIMode = SPI_TIMODE_DISABLE;
15
  HSPI2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
16
  HSPI2.Init.CRCPolynomial = 10;
17
}

Jemand eine Idee? - Übersehe ich etwas?

PS: bekommt ihr auch einen "unexpected error" im Forum der ST Community 
Seite?

von Dr. Sommer (Gast)


Lesenswert?

Phoenix89 schrieb:
> GPIO_InitStruct.Pin = GPIO_PIN_14;
>   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

Auch MISO muss auf Alternate Function konfiguriert werden, nicht als 
GPIO-input.

von Phoenix89 (Gast)


Lesenswert?

Vielen Dank! - war mir fast klar, dass es so ein einfacher Fehler ist.

Ich habe noch einen weiteren Fehler im Code oben gefunden:

HAL_SPI_Receive(&HSPI2,&temp,1,1); sendet das was in der Variable "temp" 
steht als Dummy Werte über den SPI-Bus. Das kann dazu führen, dass der 
XPT2046 dies als Befehl interpretiert und Murks macht. Es reicht, wenn 
vor dem Receive Befehl die Variable "temp" einfach wieder auf 0 gesetzt 
wird.

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.