Nordische Radioantworten "E"

Ich habe ein nordisches Funkmodul http://www.olimex.com/dev/mod-nrf24L.html , für das ich versuche, einen c#-Treiber zu erstellen (das Gerät ist ein Fez Rhino ). Ich konnte das Gerät initialisieren und ihm Daten senden, bin mir aber nicht sicher, ob das Gerät die Informationen auf dem SPI-Bus empfängt. Immer wenn ich einen Befehl über den Bus sende, bekomme ich ein hexadezimales "E" zurück. Ich habe die Chipspezifikation ( NRF24L01 ) gelesen und versucht festzustellen, ob die hexadezimale E-Antwort normal, ein Fehler oder eine ungültige Antwort für dieses Gerät ist. Der gesamte Beispielcode, den ich gefunden habe, scheint sich nicht um die Antwort des Geräts zu kümmern, sodass ich nicht einmal weiß, ob ich eine Antwort erwarten soll.

Meine Frage ist: Reagiert das Gerät, wenn Befehle an es gesendet werden, und wenn ja, können Sie mich in die Richtung dieser Literatur verweisen?

Antworten (2)

Ein bidirektionaler SPI-Port sendet und empfängt Daten immer gleichzeitig; Bytes werden im Allgemeinen zuerst MSB gesendet (*), und der Master wird kein Bit aussenden, bis er das vorherige Bit empfangen hat. Obwohl es für einen SPI-Slave möglich ist, die oberen Bits eines vom Master empfangenen Bytes zu verwenden, um zu entscheiden, was auf den unteren Bits (#) gesendet werden soll, erfordern die meisten Adressierungsszenarien, dass der Slave Daten sendet, nachdem der Master a gesendet hat Vollständige Adresse. Das gebräuchlichste Muster dafür ist, dass der Master die Adresse aussendet, während er alle vom Slave gesendeten Daten ignoriert, und dass der Master dann für jedes Datenbyte, das er empfangen möchte, ein Byte mit Dummy-Daten aussendet. Der Slave ignoriert normalerweise die vom Master gesendeten tatsächlichen Bytewerte, während er Daten ausgibt.

Die nordischen Chips verbessern dieses Protokoll geringfügig; Da der Master oft einen Statuswert lesen möchte, senden die Nordic-Chips ihren Status immer als erstes Byte in einer Transaktion, bevor sie herausfinden, was der Master wirklich will. Wenn sich herausstellt, dass der Master an dem Status interessiert war, großartig – er hat die Informationen mit einer Transaktion anstatt mit zwei erhalten. Andernfalls kann der Master das erste von Nordic zurückgegebene Byte ignorieren und sich das zweite ansehen.

Übrigens sagt die Nordic-Dokumentation, soweit ich das beurteilen kann, nicht, was irgendwelche Bytes nach dem zweiten Byte enthalten werden. Wenn ich meine Druther hätte, würde das vom Master nach einem Lesebefehl gesendete Byte eine Adresse angeben, die verwendet werden soll, falls der Master ein weiteres Byte sendet, wodurch N Register durch Austausch von N + 1 Bytes gelesen werden können. Ich habe jedoch keine Ahnung, was der Nordic-Chip tatsächlich tut.

(*) Einige Mikrocontroller erlauben, dass Daten zuerst LSB gesendet und empfangen werden. Dies kann für die Kommunikation mit einigen vorhandenen synchronen seriellen Geräten nützlich sein, die Daten auf diese Weise verarbeiten. Darüber hinaus kann es in einigen Fällen einfacher sein, E/A-Geräte wie Multipliziereinheiten mit erweiterter Präzision zu entwerfen, die zuerst Daten LSB senden/empfangen.

(#) Ich kann mir keine Hardwaregeräte vorstellen, die eine solche Fähigkeit implementieren, außerhalb meiner eigenen CPLD-Designs, aber man kann ein Gerät entwerfen, um mehrere Arten von Statusauslesungen mit einer einzigen Transaktion zu ermöglichen, basierend auf den oberen Bits der ersten Daten vom Meister. Wenn man beispielsweise einen Chip im nordischen Stil von Grund auf neu entwerfen würde, könnte man siebzehn verschiedene 4-Bit-Statusregister haben; die vier oberen Bits des ersten vom Slave empfangenen Bytes wären das primäre Statusregister; die anderen vier Bits würden von einem Statusregister stammen, das von den vier MSBs ausgewählt wird, die vom Master geliefert werden.

Alle Informationen, die Sie benötigen, finden Sie in der Dokumentation zum nRF24L01 . Sie sollten Antworten vom Chip über die SPI-Verbindung zurückerhalten, da die meisten Register Read/Write sind. Wenn für jedes Register 0x0E zurückgegeben wird, stimmt etwas nicht. Wenn Sie Register 06, RF_SETUP, direkt nach einem Reset lesen, sollten Sie 0x0E erhalten, aber die anderen Register sollten andere Werte zurückgeben. Beispielsweise sollte Register 03 nach einem Reset 0x03 zurückgeben.

Ich habe den nRF24L01+ ohne Probleme mit PIC-Controllern verwendet.

Ok, also das Lesen eines Registerwerts führt zu 0x0E 0x03 (hexadezimal E3) in den 2 Bytes, die zurückgegeben werden?
Es kommt, wie gesagt, auf das Register an. Möglicherweise erhalten Sie andere Werte. Sie scheinen verwirrt über die Hex-Darstellung zu sein, 0x03 ist ein Hex-Wert: ein Byte.
Ja, aber ich bekomme jedes Mal 2 Bytes zurück.
Sie müssen dann zwei Bytes senden. Hier ist mein Code zum Lesen/Schreiben eines Bytes: unsigned char spi_Send_Read (unsigned char byte) { SSPBUF = byte; while(!DataRdySPI()) ; SSPBUF zurückgeben; }
Ich sende 2 Bytes. Der Beispielcode, den ich verwende, sendet immer mindestens 2 Bytes. Warum das so ist, muss ich beim Autor erfahren. Danke für die Hilfe.
Nur eine Vermutung, aber er sendet möglicherweise das zweite Byte, damit er überprüfen kann, ob es korrekt empfangen wurde. Ich überprüfe nur mit dem Debugger, wenn ich den Code entwickle.