MRF49XA Mikrochip-Transceiver

Hat jemand Erfahrung mit dem Microchip MRF49XA Sub-1GHz-Transceiver ? Ich habe in der letzten Woche oder so versucht, einen von diesen dazu zu bringen, mit einem pic16f886 über SPI zu sprechen, und hatte kein Glück, eine Antwort daraus zu bekommen. Ich habe das Datenblatt zu den erforderlichen Verbindungen korrekt befolgt, soweit ich das beurteilen kann, und ich kann Daten auf dem SDO senden, aber wenn ich den Chip auf Low ziehe und 0x00 in den SPI-Ausgang schreibe (der eine Antwort von der MRF49XA-Statusregister) bleibt die SDI-Leitung niedrig. Ich habe versucht, meinen gesamten eigenen Code mit dem Datenblatt als Quelle zu schreiben, und als das nicht funktionierte, habe ich die Beispiel-Demoanwendung heruntergeladen und die relevanten Teile herausgerissen, immer noch kein Glück.

Ich habe einen Screenshot eines Beispiels eines SPI-Schreibzyklus beigefügt, Kap. 1 ist das SDO, Ch.2 die Chip-Select-Leitung und Ch. 3 der SCK.

SPI-Logiksignale

Es genügt zu sagen, dass beim Ausführen des SPI-Lesens das SDO niedrig ist, das SDI niedrig ist (leider), die Chipauswahl (CS) niedrig ist und der Takt korrekt pulsiert. Das MRF49XA verwendet Word-Schreibvorgänge, weshalb die Taktleitung 16 Mal mit einer Lücke dazwischen pulsiert, wo das CS niedrig bleibt.

Wenn jemand Erfahrung mit diesem Chip gemacht hat, wäre Hilfe großartig, einige der Artikel, die ich online gefunden habe, haben angedeutet, dass es ein Schmerz sein kann, aber bisher hat nichts wirklich geholfen.

Ich verwende einen PIC16F886, um mit diesem Ding zu sprechen, der mit 3,3 V betrieben wird, und hier sind das SPI-Setup und die Befehle:

 
.
.
.
.

//set up SPI
    SSPCON = 0b00100000;
    SSPSTAT = 0b11000000;
}
void spiWrite(BYTE data)
{
    BYTE i;
    PIR1bits.SSPIF = 0;
    i = SSPBUF;
    SSPBUF = data;
    while(PIR1bits.SSPIF == 0){}
} 
BYTE spiRead(void){
    spiWrite(0x00);
    return SSPBUF;
}   

void RegisterSet(WORD setting)
{
    nCS = 0;
    spiWrite(setting >> 8);
    spiWrite(setting);
    nCS = 1;
}
Nur zur Überprüfung - Sie verbinden den Ausgang des Masters mit dem Eingang des Slaves - MO an SI?
Haben Sie Ihre SPI-Phasen- und Polaritätseinstellungen überprüft? Hier gibt es einen etwas knallenden Beispieltreiber zum Vergleichen mit akolman.info/schoolstuf/EECS_542/files/final%20project/…
Leider sind die Chips richtig angeschlossen (wäre eine schöne einfache Lösung gewesen) Ich habe sie trotzdem nur zur Überprüfung getauscht und immer noch nichts. Danke für den Link, ich werde mich morgen durch den Code graben, sieht aber oberflächlich gut aus. Was meinen Sie mit der SPI-Phase? Hängt das damit zusammen, wenn sich die Daten im Zusammenhang mit dem Takt ändern? Ich bemerke, dass die Zeitdiagramme im MRF49XA-Datenblatt die Datenänderungen zeigen, wenn die Uhr niedrig ist. Auf meinen gemessenen Zeitdiagrammen scheinen sich Daten und Takt gleichzeitig zu ändern, ich kann jedoch kein Register finden, um diese Verzögerung auf dem Bild zu steuern.Prost

Antworten (3)

