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.