Forum: Mikrocontroller und Digitale Elektronik PIC32 Problem mit SPI - SDI Port


von Martin M. (ats3788)


Angehängte Dateien:

Lesenswert?

PIC32 Problem mit SPI - SDI Port

PIC32MRX270F256D

Hallo
Ich ärgere mich mit SPI und PIC32 herum.
Gott sei dank habe ich ein Oszi und
dabei ist mir aufgefallen, das die SDO Signale vom Slave
richtig ausgegeben werden nur mein In Port
verfälscht diese.
Manchmal funktioniert es auch ohne Probleme,
also Kann SDI und SDO NICHT vertauscht sein

Man kann ja Ports mappen,
SCK ist fest verdrahtet aber SDI und SDO
sind beschränkt auswählbar.

Ich habe das mit zwei verschiedenen Ports Probiert mit dem gleichen 
Ergebnis.

Ich habe die Leitung zum Sklaven aufgetrennt und messe an Port RB5 0,52V

Ich selber glaube der PIC ist das Problem,
aber vielleicht hat ja jemand eine Idee ?!

Bei SPI1 sieht man den Slave Ausgang aufgetrennt zum Master,
beim zweiten Bild die verbundene Version

: Bearbeitet durch User
von Hellseher (Gast)


Lesenswert?

Wechsle mal R42 in deiner Schaltung aus. Und in Zeile 42 in deinem 
Programm ist auch ein Fehler.

von Martin M. (ats3788)


Angehängte Dateien:

Lesenswert?

Hallo

Was Merkwürdig ist, das der Eingangsport RB5 - SPI
den blauen Graph ergibt.

Wie gesagt die Leitung zum Slave SDO ist aufgetrennt

von Martin M. (ats3788)


Lesenswert?

Hellseher
Ich glaube Du hast das Falsch gepostet.

von Hellseher (Gast)


Lesenswert?

Martin M. schrieb:
> Was Merkwürdig ist, das der Eingangsport RB5 - SPI
> den blauen Graph ergibt.

Die Masse ist ja gar nicht angeschlossen.

von Hellers (Gast)


Lesenswert?

Martin M. schrieb:
> SCK ist fest verdrahtet aber SDI und SDO
> sind beschränkt auswählbar.

Hellseher schrieb:
> Und in Zeile 42 in deinem
> Programm ist auch ein Fehler.

Da liegt dein Problem

von G A H S T (Gast)


Lesenswert?

Hallo,

nur so als Tipp, falls noch nicht geschehen.
Manchmal hilft auch ein Blick ins Errata...
PIC32MRX270F256D ist die Bezeichung richtig so?

von Martin M. (ats3788)


Lesenswert?

Also
Ich habe da wohl ein Verständnis Problem.

Senden  ohne Master SDI funkioniert wunderbar.

Ich habe das mal auf einen PIC32MX150f128b
Probiert mit dem selben Ergebnis.
Ich mache etwas mit dem Master SDI Mapping falsch

  SDI1R = 0b0001;  // Gemappt SDI 1 nach RB5
  RPA2R = 0b0011;  // Gemappt nach SDO1

Laut PORTS I/O Seite 12/10

werde mal im Microchip Forum fragen.

von Arc N. (arc)


Lesenswert?

Da gibt's in den Datenblättern von Microchip meist irgendwo eine Stelle 
in der Beschreibung des PPS... "Remappable peripherals never take 
priority over any analog functions associated with the pin." oder im 
entsprechenden Teil des FRMs: "In order to use port pins for I/O 
functionality with digital modules, like Timers, UARTs, etc., the 
corresponding ANSELx bit must be cleared (or AD1PCFGset). The ANSELx 
register has a default value of 0xFFFF (or 0x0000 for AD1PCFG); 
therefore, all pins that share analog functions are analog (not digital) 
by default."

: Bearbeitet durch User
von hellers II (Gast)


Lesenswert?

Martin M. schrieb:
> Also
> Ich habe da wohl ein Verständnis Problem.
>
> Senden  ohne Master SDI funkioniert wunderbar.
>
> Ich habe das mal auf einen PIC32MX150f128b
> Probiert mit dem selben Ergebnis.
> Ich mache etwas mit dem Master SDI Mapping falsch
>
>   SDI1R = 0b0001;  // Gemappt SDI 1 nach RB5
>   RPA2R = 0b0011;  // Gemappt nach SDO1
>
> Laut PORTS I/O Seite 12/10
>
> werde mal im Microchip Forum fragen.

Hellers schrieb:
> Da liegt dein Problem

immer noch das selbe, poste doch deine komplette Initialisierung!

Arc N. schrieb:
> The ANSELx
> register has a default value of 0xFFFF (or 0x0000 for AD1PCFG);
> therefore, all pins that share analog functions are analog (not digital)
> by default."
Genau so ist es, ANSELB = 0; wäre die Lösung.

von Martin M. (ats3788)


Lesenswert?

Danke für die Antwort

Neeee
ANSELA , ANSELB und ANSELC sind alle 0
also Digital

Den Anfängerfehler mache ich nicht mehr

von Michael H. (morph1)


Lesenswert?

Martin M. schrieb:
> Den Anfängerfehler mache ich nicht mehr

Macht nix, gibt noch genug andere.
z.B. deine Typenbezeichnung ist falsch, auch wenn man erahnen kann 
welchen du nutzt.

Willst du nicht wirklich mal deinen Code posten?
Geheimnisse interessieren keinen, es reicht die Initialisierung von PPS 
und SPI.

Ansonst kann man dir eigentlich nicht helfen. Eine Übersicht über 
übliche Fehler findest du im Netz an vielen Stellen. Wenn du eine Lösung 
zu einem spezifischen Problem willst, dann sei bitte selbst auch 
spezifisch.

von Martin M. (ats3788)


Lesenswert?

Hallo
Danke für eure antworten
Den Code posten
Das sind ein Haufen verschiedener Files, ich werde das auf meiner 
Homepage posten, wenn ich fertig bin !

Also Ich habe mich Mühselig herangetastet und habe gemerkt das ich ein
Timing Problem habe, ich habe Nop's in spi Write eingefügt.

void lowWrite(const uint8_t address,const uint8_t value)
{
#ifndef SPI_INTERRUPTS
  uint8_t tmpRFIE = RFIE;

  RFIE = 0;
  RADIO_CS = 0;
#endif
    Nop();
    Nop();
    Nop();
    spiPut(address);
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
  spiPut(value);
#ifndef SPI_INTERRUPTS
  RADIO_CS = 1;
  RFIE = tmpRFIE;
#endif
}

und nun scheint es zu gehen, der Spi Bus ist knapp 1 Mhz schnell.
Was mich aber wundert und ich min 15 Std verbracht habe ist das Signal 
das in den Pic geht, das sieht auf dem Oszi immer noch sche**e aus, aber 
ich kann den Sklaven (mrf24j40) die Register richtig auslesen.

Wie gesagt Danke für eure Hilfe .-)

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.