Forum: Mikrocontroller und Digitale Elektronik dsPIC33F SPI Problem


von Thomas (Gast)


Lesenswert?

Ich programmiere hier mit einem EXPLORER16 Evaluationboard einen 
dsPIC33F256GP710.

Sobald ich in den SPI1BUF schreibe, ändert sich nichts.
Im Debugger steht weiterhin 0x0000 drin, obwohl ich 0xFFFF reinschreibe.

Die anderen Register SPI1CON1 SPI1CON2 sehen normal aus.
Ich initialisiere das Modul im Master Mode, stelle die Clockphase und 
-pegel ein, die Taktfrequenz auch und versuche was zu senden, SPI1BUF 
bleibt bei 0x0000 ?

Vielleicht weiß jemand Rat ?

von Benedikt K. (benedikt)


Lesenswert?

Thomas wrote:
> Ich programmiere hier mit einem EXPLORER16 Evaluationboard einen
> dsPIC33F256GP710.
>
> Sobald ich in den SPI1BUF schreibe, ändert sich nichts.
> Im Debugger steht weiterhin 0x0000 drin, obwohl ich 0xFFFF reinschreibe.

Das ist doch normal. SPIxBUF ist auch kein normales Register, sondern 
wird vom Sender/Empfänger gemeinsam genutzt.

von Thomas (Gast)


Lesenswert?

Hallo,

aber irgendwie bliebt der Conroller immer hier in der Schleife hängen:

SPI1BUF = 0xFFFF;        //Send Dummy
while(IFS0bits.SPI1IF==0);      //Wait until data is received

von Benedikt K. (benedikt)


Lesenswert?

Versuchs mal damit:
while (!SPI1STATbits.SPIRBF);

Wenn das nicht funktioniert, dann hast du in den SPI1CON Registern 
irgendwas falsch eingestellt.

von Thomas (Gast)


Lesenswert?

Hallo,

das habe ich vorher probiert, aber auch ohne Erfolg.

Hier meine Einstellungen:

[C]void init_SPI(void)      //Init SPI
{
  IFS0bits.SPI1IF = 0;     //Clear the Interrupt Flag
  IEC0bits.SPI1IE = 0;     //disable the Interrupt

  SPI1CON1bits.DISSCK = 0;  //Internal Serial Clock is Enabled.
  SPI1CON1bits.DISSDO = 0;  //SDOx pin is controlled by the module.
  SPI1CON1bits.MODE16 = 1;  //Communication is word-wide (16 bits)
  SPI1CON1bits.SMP = 0;     //Input Data is sampled at the
                                          middle of data output time.
  SPI1CON1bits.CKE = 1;


  SPI1CON1bits.CKP = 1;     //Idle state for clock is low
          //active  state is high
  SPI1CON1bits.SPRE = 7;    // Serial Clock = 4*Tcy (4MHz)
  SPI1CON1bits.PPRE = 2;

  SPI1CON1bits.MSTEN = 1;     //Master Mode Enabled
  SPI1STATbits.SPIEN = 1;     //Enable SPI Module
}[\C]

von Benedikt K. (benedikt)


Lesenswert?

Das sollte eigentlich alles passen.

Meine Initialisierung sieht so aus:
  SPI1CON1bits.CKE=1;
  SPI1CON1bits.MSTEN=1;  // Master
  SPI1CON1bits.SPRE=0;  // Divide by 8
  SPI1CON1bits.PPRE=0;  // Divide by 64
  SPI1CON2 = 0x0000;
  SPI1STAT = 0x8000;

Und die Übertragung so:
  SPI1BUF = data;
  while (!SPI1STATbits.SPIRBF);
  data = SPI1BUF;

Dies funktioniert bei mir.

von Thomas (Gast)


Lesenswert?

Benutzt du auch das Explorer 16 Board ?

von Benedikt K. (benedikt)


Lesenswert?

Normalerweise nicht, aber gestern habe ich zufällig den Code auf diesem 
ausprobiert, und er lief.

von Thomas (Gast)


Lesenswert?

Hallo,

wenn ich das gleiche im MPLAB Simulator mache, dann wird aber SPI1BUF 
beim schreiben aktualisiert !

Und noch was. Ich habe ständig den INT0 Interrupt ?
Das IF0 Bit ist gesetzt.
Der Clock (SCLK1) ist mit INT0 auf dem selben Pin.

Aber warum wird SPI1BUF nicht geschrieben ?
Ich verstehe es nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.