Input impedance issues?

Hi.
I’m creating a product based on the BW16 module, to replace an existing module from another supplier.
I’m having troubles with the PA_15 input.

The application calls for an external GPIO interrupt in the BW16. I have configured PA_15 to an input, no pullup, and trigger on both edges. In normal cases, it all works well.

However, due to a BOM error on the product this module will be used with, some products have a 10k ohm resistor in series with PA_15.

host micro -------- 10k resistor -------- PA_15

With this 10k in series, PA_15 can detect a low level, but it cannot detect a high level.
The other side of the 10k resistor is driven to 3.3v by a microcontroller, but the voltage on PA_15 reads around 0.25v, not enough for logic high.

Yes the 10k in series is wrong, but its not able to be changed now. The other microcontroller (the one I’m replacing) was able to handle this OK, provided pull-up and pull-down were disabled.

I have tried a number of things with the PAD control register. Various drive strengths, pull up/pull down/no pull, etc.

I can see that when when I have the small pullup resistor selected, but with the pullup disabled, voltage is around 0.25v at PA_15. With large resistor selected, but pullup disabled, the voltage on PA_15 changes to 0.59v.
This seems wrong, as the pullups should not be enabled at all.

I can see in the data sheet that there is “Resd” resistor in series with the input, but I can’t find its value.
What is the input impedance of PA_15?

Is there any register settings I can change to get PA_15 to read high when driven via a 10k resistor to 3.3v?

Here is my init code:
GPIO_InitStruct.GPIO_Pin = HOST_REQUEST;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_ITTrigger = GPIO_INT_Trigger_BOTHEDGE;
GPIO_InitStruct.GPIO_ITPolarity = GPIO_INT_POLARITY_ACTIVE_LOW;
GPIO_Init(&GPIO_InitStruct);

// enable interrupt
GPIO_INTMode(HOST_REQUEST, ENABLE, GPIO_INT_Trigger_BOTHEDGE,
GPIO_INT_POLARITY_ACTIVE_LOW | GPIO_INT_POLARITY_ACTIVE_HIGH,
GPIO_INT_DEBOUNCE_DISABLE);

InterruptRegister(GPIO_INTHandler, GPIOA_IRQ, (u32)GPIOA_BASE, HOST_IRQ_PRIORITY);
InterruptEn(GPIOA_IRQ, HOST_IRQ_PRIORITY);

GPIO_UserRegIrq(HOST_REQUEST, (void *)host_irq_handler, &GPIO_InitStruct);
GPIO_INTConfig(HOST_REQUEST, ENABLE);

Hi @Smythbuilt

As you mentioned, this is not a normal use case, thus there is very little I can help, but from what I can see in the tech documents, the pin PA_15 is of the key-scan pad, it has the following characteristics,

  • loading (pF): 15
  • Driving at 3.3V: 8/16mA
  • Internal pull resistor: 4.7K/50K ohm

So maybe if you enable the internal pull resistor to a bigger value, and by the voltage divider rule, you can get a higher voltage on that pin

More info: testing using various external pull up resistors, the input only starts to function properly if the resistor is around 2.5k ohm or less. The voltage on PA_15 reads as 1.6v with 2.5k.

I did try with small/big pullups but it didn’t help much. Voltage went from 0.24 to 0.59v when using the 10k.

Do you have contact to the distributor sellling BW16 to you? They should have a FAE who can better assst you with this issue

I ended up just adding a small CMOS buffer. This solved it

1 Like

Thanks for letting us know~ The fix is quite clever :slight_smile: