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
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ß?
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.
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,
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
Für Starter:
trosley
Richard
trosley
Richard
trosley
Richard