Wie bekomme ich einen PIC32-SPI-Port zum Übertragen von Daten?

Ich suche nach einer seriellen SPI-Schnittstelle, die auf einem PIC32 (PIC32MX360F) ausgeführt wird. Kann mir jemand einige gute Ressourcen zeigen, wie man das macht, damit ein Neuling es herausfinden kann? Ich verwende das PIC32-Starterkit und habe ein PIC32-Breakout-Board von Digi-Key.

Dies ist der Code, den ich verwendet habe ... Ich habe ihn im Handbuch der PIC32-Familie gefunden.

#include <p32xxxx.h>
   int main(void){
        int rData;
        IEC0CLR=0x03800000; // disable all interrupts
        SPI1CON = 0; // Stops and resets the SPI1.
        rData=SPI1BUF; // clears the receive buffer
        IFS0CLR=0x03800000; // clear any existing event
        IPC5CLR=0x1f000000; // clear the priority
        IPC5SET=0x0d000000; // Set IPL=3, Subpriority 1
        IEC0SET=0x03800000; // Enable RX, TX and Error interrupts
        SPI1BRG=207; // use FPB/4 clock frequency
        SPI1STATCLR=0x40; // clear the Overflow
        SPI1CON=0x8220; // SPI ON, 8 bits transfer, SMP=1, Master mode
        // from now on, the device is ready to transmit and receive data
        SPI1BUF='A'; // transmit an A character

        while(1){
            SPI1BUF= 'A'; // transmit an A character
            while(i < 10000){i++;}
            i = 0;
        }
}

Wie stelle ich die Baudrate ein? Ich vermute, es hat etwas mit SPI1BRG zu tun

BEARBEITEN:

Dank tcrosley habe ich das Gefühl, dass ich der Kommunikation mit meinem pic32 näher komme. Ich habe SPI1BRG auf 207 geändert. Nach meinen Berechnungen wird dies die Baudrate auf etwa 9600 setzen.

Fsck = Fpb/(2(SPIxBRG +1)) = 4 MHz/(2*(207+1))= 9615

Ich versuche, die Ausgabe auf dem Picchip mit HyperTerminal anzuzeigen. Die Einstellungen, die ich verwende, sind:

Baud: 9600
Data bits: 8
Parity: None
Stop bits: 1
Flow Control: None

Die von mir verwendeten Pins sind:

93 - connected to db9 3
95 - connected to db9 2

und db9 5 ist mit der Platinenmasse verbunden ...

Ich bekomme jetzt eine Ausgabe, die nett ist, aber leider Müll ist. Meine Ausgabe auf HyperTerminal ist ein Haufen Herzen :S Jetzt habe ich einfach das Gefühl, dass mein pic32 mich verspottet

