¿Por qué la señal FTDI RS485 se ve mal?

Tengo una placa interna con un microcontrolador (Microchip dsPIC33E) y un controlador RS485 (Analog Devices ADM2587E) que intento conectar a una PC de escritorio usando un USB FTDI (USB-RS485-WE-1800-BT) para Cable convertidor RS485. La placa interna recibe los paquetes de datos del FTDI correctamente y responde. Sin embargo, la PC verá con frecuencia, generalmente dentro de los primeros cinco bytes, pero a veces más tarde y otras veces antes, errores de bit en los datos recibidos por el FTDI.

La siguiente imagen es una traza típica capturada de un osciloscopio, que muestra:

  • La entrada DE al ADM2586E en amarillo (1)
  • La señal Data- (B) del FTDI en cian (2)
  • La señal Data+ (A) del FTDI en violeta (3)
  • La señal GND de FTDI y ADM258E en verde (4)

El osciloscopio se ha configurado de modo que el nivel de '0 V' de las señales 2, 3 y 4 estén todos alineados y marcados por la posición de la señal 4, la línea verde.

Rastreo de señales RS485 (función y respuesta Modbus Request Server ID)

La primera ráfaga de datos (a la izquierda) es un paquete de ID de servidor de solicitud Modbus, enviado a 19200 bps, 8 bits de datos, 1 bit de parada e incluso paridad. Esto es reconocido por la placa interna, como lo ve afirmando Driver Enable del ADM2587E y respondiendo con la segunda ráfaga de datos (a la derecha). El FTDI envía datos USB que incluyen un error de bit en el sexto (en este caso) byte recibido. Nota: No puedo estar seguro de qué byte contiene el error de bit, ya que el controlador USB no retiene mucha información de tiempo, pero de todos modos esto no es particularmente relevante para mi pregunta. Además, los retrasos a ambos lados de las transiciones DE se han insertado deliberadamente en el software interno de la placa; Originalmente usé el modo simplex UART RTS para reducirlos al ancho de un solo bit de datos, pero esto tuvo el mismo efecto.

Sospecho que el problema se debe a que el FTDI malinterpreta los niveles de voltaje de las señales recibidas. La placa interna incluye una resistencia de polarización a prueba de fallas de 360 ​​ohmios entre A+ y VOUT y entre A- y GND2 en el ADM2587E, además de una resistencia de terminación de 120 ohmios entre las líneas A+ y B-, según la nota de aplicación de Analog Devices para este Circuito integrado del controlador RS485. (También probé resistencias de polarización de 1 kOhm y 10k Ohm, pero con muy poca diferencia). El seguimiento anterior se tomó con un aislador USB Keterex entre la PC y el FTDI, aunque esto no hace ninguna diferencia.

La salida de la placa interna es como esperaría ver una señal RS485 de dos hilos y semidúplex, con las señales B- y A+ equilibradas alrededor de la media de sus niveles inactivos. La salida del FTDI me parece extraña, con las señales B- y A+ elevadas en relación con la media de los niveles inactivos. Si el FTDI espera que los datos recibidos se ajusten a esta señal 'elevada', eso explicaría los errores de bits y me lleva a mi pregunta.

¿Por qué la salida del FTDI parece estar elevada, en relación con los niveles de voltaje medio de tierra e inactivo?

Editar

La respuesta marcada como correcta a continuación indica que no hay nada malo con los niveles de FTDI, que es lo más parecido a una respuesta correcta: no importa que estén elevados ya que están dentro de las especificaciones.

Aparte, el problema que estoy viendo en realidad parece, en un examen mucho más detallado de los rastros del alcance, que se debe a la salida del ADM258E, y no tiene nada que ver con el FTDI en absoluto.

Respuestas (1)

Está ejecutando en modo semidúplex, uniendo Y con A, Z con B, ¿verdad? ¿Por qué mencionas A- y B+ y A- y A+? Asumiré que solo te refieres a A y B, y que la resistencia de terminación está entre ellos.

Cada receptor al final de los 485 cables requiere resistencias de terminación de 120 ohmios, por lo que en el modo semidúplex necesita uno en cada extremo, ya que ambos son receptores. ¿Tienes uno en el extremo FTDI también?

485 transmite 1/0 separando los pares por un voltaje, ¿por qué quiere resistencias 'a prueba de fallas' que atarán el bus? En un estado inactivo, los voltajes deben ser los mismos entre los dos, que es lo que también ayuda a hacer la resistencia de 120 ohmios, está trabajando en contra de esto separando las líneas separadas y desperdiciando energía. Tienes 360+360+120ohm de VOUT a GND permanentemente.

¿Cuál debe ser la polaridad del bit de parada? Verifique la polaridad del pin TX del UART y asegúrese de que su inactividad sea 0 durante los períodos de retraso. Si está transmitiendo un 1, ¿podría estar fallando porque el receptor FTDI nunca ve el bit de parada?(ver actualización a continuación)

