Electronic – Arduino serial communication RX high

arduinopowerpullupserial

I'm trying to interface with a device via async serial. Here is the power on requirement from the device datasheet:

Power-On Reset Requirements
When applying power to the DNT900, the /RESET Pin 39 and the RADIO_TXD Pin 31 must be initially
held low. The /RESET pin must be held low until the power supply voltage reaches 3.3 volts for 100 ms,
and then set high. The RADIO_TXD must be held low an additional 10 ms after the /RESET pin goes
high. RADIO_TXD is weakly pulled down with a 100K ohm resistor to meet the power-on reset requirement, unless this line is driven high by an external signal.

The hardware serial on my arduino (pins 1 & 2) is pulling RX high, thus not meeting the power on requirement of the device. The device goes into bootloader mode and is unusable.

The one solution I have found is using SoftwareSerial, and commenting out two lines of code in the 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);
}

This seems to work, but is there a better way? Is there a solution in hardware instead of software? I'm looking for the most robust and reliable solution so that the device does not go into bootloader mode and cease functioning as expected.

Thanks.

Best Answer

you should be able to maniplate the pin with DigitalWrite, BEFORE you initiate SoftwareSerial instance on that pin. if you want to use the hardware serial port, you may have to add external logic to AND the hardware serial pin with another of Arduinos digital pins and then you can override for the first 100 ms or so, with a digitalwrite to the override pin. make sense?