RX der seriellen Arduino-Kommunikation hoch

Ich versuche, eine Schnittstelle mit einem Gerät über eine asynchrone serielle Schnittstelle herzustellen. Hier ist die Einschaltanforderung aus dem Gerätedatenblatt:

Einschalt-Reset-Anforderungen Beim Anlegen von Strom an das DNT900 müssen der /RESET-Pin 39 und der RADIO_TXD-Pin 31 anfänglich niedrig gehalten werden. Der /RESET-Pin muss niedrig gehalten werden, bis die Versorgungsspannung 100 ms lang 3,3 Volt erreicht, und dann hoch gesetzt werden. Der RADIO_TXD muss weitere 10 ms lang niedrig gehalten werden, nachdem der /RESET-Pin hoch geht. RADIO_TXD wird mit einem 100-K-Ohm-Widerstand schwach nach unten gezogen, um die Rücksetzanforderung beim Einschalten zu erfüllen, es sei denn, diese Leitung wird durch ein externes Signal hochgetrieben.

Die Hardwareserie auf meinem Arduino (Pins 1 & 2) zieht RX hoch und erfüllt somit nicht die Einschaltanforderung des Geräts. Das Gerät geht in den Bootloader-Modus und ist unbrauchbar.

Die einzige Lösung, die ich gefunden habe, ist die Verwendung von SoftwareSerial und das Auskommentieren von zwei Codezeilen in der RX-Init-Routine:

void SoftwareSerial::setRX(uint8_t rx)
{
  pinMode(rx, INPUT);
  //if (!_inverse_logic)
  //  digitalWrite(rx, HIGH);  // pullup for normal logic!
  _receivePin = rx;
  _receiveBitMask = digitalPinToBitMask(rx);
  uint8_t port = digitalPinToPort(rx);
  _receivePortRegister = portInputRegister(port);
}

Das scheint zu funktionieren, aber gibt es einen besseren Weg? Gibt es eine Lösung in Hardware statt Software? Ich suche nach der robustesten und zuverlässigsten Lösung, damit das Gerät nicht in den Bootloader-Modus wechselt und nicht mehr wie erwartet funktioniert.

Danke.

Können Sie den Pin vielleicht als gpio-Ausgang konfigurieren, ihn niedrig fahren, dann den Reset ein zusätzliches Mal pulsieren - und den Pin erst dann als UART-Ausgang konfigurieren?
Sie können für diesen Zweck if Serial.end() verwenden. Probieren Sie es aus, die Dokumentation schlägt vor, dass Sie die Pins 0 und 1 , den Hardware-UART, als Allzweck-IO verwenden können, wenn Sie zuerst end aufrufen.

Antworten (1)

Sie sollten in der Lage sein, den Pin mit DigitalWrite zu manipulieren, BEVOR Sie die SoftwareSerial-Instanz auf diesem Pin initiieren. Wenn Sie den seriellen Hardware-Port verwenden möchten, müssen Sie möglicherweise eine externe Logik zu UND dem seriellen Hardware-Pin mit einem anderen digitalen Pin von Arduino hinzufügen, und dann können Sie die ersten 100 ms oder so mit einem Digitalwrite auf den Override-Pin überschreiben. Sinn ergeben?

Ja, klingt nach gesundem Menschenverstand. Ich war nur sehr verwirrt, dass mein Gerät eine Einschaltanforderung erforderte, die nicht mit UART kompatibel ist, aber UART verwendet.
@sinaptik. es klingt wie ein klassischer Fall einer Signalleitung mit doppeltem Zweck. Eigentlich sollte die serielle Kommunikation wenig damit zu tun haben, ob das Gerät im Bootloader bootet oder nicht. Eigentlich sollte es dafür wahrscheinlich einen anderen Pin geben, da viele serielle Controller die Signale auf ihren Hardware-UARTs möglicherweise nicht so fein steuern können. mal sehen ob arduino das kann, laut kommentar von chris s. oder software seriell verwenden. oder verwenden Sie eine externe Logik, um die Schnittstelle mit dieser etwas nicht standardmäßigen Doppelfunktionsleitung zu unterstützen.