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;
}