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

Quiero usar la placa STM32F407VET6 para enviar comandos al controlador de motor Roboteq 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 bucle invertido funcionó correctamente.

También puedo crear comunicación entre mi PC y el controlador a través de un convertidor RS232 a USB . Si envío el comando "Obtener la velocidad del motor izquierdo" 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 CuteComy 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, mal. 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 aveces(**):

( 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 T1OUTy el pin de Roboteq DATA IN. Mi convertidor RS232 a USB está conectado a mi PC y hay un cable puente MF en el lado RS232. Solo estoy tocando T1OUT de MAX232.

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

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

Respuestas (2)

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

El formato de su mensaje parece requerir solo valores ASCII de 7 bits. Estudie las especificaciones 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 aplicar AND a todos los valores de byte con 0x7F justo antes de cargarlos en el registro de datos xmit de la UART.

Gracias por una respuesta Intenté cambiar UART_WORDLENGTH_8Ba UART_WORDLENGTH_9Bpero no funcionó. El problema se produjo debido a una conexión incorrecta.

Escribí conexiones verdaderas entre MAX3232 y Roboteq MDC2230(!) pero escribí conexiones incorrectas entre STM32 y MAX3232 en Pregunta. Entonces, ¡conectó pines incorrectos entre MAX3232 y Roboteq solamente! En un caso real, T1OUT estaba conectado 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" |
+--------------+        +-------------------+      +-------------------+

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