La línea no controlada RS485 lee 0

Esta es una continuación de la contención RS485 de SN65176 .

Resolví el problema de contención esperando al menos 26 us después del bit de parada de un controlador XS201A RS485 conectado a una PC antes de transmitir desde el SN65176. Sin embargo, evitar la contención no es suficiente.

Inicialmente, mi red de terminación del lado del PIC constaba de un único terminador diferencial de 100 ohmios:

esquemático

simular este circuito : esquema creado con CircuitLab

Tan pronto como el XS201A termina de transmitir, el voltaje diferencial regresa a un valor promedio. Sin embargo, este valor promedio no es un diferencial de 0 V como cabría esperar. En cambio, el conductor está tirando fuertemente de la línea hasta la mitad del estado de la marca. En el proceso, piensa que eso significa un bit de inicio y emite un byte "0" (o un byte parcial dañado del lado PIC, si comienza a transmitir poco después).

conductor a estado inactivo

Luego hice una red de sesgo para imitar el estado "espacial" (opuesto a la marca), de modo que:

  • la impedancia diferencial sigue siendo 100ohm
  • el voltaje diferencial está sesgado a 500mV
  • la línea inferior está sesgada a 1.5V

esquemático

simular este circuito

Agregar esta red de sesgo hizo que, en unos pocos miles de bytes, mi tasa de error ahora sea de aproximadamente 0,4% (frente al 100%). Sin embargo, incluso con esta mejora, no hay cambios visibles en los voltajes de estado inactivo: el XS201A esencialmente anula mi red de polarización e invierte la polaridad de la resistencia intermedia.

Mis preguntas son:

  • ¿Por qué el XS201A no entra en un estado de alta impedancia cuando está inactivo?
  • ¿Por qué el XS201A tiene un voltaje diferencial distinto de cero fuertemente mantenido cuando está inactivo?
  • ¿Hay algún problema con mi nueva red de polarización?
  • ¿No debería esperar poder tener una resistencia de terminación simple en lugar de una red de polarización, especialmente porque el XS201A afirma tener una red de polarización a prueba de fallas incorporada?
500 mV no es suficiente polarización para algunos receptores.
una línea inactiva debe verse como una marca, no como un espacio.
Cuando la línea inactiva puede marcar, el XS201A básicamente se envía a sí mismo un byte '0'.
Los resitros de polarización R1 y R3 deben ser iguales, como 680 ohmios. También la terminación, 120ohm
No, no debe terminarse con 120 ohmios, porque es un cable de 100 ohmios.

Respuestas (3)

RS-485 tiene un voltaje diferencial definido tanto en la marca como en el espacio. El estado inactivo es cuando el voltaje V_diff es -0.2V < V_diff < 0.2V; esto se hace poniendo el transmisor en un estado Hi-Z, generalmente controlando la señal RTS desde el UART. Luego se usa RTS para encender/apagar el transmisor, desde Hi-Z hasta el nivel de voltaje definido para marca/espacio.

Si ese es el caso, entonces este adaptador no cumple con las especificaciones, porque no pone Vdiff tan bajo durante la inactividad. Sin embargo, lo intentaré de nuevo con RTS.

Vieja pregunta, pero...

Existe una polarización a prueba de fallas, donde las líneas se mantienen ligeramente en uno de los dos únicos estados válidos en los que debería estar el par trenzado.

Si esto sucede en su XS201A, podría significar que, de hecho, está funcionando según lo previsto. Los voltajes inesperados podrían explicarse por una conversión dc-dc hacky, como lo hicieron para los antiguos programadores PIC/AVR. Si eso es un problema, recomendaría obtener un adaptador autoalimentado adecuado.

Para obtener una explicación más detallada de la polarización a prueba de fallas en RS485, consulte esta nota de aplicación de Ti .

Para solucionar estos problemas, terminé abandonando el XS201A por completo. No tiene una señalización de hardware adecuada y sus características de polarización eran problemáticas.