mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik S1D13781 über FSMC an STM32F7


Autor: hust (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi

ich versuche es kurz zu fassen:

µC:   STM32F745
LCDC: Epson S1D13781
TFT:  3,5" 24bit RGB

benutzt wird CubeMX und die HAL lib

Der S1D13781 über indirect 8bit mode am FSMC verbunden:
  /** FMC GPIO Configuration
  PE2   ------> FMC_A23   ---> P/C#
  PD14  ------> FMC_D0    ---> DB0
  PD15  ------> FMC_D1    ---> DB1
  PD0   ------> FMC_D2    ---> DB2
  PD1   ------> FMC_D3    ---> DB3
  PE7   ------> FMC_D4    ---> DB4
  PE8   ------> FMC_D5    ---> DB5
  PE9   ------> FMC_D6    ---> DB6
  PE10  ------> FMC_D7    ---> DB7
  PD4   ------> FMC_NOE   ---> RD
  PD5   ------> FMC_NWE   ---> WR
  PD7   ------> FMC_NE1   ---> CS
  */
  // GPIO Parameter: 
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FMC;

FSMC ist folgendermaßen initialisiert:
static void MX_FMC_Init(void)
{
  FMC_NORSRAM_TimingTypeDef Timing;

  /** Perform the SRAM1 memory initialization sequence
  */
  hsram1.Instance       = FMC_NORSRAM_DEVICE;
  hsram1.Extended       = FMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank       = FMC_NORSRAM_BANK1;
  hsram1.Init.DataAddressMux     = FMC_DATA_ADDRESS_MUX_DISABLE;
  hsram1.Init.MemoryType     = FMC_MEMORY_TYPE_SRAM;
  hsram1.Init.MemoryDataWidth     = FMC_NORSRAM_MEM_BUS_WIDTH_8;
  hsram1.Init.BurstAccessMode     = FMC_BURST_ACCESS_MODE_DISABLE;
  hsram1.Init.WaitSignalPolarity   = FMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram1.Init.WaitSignalActive     = FMC_WAIT_TIMING_BEFORE_WS;
  hsram1.Init.WriteOperation     = FMC_WRITE_OPERATION_ENABLE;
  hsram1.Init.WaitSignal     = FMC_WAIT_SIGNAL_DISABLE;
  hsram1.Init.ExtendedMode     = FMC_EXTENDED_MODE_DISABLE;
  hsram1.Init.AsynchronousWait     = FMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram1.Init.WriteBurst     = FMC_WRITE_BURST_DISABLE;
  hsram1.Init.ContinuousClock     = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  hsram1.Init.WriteFifo     = FMC_WRITE_FIFO_DISABLE;
  hsram1.Init.PageSize       = FMC_PAGE_SIZE_NONE;
  /* Timing */
  Timing.AddressSetupTime     = 10;
  Timing.AddressHoldTime     = 0;
  Timing.DataSetupTime       = 40;
  Timing.BusTurnAroundDuration     = 0;
  Timing.CLKDivision       = 0;
  Timing.DataLatency       = 0;
  Timing.AccessMode       = FMC_ACCESS_MODE_B;
  if (HAL_SRAM_Init(&hsram1, &Timing, NULL ) != HAL_OK)
  {
    Error_Handler();
  }

  /*Configure GPIO pin : PA8 */
  GPIO_InitStruct.Pin = GPIO_PIN_8;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_2);// 8Mhz
}
mit den Modi und den Timings habe ich schon gespielt.



Daraus ergeben sich folgende Adressen:
volatile char * LCD_COMMAND_ptr = ((char *)  0x60000000);
volatile char * LCD_DATA_ptr   = ((char *) (0x60000000 + ( 1 << 23)));  // RS an pin A23


Laut datenblatt des S1D13781 :
//write : 
*LCD_COMMAND_ptr = (UInt8) addr;
*LCD_COMMAND_ptr = (UInt8)(addr>> 8);
*LCD_COMMAND_ptr = (UInt8)(addr>>16);

*LCD_DATA_ptr = (UInt8) val;
*LCD_DATA_ptr = (UInt8)(val>> 8);

// read
*LCD_COMMAND_ptr = (UInt8) addr;
*LCD_COMMAND_ptr = (UInt8)(addr>> 8);
*LCD_COMMAND_ptr = (UInt8)(addr>>16);
UInt16 Value     = (UInt16)*LCD_DATA_ptr<<0;
       Value    |= (UInt16)*LCD_DATA_ptr<<8;



Jedoch kommt nicht das heraus was im Datenblatt steht
Hat vieleicht jemand den Epson controler am laufen und kann tips geben?
Oder mache ich am FSMC was falsch?

Vielen dank
Grüße

Autor: hust (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ergänzung:


ich habe etwas experimentiert und nun gesehen das er 16bit zugriffe zu 
machen scheint.

bei 3byte adresse und 1byte daten wird der WR pin 2x auf LOW gezogen
sollte aber 4x sein.


scheint so als wäre der zurgiff immernoch auf 16bit...

teste gerade diverse forenbeiträge die ähnliches behandeln
#define LCD_REG              (*((volatile unsigned char *)  0x60000000)) /* RS = 0 */
#define LCD_RAM              (*((volatile unsigned char *) (0x60000000+( 1 << 23)))) /* RS = 1 */

Autor: hust (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ergänzung:

im einzelschritt funktioniert auch das auslesen!
auf dem Oszi ist dann auch der WR pin 4x auf low

Autor: hust (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
niemand eine idee?

Ich weiß momentan auch nicht mehr weiter...

Autor: Hust (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Idee zu später Stunde....

Ich gebe ja 5 Werte aus...
3x Adresse und 2x Daten

2xadressbytes  und er schiebt raus ...
1x Adresse +1x Daten und er schiebt raus
Das letzt datenbTe wird verschluckt

Das erklärt die 2x Weite



Er arbeitet quasi immer 16bittig

Ich versuche mal 16 Bit Zugriffe und nutze nur die unteren 8 Bit.

Autor: hust (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bringt leider nichts ...

niemand eine idee?

es kann doch nicht so schwer sein da 3/5 bytes aus dem FSMC zu 
schieben...

Autor: hust (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
caches !!!


LCD_REG8   = (uint8_t)(addr>> 0);
__DSB();
LCD_REG8   = (uint8_t)(addr>> 8);
__DSB();
LCD_REG8   = (uint8_t)(addr>> 16);
__DSB();

jetzt sieht es zumindest brauchbar aus ... ob das funzt weiß ich noch 
nicht

Autor: hust (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so funzt das erstmal


auch über DMA schent es keine Probleme zu machen


das problem tritt nur auf wenn man die CPU async zur peripherie betreibt
und caches an hat.
dann verhaspelt er sich


bild läuft !!

ende

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.