- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 3 von 3

Thema: dsPIC33 - SPI: Receivebuffer Full Flag (SPIxRBF) kommt nicht!

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    12.01.2008
    Ort
    Bensheim
    Alter
    43
    Beiträge
    12

    Frage dsPIC33 - SPI: Receivebuffer Full Flag (SPIxRBF) kommt nicht!

    Hi,
    Ich hänge seit 2 Tagen an dem Problem, dass das SPI2RBF Flag nicht kommt.
    Wenn ich Daten übertrage verwende ich Dieses, um zu überprüfen, ob alle Daten aus dem SR ausgegeben wurden - und zur Anzeige, dass neue Daten eingegangen sind.
    So, wie das auch in etlichen Beispielen im Web zu finen ist, und so, wie ich das auch schon immer mache...

    Das was sich geändert hat ist der Controller: dsPIC33EP512GM710 Dieser hat nun den einen "Enhanced Buffer mode", den ich aber nicht verwende - also eigentlich alles so wie immer!

    Das komische ist, dass das Flag nur bei SPI2 und SPI3 nicht funktioniert... mit SPI1 kommt das Flag. Unterschied zwischen den Modulen ist, dass SPI1 Fest verdrahtet ist und nicht gemappt werden kann.

    Hat das schonmal jemand gehabt? oder ne Idee? Vielen dank im Voraus!

    PS: Daten / Clock gehen übrigens raus - meine SSRs kann ich damit beschreiben (wenn ich das RBF Flag nicht abfrage und die Daten einfach raussschicke). Nur um andere Bauteile abzufragen die am selben SPI hängen müsste ich dann auch lesen können...

    Hier mein code:

    defines der Register:
    Code:
    #ifndef __SSR_H
    #define __SSR_H
    #include "pinIO.h"
    
    // SSR Length
    #define SSR_TX_LEN 6
    #define SSR_RX_LEN 5
    
    
    // SPI Port to use
    #define SSR_SPI2 //1,2 oder 3
    
    // PINS to latch input/output to/from shift registers
    #define SSR_LATCH_IN     pOUT_SSR_LATCH_IN //TODO
    #define SSR_LATCH_OUT    pOUT_SSRO_CS
    
    //
    #ifdef SSR_SPI1
        #define SSR_SPITBF  SPI1STATbits.SPITBF
        #define SSR_SPIRBF  SPI1STATbits.SPIRBF
        #define SSR_SPIBUF  SPI1BUF
    #endif
    
    #ifdef SSR_SPI2
        #define SSR_SPITBF  SPI2STATbits.SPITBF
        #define SSR_SPIRBF  SPI2STATbits.SPIRBF
        #define SSR_SPIBUF  SPI2BUF
    #endif
    
    #ifdef SSR_SPI3
        #define SSR_SPITBF  SPI3STATbits.SPITBF
        #define SSR_SPIRBF  SPI3STATbits.SPIRBF
        #define SSR_SPIBUF  SPI3BUF
    #endif
    
    
    void ssrOutputUpdate(void);
    void ssrOutputClear(void);
    void ssrWrite(unsigned char * ,char);
    void ssrRead(unsigned char * ,char);
    
    #endif
    Hier die Modul-Konfig:
    Code:
    void SYSTEM_Init(void)
    {
        // Configure Oscillator to operate the device at 120Mhz = 60MIPS
        // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
        // Fosc= 10M*48/(2*2)=120Mhz for 10M input clock
        PLLFBD = 46;                        // M=48
        CLKDIVbits.PLLPRE = 0;              // N1=2
        CLKDIVbits.PLLPOST = 0;             // N2=2
        
        __builtin_write_OSCCONH(0x03);      // Request Clockswitch
        __builtin_write_OSCCONL(OSCCON | 0x01);
      
        while(OSCCONbits.COSC!=0b011) {};   // Wait until crystal is active
        while(OSCCONbits.LOCK!=1) {};       // wait until PLL locks
    
        RCONbits.SWDTEN = 0;                // Watchdog enable / disable  //TODO
    
        INTCON1bits.NSTDIS=1;               // disable nesting interrupts
    
    
        // init SPI Modules
        //SPI1: Profinet IO
        SPI1CON1bits.PPRE=0b01;         // 16:1 ==> ???? kBit   //TODO
        SPI1CON1bits.MSTEN=1;           // Master mode
        SPI1CON1bits.CKP=0;             // Clock polarity: rising edge
        IFS0bits.SPI1IF=0;              // clear IR flag
        IEC0bits.SPI1IE=0;              // Interrupts OFF
        SPI1STATbits.SPIEN=1;           // module enable
        // SPI 1 no pin mapping available direct IO
    
    
        //SPI2: RTDs, digital outputs, shift-registers  
        RPOR10bits.RP118R =  0b01000;    //map out SDO2
        RPOR11bits.RP120R =  0b01001;    //map out SCK2 
        RPINR22bits.SDI2R=   119;        //map in SDI2
        
        SPI2CON1bits.PPRE=0b01;         // 16:1 ==> ???? kBit   //TODO
        SPI2CON1bits.MSTEN=1;           // Master mode
        SPI2CON1bits.CKP=0;             // Clock polarity: rising edge
        IFS2bits.SPI2IF=0;              // clear IR flag
        IEC2bits.SPI2IE=0;              // Interrupts OFF
        SPI2STATbits.SPIEN=1;           // module enable
        
        
        // SPI3 ySD Card              
    //    RPOR10bits.RP118R =  0b011111;    //map out SDO3
    //    RPOR11bits.RP120R =  0b100000;    //map out SCK3 
    //    RPINR29bits.SDI3R=   119;         //map in SDI3
    //
    //
    //    SPI3CON1bits.PPRE=0b01;         // 16:1 ==> ???? kBit   //TODO
    //    SPI3CON1bits.MSTEN=1;           // Master mode
    //    SPI3CON1bits.CKP=0;             // Clock polarity: rising edge
    //    IFS5bits.SPI3IF=0;              // clear IR flag
    //    IEC5bits.SPI3IE=0;              // Interrupts OFF
    //    SPI3STATbits.SPIEN=1;           // module enable
    
    }
    Und Hier eine Funktion, die Daten überträgt:
    Code:
    void ssrWrite(unsigned char * d,char len)
    //*****************************************************************************
    //  write serial shift register
    // ------------------------------------------------------------------------
    // Inputs:  - data-pointer, len to write
    // Outputs: - 
    //*****************************************************************************
    {
        unsigned char temp;
        unsigned char i;
        temp=SSR_SPIBUF; 
        for (i=0; i<len;i++)
        {
            
                while(SSR_SPITBF);
                SSR_SPIBUF=d[i];
             
                while(!SSR_SPIRBF); Hier bleibts hängen, wenn SPI2 oder 3 verwendet wird!!
                temp=SSR_SPIBUF; 
        }
    
        SSR_LATCH_OUT=1;
        delayUs(2);
        SSR_LATCH_OUT=0;
    }
    *** Theorie und Praxis - Zwei Welten prallen aufeinander... ***

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Hi, marcemich.

    Fachlich kann ich nichts beitragen. Jedoch möchte ich die Chip-spezifischen Errata-Veröffentlichungen von Microchip erwähnen, die ja gerne mal aus dem Blick geraten.

    Beste Grüße aus der (gefühlten) Minderheit der Microchip-User.
    RoboHolIC.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    12.01.2008
    Ort
    Bensheim
    Alter
    43
    Beiträge
    12
    Hi RoboHolIC!

    Sorry wegen meiner verspäteten Antwort. Ich hatte irgendwie ein Problem mit meinem Passwort und wurde bei der Anmeldung Hier immer auch Irgendeine Youtubeseite umgeleitet, weshalb ich es dann immer abgebrochen habe...

    Die erratas habe ich gelesen. Hier gibt es keinen konkreten Hinweis auf die Buffer Full Flags, allerdings ein Problem mit dem Versatz des EA Schieberegisters um ein Bit, wenn man nicht eine besondere Reihenfolge bei der Initialisierung beachtet. Das könnte natürlich dazu führen, dass der Buffer nie voll ist...
    Es gibt keine hinweise dazu, ob das vom gewählten SPI Modul abhängig ist ( SPI1 funktioniert ja... )
    Ich musste eine Pause bei der Entwicklung einlegen - werde das aber in den nächsten Tagen testen.

    Vielen Dank für Deinen Hinweis und viele Grüße

    Marc
    *** Theorie und Praxis - Zwei Welten prallen aufeinander... ***

Ähnliche Themen

  1. [NodeMCU V0.9]HtpClient kommt nicht in's W-LAN
    Von ManniP im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 2
    Letzter Beitrag: 23.04.2017, 15:34
  2. Timer triggert DMA, aber Overflow Flag wird nicht zurück gesetzt
    Von erik_wolfram im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 22.08.2014, 13:33
  3. Anfänger kommt mit Atmel328 nicht klar
    Von ulli328 im Forum Assembler-Programmierung
    Antworten: 6
    Letzter Beitrag: 07.11.2011, 23:07
  4. Anfänger kommt nicht weiter.
    Von Rick07 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 23.02.2008, 17:10
  5. 20x4Display: Abfrage "Busy-Flag" reagiert nicht
    Von Dolfo im Forum Assembler-Programmierung
    Antworten: 0
    Letzter Beitrag: 17.10.2007, 22:56

Stichworte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress