2010-04-13 12 views
6

Mi cerebro está frito, así que pensé en pasarlo a la comunidad.UART velocidad posiblemente incorrecta

Al enviar 1 carácter a mi sistema integrado, siempre cree que recibe 2 caracteres. El primer carácter recibido parece asignarse al personaje transmitido (de alguna manera desconocida) y el segundo carácter recibido es siempre 0xff.

Aquí es lo que he observado:

Tx char (in hex) Rx character (in hex), I left out the second byte (always ff) 
31     9D 
32     9B 
33     99 
61     3D 
62     3B 
63     39 
64     37 
65     35 
41     7D 
42     7B 
43     79 

tengo comprobar mis relojes y ellos parecen estar bien. La única diferencia entre esta versión que no funciona y la versión anterior es que ahora estoy usando un chip RS485.

He rastreado la señal de todo el camino hasta la MCU y se ve bien (confirmado el valor del bit en el pin RX)

+0

También puede obtener una buena respuesta de ChipHacker. – Earlz

+0

Esta es mi publicación (era demasiado vago para iniciar sesión). Estaba razonablemente seguro antes de probar que tenía todo correcto. Estoy usando un sn75 algo u otro traductor rs485. El plano de tierra es bueno, y las señales +/- están limpias (terminadas adecuadamente). La velocidad en baudios está configurada correctamente en 9600 sin paridad, 1 bit de parada. – michael

+0

Si es posible, escuche sus propias transmisiones como un medio de detección de colisión.Personalmente tuve una situación en la que un byte se había movido con éxito fuera del registro de desplazamiento para TX y estaba liberando prematuramente el pin de control al transceptor rs485, lo que resultó en que el último char que se transmite (la suma de comprobación) sea incorrecto. – Nate

Respuesta

9

El primer carácter recibido parece mapa para el carácter transmitido (en alguna manera desconocida)

En cada caso el byte TX se desplaza a la izquierda de 1 bit A continuación se invierte.

Por ejemplo:

31 = 00110001 9D = 10011101

0x31 < < 1 = 01100010

el complemento de 01100010 es 0x9D

he comprobado un par de los otros, parece ser lo mismo para todos. No sé de dónde viene el segundo byte, pero podría ser el resultado de la probable inversión de señal que está sucediendo.

RS485 usa señalización diferencial. Huele como si usaras la salida invertida del chip y lo conectaras a una entrada RS232.

He rastreado la señal de todo el camino hasta el MCU y se ve bien (confirmado el valor del bit en el pin RX )

Qué señal has usado como referencia de tierra ?

+0

¿Funcionará realmente un convertidor rs485 si las líneas + y - se intercambian? es decir, ¿el lado uart generará un byte? si es así, entonces lo que se genera aquí tiene sentido ya que el UART se confundiría cuando los bits de parada y inicio se inviertan. – michael

+0

Y el byte extra de mierda al final también tendría sentido. Si un bit de inicio fue visto erróneamente al final, el siguiente byte sería simplemente todos lógicos. Creo. No estoy cerca de mi alcance, y mi kit de desarrollo. – michael

+0

Buena respuesta: ¿quién necesita un alcance cuando tienes Mark en Stackoverflow? –

1

RS485 es bastante diferente de RS232 a nivel eléctrico (diferencial frente a una sola terminal y +/- 6V versus + 15/-3V): ¿están ambos lados de su enlace de comunicación usando el mismo protocolo?

+0

¡Absolutamente! Tengo un chip sn75 .... rs485 en el lado del cable USB/serie, y 1 en mi micro placa. – michael

+0

Bueno. Me confundí cuando dijiste "ahora usando un chip RS485", me hizo pensar que habías cambiado solo un extremo del enlace. De todos modos, ¡parece que Mark pudo haberlo resuelto por inspección! – mtrw

1

Si es RS485, ¿ha configurado correctamente el "estado predeterminado" del bus? ¿Qué tal el número correcto de bits de parada?

+0

Sí, debería ser bueno, el código es el mismo que cuando usé UART directo (rs232) ¡y funcionó! También me aseguré de tener los pines selectores adecuados para establecer la dirección del chip rs485 al enviar o recibir – michael