- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 21

Thema: EA DOMG-163 an SPI - Ich krieg die Krise

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    Hi,
    also zur HAL kann ich nicht viel sagen. Wenn ich hier einen stm32f446er mit SPI2 in CubeMX auswähle und den Transfer-Master-Mode mit Soft Nss eingebe, dann werden MOSI und CLK mit Alternate Function generiert?!? -> Keine Ahnung warum das bei mir anders ist als bei dir?!?

    Zu deinem Code:
    TXE und BSY verhalten sich genau umgekehrt wie du es benutzt und die ziehst die CS Leitung nicht runter bevor du schreibst:
    Code:
    void SndBfhlLCD(char byte){
      SPI2->CR1 |= SPI_CR1_SPE;                     //SPI aktivieren
      GPIOC->BSRR |= GPIO_BSRR_BR_2;                //RS-Pin zurücksetzen
      GPIOC->BSRR |= GPIO_BSRR_BR_3;            // CS runterziehen
    
      while ( ! (SPI2->SR & SPI_SR_TXE)){                //Warten bis Transmit-Register frei ist
      }
      SPI2->DR = byte;                              //Byte senden
      while ( ! (SPI2->SR & SPI_SR_TXE)){                //Warten bis Transmit-Register frei ist
      }
      while (SPI2->SR & SPI_SR_BSY){             //Warten bis laufende Übertragung abgeschlossen ist
      }
    
      GPIOC->BSRR |= GPIO_BSRR_BS_3;            // CS high
      GPIOC->BSRR |= GPIO_BSRR_BS_2;                //RS-Pin high
      SPI2->CR1 &= ~SPI_CR1_SPE;                     //SPI deaktivieren
    }
    Hoffe das das jetzt klappt.
    Hab heute auch zwei Stunden nach genau einem Bit gefahndet und kann deinen Ärger verstehen.

    Gruss botty

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Autsch...da werd ich TXE und BSY mal noch fix drehen. Und CS natürlich einbauen. Das Oszi hab ich erst am Mo wieder zur Verfügung, falls das LCD die Arbeit noch verweigert (wovon ich sicherheitshalber mal ausgehe).

    - - - Aktualisiert - - -

    Nachtrag:
    Der STM32 kommt im Debug-Mode immer noch nicht aus der zweiten While-Schleife. Wenn ich einen Haltepunkt am Ende der Funktion setze, wird dieser nie erreicht -> Endlosschleife.

    Was muß denn gemacht werden, um ein Peripherie-Element wie die SPI zu nutzen? Meines Wissens ist dies:
    -Takt für Pins aktivieren
    -Takt für Peripherie aktivieren
    -Pins konfigurieren
    -Peripherie konfigurieren
    -> Ferig

    Hab ich was übersehen in dieser Liste?

    Noch was...was macht eigentlich die SystemInit() ? (Hab die grad mal am Anfang des Programms aufgerufen, ändert aber auch nichts.)

    Code:
    void SndBfhlLCD(char byte){
      SPI2->CR1 |= SPI_CR1_SPE;                     //SPI aktivieren
      GPIOC->BSRR |= GPIO_BSRR_BR_2;                //RS-Pin zurücksetzen
      GPIOC->BSRR |= GPIO_BSRR_BR_3;                //CS runterziehen
    
      while (!(SPI2->SR & SPI_SR_TXE)){             //Warten bis Transmit-Register frei ist
      }
      SPI2->DR = byte;                              //Byte senden
      while (!(SPI2->SR & SPI_SR_TXE)){             //Warten bis Transmit-Register frei ist
      }
      while (SPI2->SR & SPI_SR_BSY){                //Warten bis laufende Übertragung abgeschlossen ist
      }
      GPIOC->BSRR |= GPIO_BSRR_BS_3;                //CS high
      GPIOC->BSRR |= GPIO_BSRR_BS_2;                //RS-Pin high
      SPI2->CR1 &= ~SPI_CR1_SPE;                    //SPI deaktivieren
      //RS NICHT toggeln
    }

    Ich wünsche an dieser Stelle mal ein schönes Wochenende

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Hallo,
    ich habe das Display auch schon in Gang gebracht, aber im 4 Bit Modus.
    Das lief auch SEHR schwer anfangs....
    Hast Du den Kontrast richtig eingestellt und die Kondensatoren dran.
    Bei der 3,3 Volt Versorgung gibt es wohl eine Follower, der auch eingestellt werden muss.
    Hab auch schonmal ewig gesucht und dann stellte sich heraus, dass ich nur nix gesehen hatte, weil der Kontrast falsch eingestellt war.
    Der CSB und PSB Pin auch richtig ? und nicht vergessen die Datenleitungen, obwohl nicht benutzt festzulegen..

    Ich weiss nicht wie schnell deine Pins toggeln, aber mein Prozessor war zu schnell und ich musste delays einbauen.
    2-3 Mikrosekunden.

    Ganz wichtig war die Initialisierung, da hat jedes "ähnliche" Display seinen Eigenheiten.
    Wobei die DOGM Serie sich doch von anderen Displays unterscheidet
    Zudem gibt es ja auch 2 Instruction Tables, die richtig hin und hergeschaltet werden müssen.

    Am Anfang darf man ja auch nicht das Busy Flag abfrage, weil es noch nicht funktioniert.
    Wie das genau beim SPI Modus läuft, hab ich aber nicht ausprobiert.

    Schau Dir mal die Zeiten an, beim Initialisieren von mir:
    Code:
    /* initialize LCD 4 Bit mode FOSC 380 KHz */
    /* Power Up need ca. 40ms internal Power on reset ST7036 */
        Wait_us(50000);   
    
        LCD_DataOut8(0x30);       /* Function set */
        Wait_us(2000);           /* wait > 1,6ms */
    
        LCD_DataOut8(0x30);       /* Function set */
        Wait_us(50);            /* wait > 26,3 us */
    
        LCD_DataOut8(0x30);       /* Function set */
        Wait_us(50);            /* wait > 26,3 us */
    
    
        LCD_DataOut8(0x20);       /* Function Set  4 BIT DL=0 */
        Wait_us(50);            /* wait > 26,3 us */
    
        /* !!!! erst ab jetzt ist der 4 Bit Modus aktiv */
    
        LCD_WaitBusy();
    
      /* DL = High= 8 Bit  DL=Low = 4 Bit */
        /* N=1=2 Zeilen   N=0=1Zeile */
        LCD_DataOut4(0x29);         /* Function Set 4 Bit N=1 DH=0 IS2=0 IS1=1   DH=1=Double Height*/
        LCD_WaitBusy();
    
        LCD_DataOut4(0x14);    /* BIAS  Intern OSC frequency BS=  1  0    FX=1   */
        LCD_WaitBusy();
    
        LCD_DataOut4(0x78);  /* Contrast set  C3 C2 C1 C0 */
        LCD_WaitBusy();
    
        LCD_DataOut4(0x55);  /* 0x5E Power  Ion=1 Bon=1 C5=1 C4=1 */
        LCD_WaitBusy();
    
        LCD_DataOut4(0x6D); /* Follower control Fon Rab2 Rab1 Rab0  */
        LCD_WaitBusy();
    
    /*    LCD_DataOut4(0x28); */ /* switch back to instruction table 0 */
    /*    LCD_WaitBusy();   */
    
         LCD_DataOut4(0x0F);  /* Display On/off  D=  C=  B=  */
        LCD_WaitBusy();
    
      LCD_DataOut4(0x01);  /* Clear Display, Cursor home  */
        LCD_WaitBusy();
    
        LCD_DataOut4(0x06);  /* Cursor auto increment  Entry Mode set ID=   S=   cursor move dir */
        LCD_WaitBusy();
    Geändert von Siro (11.11.2016 um 22:05 Uhr)

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Hallo Siro

    Erstmal danke...aber momentan läuft die SPI noch nichtmal. Ich komm dann aber gern auf deinen Code zurück (in V2 werd ich definitiv die Ansteuerung im 4- oder 8-Bitmodus nutzen, nie wieder LCD über SPI, grmpf).

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    SPI1 mit SPL für einen 411RE, sollte aber Pin-Kompatibel mit dem 446 sein. Für CS muss noch ein Pin konfiguriert werden.
    Code:
    #include "SPI.h"
    
    
    void Spi_Init(SPI_TypeDef *SPIx)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        SPI_InitTypeDef  SPI_InitStructure;
    
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    
        // Periph clock enable
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
    
        // Configure SPI pins: SCK, MOSI
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    
        // Configure pins: MISO
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    
        // Reset SPI Interface
        SPI_I2S_DeInit(SPIx);
    
        // SPI configuration
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial = 7;
        SPI_Init(SPIx, &SPI_InitStructure);
    
        SPI_CalculateCRC(SPIx, DISABLE);
    
        // Enable the SPI
        SPI_Cmd(SPIx, ENABLE);
    }
    
    uint8_t Spi_ReadByte(SPI_TypeDef *SPIx)
    {
        return Spi_WriteByte(SPIx, 0xFF);
    }
    
    uint8_t Spi_WriteByte(SPI_TypeDef *SPIx, uint8_t _data)
    {
        // Loop while DR register is not empty
        while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
    
        // Send byte through the SPIx peripheral
        SPI_I2S_SendData(SPIx, _data);
    
        while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
    
        // Return the byte read from the SPI bus
        return (uint8_t)SPI_I2S_ReceiveData(SPIx); }
    mfg

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    Hi again,

    die Zeile in der Initialisierung stimmt nicht
    Code:
      RCC->AHB1ENR |= RCC_APB1ENR_SPI2EN;       //Takt für SPI2 aktivieren
    sondern muss wohl so lauten
    Code:
      RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;       //Takt für SPI2 aktivieren
    Gruss botty

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Hätt ich schreiben sollen..die hab ich am Freitag schon gefunden (und behoben). Ich hatte gehofft das wäre es bereits gewesen, aber irgend so ein kleiner verfluchter Fehlerteufel muß da noch drin sein. Ich hab den Rechner mit dem Projekt grad nicht an, ich stell morgen nochmal die letzte Codeversion rein.

Ähnliche Themen

  1. noch ne seltsame Rechenfunktion - ich krieg die Krise!
    Von dl1akp im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 17.08.2008, 20:44
  2. wie, krieg ich die hex auf dem board
    Von Sp666dy im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 25.02.2008, 07:34
  3. Menü - ich krieg die Krise!!!
    Von dl1akp im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 18.11.2007, 14:41
  4. Wo krieg ich BASCOM Basic her?
    Von zwerg1 im Forum AVR Hardwarethemen
    Antworten: 23
    Letzter Beitrag: 13.02.2007, 22:34
  5. [ERLEDIGT] Wo krieg ich Baupläne her
    Von Aramis im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 05.09.2004, 10:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress