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.
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;
}
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.
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)
Toby Jaffey
Toby Jaffey
Simon Barker