Los niveles de voltaje en sí mismos no importan tanto, ya que hay una diferencia de> 200 mV entre A/B. El chip FTDI no debería tener problemas para determinar lo que está enviando con una diferencia de 3v, tal como lo hizo su receptor con una diferencia de ~2v.

Actualización: desde que se dio cuenta de que puede recibir correctamente los primeros bytes antes del error de bit, esto parece más un problema de tiempo. Intente ejecutar a una velocidad en baudios más baja y vea si recibe más datos recibidos antes del error.

Lea A+ como A y B- como B (he cambiado mis errores tipográficos A- a B-). Sí, tengo la señal A conectada a Y y la señal B conectada a Z en el ADM2587E y la resistencia de terminación entre ellos.
El cable FTDI proporciona cables, lo que permite agregar su resistencia de terminación; sin embargo, mi única opción para conectarlos es en la misma ubicación física que la otra resistencia de terminación. esto sería efectivamente dos resistencias de 120 ohmios en paralelo, es decir, una sola resistencia de 60 ohmios. ¿Debo seguir haciendo esto?
Las resistencias de polarización han estado tanto presentes como ausentes y no afectan los niveles elevados de FTDI. De hecho, el ADM2587E incorpora su propia polarización a prueba de fallas y las resistencias adicionales son realmente redundantes (en el mejor de los casos). Sin embargo, en mis intentos de investigar, he probado muchas recomendaciones de varias fuentes, siendo las resistencias de polarización solo una.
El estado de la línea TX en reposo es lógica 0. El seguimiento del alcance en la pregunta en realidad confirma esto, si sabe dónde buscar. :-)
Mi pregunta es en realidad, ¿por qué las señales de FTDI parecen estar elevadas? Una vez que comprenda esto, podré diagnosticar yo mismo la causa de los errores de bits, aunque se agradecen sus comentarios y sugerencias.
Es posible que solo sea una función de cómo funcionan los chips FTDI, el hecho de que estén elevados no debería importar ya que el receptor solo detecta una diferencia de> 200 mV entre A / B. Solo como una verificación rápida, ya que literalmente debería tomar un minuto, ¿puedes intentar invertir el pin TX? (Bit 14/UTXINV de UxSTA). Puede que no marque la diferencia, pero vale la pena intentarlo.
Ok, con TX invert ya no recibo ningún byte correcto del FTDI. Sin embargo, recibo muchos bytes (un búfer modbus completo de 265) que no se envían.
¿Puedes probar alguna prueba básica de bucle invertido? Si tiene dos tableros internos, ¿puede hacer que hablen entre sí? ¿O habilitas el receptor mientras envías algo y compruebas que coincida? (aunque probablemente tengas DE y RE# conectados entre sí...)
Oh, ¿así que en realidad estabas recibiendo los bytes correctos? Lo siento, no me di cuenta de eso, solo pensé que obtuviste algunos bytes incorrectos y luego errores de bits.
En general, creo que la configuración es correcta, son los únicos errores de bit en un extremo los que son un problema, y ​​el aspecto asimétrico de las señales FTDI es lo que me preocupa. La traza anterior tiene cinco bytes buenos recibidos antes de que se detecte un error de bit en el sexto.
¿Podría ser simplemente tiempo entonces? ¿Cuál es el % de error entre la tasa de baudios que le da su valor BRGx y 19200? Dado que los datos recibidos son bastante cortos, es posible que no se note, pero después de que se transmiten unos pocos bytes, ¿los dos se desincronizan? ¿Puede probar una velocidad de transmisión diferente, incluso algo bajo como 1200/2400 y ver si avanza más?
He votado a favor de esta respuesta ya que contiene información útil para diagnosticar los errores de bits. Todavía estoy esperando una respuesta del soporte de FTDI para ver si pueden decirme por qué sus señales están elevadas.
gracias mike ¿Tuviste la oportunidad de intentar ejecutar a una velocidad de transmisión más baja para ver si podías recibir más bytes antes de un pequeño error? ¿O era lo mismo?
He probado 2400 hasta 115200 ahora, todos con resultados similares. Ahora sospecho de un FTDI defectuoso, ya que comenzó a anteponer los datos devueltos con 0x00 e insertó un bloque de cuatro bytes 0x3f en cada cuadro en un punto inconsistente. Sin embargo, aún no hay noticias de su equipo de soporte.
@vanadium, a veces desea una polarización a prueba de fallas para que un bus RS-485 inactivo se perciba como una línea serial inactiva. Establece la polarización de modo que con solo las cargas del receptor y cualquier terminador, el voltaje sea superior a 200 mV en la dirección correcta, produciendo bits de parada consistentes en la línea. Algunos chips receptores RS485 están polarizados internamente, por lo que se garantiza que producirán una salida lógica sin esto, pero no todos. No tener ese sesgo puede ser una fuente de bytes falsos recibidos si el ruido del sistema puede influir en un receptor para que produzca un bit de inicio aparente en su lado de nivel lógico.