Usted mismo puede hacer un drenaje abierto de cualquier pin digital en el PIC, ¡es fácil! Lo mostraré a través de un fragmento rápido de código de ejemplo utilizando RB0.
_TRISB0 = 1; // Set the pin to high impedance
_LATB0 = 0; // Set the output low (this would be _PORTB0 on some pics)
// As long as you're using pin RB0 as a open-drain, don't touch _LATB0
// To output a "low" (drain) do this:
_TRISB0 = 0; // Set the pin to output, it's already low, so it will "drain"
// To output a "high" (open) do this:
_TRISB0 = 1; // Set the pin to high impedance, the pullup resistor will pull high
El módulo I2C hará algo similar a esto internamente, sin que usted haga nada. En otras palabras: ¡sí! ¡Necesitarás una resistencia pullup!
EDITAR: para responder a la segunda pregunta que no abordé directamente, el pin no necesita una resistencia de extracción durante la operación de salida digital normal. Mi ejemplo fue mostrarle cómo un pin de E / S digital normal y que funciona completamente podría funcionar como un drenaje abierto sin ningún comportamiento adicional o comportamiento inesperado. También debo tener en cuenta que he hecho esto exactamente lo que mostré aquí para hacer un drenaje abierto en programas reales, por lo que este no es un ejemplo de juguete, ¡es realmente cómo lo haces!