Los dos primeros bytes del búfer de transmisión enviado por STM32 al controlador del motor se transfieren incorrectamente

2

Quiero usar la placa STM32F407VET6 para enviar comandos a Roboteq Motor Controller MDC2230 y soy muy novato en sistemas integrados.

En primer lugar, creé mi proyecto a través de STM32CubeMX y conecté RX y TX entre sí. El loop-back funcionó correctamente.

También puedo crear comunicación entre mi PC y el controlador a través de RS232 to USB Converter . Si envío el comando "obtener velocidad izquierda del motor" a través de CuteCom, (es: "?$03 1" ) El controlador del motor responde a la PC sin distorsión con éxito.

Y también STM32 se comunica con la PC a través de ese cable convertidor, envía y recibe datos correctamente: puedo ver las salidas de STM32 en CuteCom y puedo enviar comandos a STM32.

Por fin, conecté el controlador al microcontrolador. Aquí está la conexión:

+--------------+        +-------------------+      +-------------------+
| "STM32"   TX |------->| R1OUT        R1IN |<-----| DATA OUT (Pin 2)  |
| "USART2"  RX |<-------| T1IN        T1OUT |----->| DATA IN (Pin 3)   |
|          GND |--------| GND           GND |------| GND               |
|         3.3V |--------| 3V-5.5V "MAX3232" |      | "Roboteq MDC2230" |
+--------------+        +-------------------+      +-------------------+

Pero en el caso de STM32 a Roboteq Controller; STM32 envía los primeros dos bytes del búfer, incorrecto. Debe ser:

( 3f 24 30 33 20 31 0d ) "?$03 1\r" , pero CuteCom (*) muestra:

( bf 27 30 33 20 31 0d ) "¿'03 1\r" y algunas veces (**):

( bf 27 38 33 20 31 0d ) "¿'83 1\r"

Aquí hay algunas partes del código que funcionan en otros casos pero no en la conexión anterior:

...

#define MAX_COMMAND_STR_SIZE 32
uint8_t tx_buff[MAX_COMMAND_STR_SIZE]; 
uint8_t rx_buff[MAX_COMMAND_STR_SIZE];
memset(tx_buff, 0x00, MAX_COMMAND_STR_SIZE * sizeof(uint8_t));
memset(rx_buff, 0x5F, MAX_COMMAND_STR_SIZE * sizeof(uint8_t));

...

sprintf((char*)tx_buff, "?$03 1\r");
while ( 1 )
    {
        dummyInit(&huart2);
        HAL_DMA_Init(&hdma_usart2_tx); // FIXME: Is needed?
        HAL_DMA_Init(&hdma_usart2_rx); // FIXME: Is needed?
        HAL_UART_Transmit_DMA ( &huart2, tx_buff, strlen((char*)tx_buff) );
        HAL_Delay ( 10 );
        HAL_UART_Receive_DMA ( &huart2, rx_buff, MAX_COMMAND_STR_SIZE );

        if ( DEBUG ) printf("tx_buff: %s\n", tx_buff);
        if ( DEBUG ) printf("rx_buff: %s\n", rx_buff);
        if ( DEBUG ) printf ( "DR: %"PRIu32"\n", huart2.Instance->DR );
        if ( DEBUG ) printf ( "ERR: %"PRIu32"\n\n", huart2.ErrorCode );
        //printf("Returned --> %d \n\n", getSpeedL(FALSE));
}

...

void dummyInit(UART_HandleTypeDef *_huart) // FIXME: if any other way exists, replace with this
{
    __HAL_UART_DISABLE(_huart);

    CLEAR_BIT(_huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN));
    CLEAR_BIT(_huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN));

    __HAL_UART_FLUSH_DRREGISTER(_huart);

    /* Enable the peripheral */
    __HAL_UART_ENABLE(_huart);

    /* Initialize the UART state */
    _huart->ErrorCode = HAL_UART_ERROR_NONE;
    __HAL_UART_RESET_HANDLE_STATE (_huart);
    _huart->gState = HAL_UART_STATE_READY;
    _huart->RxState = HAL_UART_STATE_READY;
    _huart->RxXferCount = 0;
    _huart->TxXferCount = 0;
} 

(*) Estoy usando una forma perezosa de leer la comunicación entre max3232's T1OUT y Roboteq's DATA IN pin. Mi RS232 al convertidor USB está conectado a mi PC, y hay un cable puente M-F en el lado RS232. Solo estoy tocando T1OUT de MAX232.

(**) Y CuteCom muestra la salida con ruido.

¿Cuáles son las partes equivocadas de mi enfoque? Lo sé, mi primer defecto es ser un ingeniero de software, no un ingeniero eléctrico.

    
pregunta Orhan G. Hafif

2 respuestas

2

Escribí conexiones verdaderas entre MAX3232 y Roboteq MDC2230 (!), pero escribí conexiones incorrectas entre STM32 y MAX3232 en la pregunta. ¡Entonces, conectó los pines incorrectos entre MAX3232 y Roboteq solamente! En el caso real, T1OUT se conectó a DATA OUT (Pin2) . La verdadera conexión es:

+--------------+        +-------------------+      +-------------------+
| "STM32"   RX |<-------| R1OUT        R1IN |<-----| DATA OUT (Pin 2)  |
| "USART2"  TX |------->| T1IN        T1OUT |----->| DATA IN (Pin 3)   |
|          GND |--------| GND           GND |------| GND               |
|         3.3V |--------| 3V-5.5V "MAX3232" |      | "Roboteq MDC2230" |
+--------------+        +-------------------+      +-------------------+

Preguntar había sido bueno para mí. Pero para la comunidad, creo que fue innecesario. Lo siento Estimada comunidad, mi mal: P

    
respondido por el Orhan G. Hafif
2

Parece que tienes algún tipo de mezcla de formato de 7/8 bits en tu STM32. La diferencia entre los datos esperados e inesperados es que el bit MS se establece. Por ejemplo, 0x03 vs 0x83 en: (bf 27 30 33 20 31 0d) "¿'83 1 \ r"

Su formato de mensaje parece requerir solo valores ASCII de 7 bits. Estudie las especificaciones de UART para el STM32 para ver si hay alguna distinción entre la operación o configuración de datos de 7 bits y 8 bits. Además, intente ANDAR todos los valores de bytes con 0x7F justo antes de cargarlos en el registro de datos xmit del UART.

    
respondido por el FiddyOhm

Lea otras preguntas en las etiquetas