@ Richard, die Pins 93 und 95 an J2 Ihres Starter Kits sind zwar die SPI1-Schnittstelle, aber Sie können sie gemäß meinem Kommentar in meiner Antwort unten nicht mit RS-232 verbinden. Die Pins 88 und 90 von J2 sind die RX- und TX-Leitungen der UART1-Schnittstelle, ABER Sie können sie auch nicht direkt an RS-232 anschließen, ohne einen Pegelumsetzer zu verwenden (der auf Ihrer Platine fehlt). Sie benötigen eine Schaltung wie diese: sparkfun.com/commerce/product_info.php?products_id=133 dazwischen.
@tcrosely, meinst du mit Level-Shifter die Spannungen von 3,3 auf 5 Volt umzuschalten? Denn wenn ja, habe ich das Gerät an eine externe Stromversorgung angeschlossen, von der ich dachte, dass sie den Job machen würde.
@Richard, das Problem ist, dass Ihr PC RS-232-Pegel ausgibt und Ihr PIC Logikpegel verwendet. RS-232 verwendet +- 3 V bis +- 12 V, wobei eine negative Spannung den Ruhezustand (Markierung) und eine positive Spannung den aktiven (Abstands-) Zustand darstellt. Der UART Ihres PIC verwendet logisch 1 (normalerweise 3,3 V) für Leerlauf (Markierung) und logisch 0 (0 V) für aktiv (Abstand). Sie benötigen eine Schaltung dazwischen wie die oben verlinkte, um die Logik umzukehren und die Pegel zu verschieben. Siehe „Spannungspegel“ in diesem Artikel: en.wikipedia.org/wiki/RS-232
@tcrosely, sobald ich herausgefunden habe, wie diese UART-Register funktionieren, werde ich sie auf ein Oszilloskop setzen, um zu sehen, wie sich die Ebenen verhalten. Ich werde ehrlich sein, ich bin ein pic32-Neuling. Wenn nicht, werde ich tun, was Sie vorgeschlagen haben, und die Pegel über ein paar Transistoren ändern
@ Richard, hier ist das Schema des SparkFun-Level-Shifters: sparkfun.com/datasheets/Prototyping/RS232-Shifter-v2.pdf - da der PIC keine negative Spannung für den Markierungszustand erzeugen kann, speichert die Schaltung negative Spannung von der TX-Leitung des PCs und verwendet diese als Leerlaufspannung zum Zurücksenden an den PC. Außerdem sind TX / RX auf dieser Schaltung relativ zum PC, sodass RX mit dem TX des PIC verbunden ist und umgekehrt.
@tcrosely, Ok, ich verstehe, was du meinst. Ich hatte gerade angenommen, dass es mit 5-Volt-Logik funktionieren würde, aber das ist offensichtlich nicht der Fall. Danke, dass du mir den Link für den Schaltplan geschickt hast. Das ist eine definitive Hilfe.

Antworten (5)

Dieser Anwendungshinweis AN1277 beschreibt, wie ein serieller SRAM mit dem C32-Compiler an einen PIC32-Mikrocontroller angeschlossen wird. Die Seite enthält einen Link zu einer ZIP-Datei mit Quellcode, der Low-Level-Routinen zum Lesen und Schreiben von Daten über die SPI-Schnittstelle enthalten sollte.

BEARBEITEN:

Wie stelle ich die Baudrate ein? Ich vermute, es hat etwas mit SPI1BRG zu tun

Ich sehe, dass Sie das " Datenblatt " für Ihren Prozessor heruntergeladen haben (Datenblatt ist ein bisschen irreführend, es ist 632 Seiten lang), also werde ich Seitenreferenzen daraus verwenden.

Die Gleichung (auf Seite 397) für die SPI-Taktfrequenz lautet

Fsck = Fpb / (2 * (SPI1BRG+1))

Ich glaube, der PIC32MX360F beginnt mit einem internen FRC-Oszillator von 8 MHz, geteilt durch 2 (aufgrund des FRCDIV-Standardwerts von 1 im OSCCON-Register, Seite 56), und da Sie keine Änderungen an Ihrem Code an OSCCON vornehmen, die Der SYSCLK-Wert beträgt 4 MHz.

Fpb ist die Taktfrequenz des Peripheriebusses. Es wird im PBDIV-Feld des OSCCON-Registers eingerichtet, das wiederum auf den Wert des FPBDIV-Felds im DEVCFG1 (Boot-Konfigurationsregister) initialisiert wird, dargestellt auf Seite 63. Vorausgesetzt, Sie haben dies nicht geändert, ist der Standard-POR ( power-on reset) ist binär 11, was bedeutet, dass der Fpb SYSCLK dividiert durch 8 ist.

Daher Fpb = 4 MHz / 8 oder 500 KHz.

Wenn SPI1BRG = 1, wie in Ihrem Beispiel, Fsck = Fpb / (2 * (1+1)) = Fpb / 4 = 500 KHz / 4 oder 125 KHz.

Wenn Ihr SYSCLK von 4 MHz abweicht, dann skalieren Sie die Fpb entsprechend.

Machen eingebettete Prozessoren keinen Spaß?

