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