Der Democode ist für einen PIC18F87J11 und den C18-Compiler, während Sie einen PIC16F886 und einen anderen, wahrscheinlich inkompatiblen Compiler verwenden.

Sie werden wahrscheinlich mehr Erfolg haben, wenn Sie anstelle des PIC16F886 einen PIC18 mit dem C18-Compiler verwenden. Ich habe den Code heruntergeladen, und abgesehen davon, dass ich den Speicherort der Include-Datei korrigieren musste, wurde die Anwendung ohne Probleme erstellt. Es ist auch wahrscheinlicher, dass Sie Hilfe erhalten, wenn Sie den richtigen Chip und Compiler verwenden, entweder von Leuten hier oder im Microchip-Forum.

Hallo Leon, danke für die Hilfe, das Kompilieren des Codes ist nicht das Problem, und die MRF49XA-Chips sind mit 8-Bit-PICs kompatibel, wie ich an anderer Stelle online gesehen habe - haben Sie festgestellt, dass sie es nicht sind? Außerdem habe ich das Demoprojekt nicht erstellt, sondern bin stattdessen den Democode durchgegangen, indem ich die relevanten Bits kopiert und dann Aspekte für die relevanten Register usw. im 16F886 geändert habe. Angesichts der Tatsache, dass SPI ein ziemlich allgegenwärtiger Standard ist, verstehe ich nicht, warum es eine bestimmte Chipanforderung für die Kommunikation mit einem MRF49XA geben sollte. Ich werde mir das 18F-Zeug ansehen, ich verwende derzeit den Hi-Tech C-Compiler
Ich habe sie nie benutzt. Wenn ich mit so etwas arbeite, verwende ich am Anfang denselben Chip und denselben Compiler, bringe es zum Laufen und ändere dann die Dinge.
Ich beginne zu glauben, dass dies der beste Weg sein wird - es ist diese Versuchung, sich "ein Eigen zu machen", wenn Sie sehen, wie viel die Entwicklerboards sind - ich denke, es lohnt sich auf lange Sicht. Prost
Kaufen Sie einfach ein paar Chips, entwerfen Sie Ihr eigenes Board und lassen Sie eines herstellen.

Aus Ihrem Screenshot sieht es so aus, als ob sich Ihr SDO an der steigenden Flanke der Uhr ändert. Obwohl ich dieses spezielle Produkt nicht verwendet habe, scheinen andere Microchip-Teile es zu mögen, dass sich die Daten an der fallenden Flanke der Uhr ändern.

Laut Datenblatt muss die Uhr niedrig im Leerlauf sein (was Sie haben), und Daten werden an der steigenden Flanke der Uhr eingetaktet. Das bedeutet, dass die Daten bei steigender Taktflanke stabil sein müssen und sich bei fallender Taktflanke ändern müssen.

SSPSTAT = 0b10000000;

Ich hatte dieses Problem kürzlich und konnte 2015 immer noch keine Antwort finden, also habe ich diesen Thread aktualisiert.

Ich habe das Register tatsächlich mit einem Oszilloskop gelesen, bin mir also nicht sicher, wann genau die Daten ausgetaktet werden, aber ich kenne dieses Gerät und schlage vor, dass es eines der folgenden tun wird.

CS Low, dann takte 0x0000 in die MRF. Während Sie dies tun, erfassen Sie das SDO aus dem MRF. Einige Register takten während der zweiten Hälfte des Schreibvorgangs ein Byte aus, dh bei den Takten 8-15 des Befehlsworts (z. B. das Rx-FIFO-Register), aber da das Statuswort 16 Bits hat, müssen Sie es möglicherweise danach austakten Befehl.

Gerade überprüft, das Statuswort taktet aus, wenn Sie 0x0000 eintakten, wobei MSB tatsächlich auf SDO vorhanden ist, wenn CS = 0. (alle anderen Befehlswörter beginnen mit einer 1, standardmäßig wird das Statuswort angezeigt)