lol viel Spaß, ich habe diesen Anwendungshinweis gefunden, war mir jedoch nicht sicher, woher Fpb kam. Danke, dass du das für mich klargestellt hast. Ich habe immer noch Probleme, etwas vom Pic-Chip zu senden. Ich verwende HyperTerminal auf einem PC, um zu sehen, ob etwas übertragen wird. Die Einstellungen, die ich verwende, sind 9600 Baud, 8 Datenbits, Parität keine, Stoppbits 1, Flusskontrolle keine. Ich bin Neuling bei Pic Chips, also wäre jede Hilfe, die Sie geben könnten, großartig.
@Richard, du verwechselst SPI und UART. SPI ist Serial Peripheral Interface und wurde für die Kommunikation mit Chips entwickelt, die eine SPI-Schnittstelle mit CS- (Chipauswahl), SCK- (Takt), MOSI- (Master-Out/Slave-In) und MISO- (Master-In/Slave-Out) Pins haben. HyperTerminal kommuniziert über RS-232, das über die UART-Schnittstelle (Universal Asynchronous Receiver/Transmitter) über Pegelumsetzer auf Ihrem PIC32-Starterkit implementiert wird. Ich denke, Sie müssen sich Kapitel 19 im Datenblatt ansehen, das die UART-Schnittstelle beschreibt.
Ich werde nachsehen. Vielen Dank für Ihre Hilfe. Ich werde hier posten, sobald ich es gelesen habe.

Kaufen Sie dieses Buch: Programmieren von 32-Bit-Mikrocontrollern in C. Lernen, den PIC32 zu fliegen .

Es hat ein Kapitel namens Synchronous Communication Using the SPI Modules und vieles mehr.

Ich habe tatsächlich bereits Zugriff auf dieses Buch (ich arbeite an einer Universität). Ich denke, ich werde weiter mit dem Chip herumspielen, um zu sehen, was ich herausfinden kann ...

Womit verbinden Sie das SPI? Was auch immer das ist, es wird ein Datenblatt geben, das Ihnen die Anforderungen für Ihren SPI-Kanal gibt. So,

  1. Richten Sie Ihr TRIS-Register richtig ein,
  2. den SPI-Kanal richtig aktivieren,
  3. Stellen Sie die Pegel von SI und SO ein und wie sie mit dem SCLK abgeglichen werden. Und Sie benötigen möglicherweise eine Freigabe (Slave-Auswahl). Das Datenblatt dessen, womit Ihre Schnittstelle verbunden ist, sagt Ihnen das.

Verwenden Sie ein Oszilloskop, um zu überprüfen, ob Sie es richtig machen.

Es ist wahrscheinlich, dass Ihr Problem darin besteht, dass Sie nach dem Senden des ersten "A" SPI1BUF nicht zurücklesen, um zu löschen, was auch immer der SPI "zurückgelesen" hat. Denken Sie daran, dass SPI wie ein Schieberegister funktioniert; für jedes Bit, das Sie herausdrücken, bekommen Sie ein bisschen hinein. Wenn Sie den Inhalt von SPI1BUF nicht lesen, erhalten Sie wahrscheinlich eine Überschreitung, und gemäß Abschnitt 17.2.6 des Datenblatts funktioniert das Gerät nicht mehr, bis Sie SPIROV löschen

Zwei weitere Dinge: Sie scheinen die Interrupts nicht zu bedienen. Wenn Sie Tx- und Rx-Interrupts haben, benötigen Sie eine ISR, die die Interrupt-Flags löscht. Außerdem habe ich beim ersten Mal nicht bemerkt, dass Sie versuchen, ein SPI-Signal an einen seriellen Anschluss in einem PC anzuschließen. Wie tcrosley betont, können Sie das nicht direkt tun. Sie benötigen so etwas wie dieses maxim-ic.com/datasheet/index.mvp/id/2052 , um das Protokoll von einem getakteten SPI-Signal auf ein RS232 zu ändern. Aus diesem Grund sehen Sie Müll, obwohl Sie die richtige Baudrate haben.

Für Starter:

  1. Stellen Sie sicher, dass Ihre TRIS-Register richtig eingerichtet sind
  2. Verwenden Sie einen Busmonitor oder ein Oszilloskop, um zu sehen, ob das Timing des SPI-Signals für das Gerät, mit dem Sie kommunizieren möchten, korrekt ist