I want to use STM32F407VET6 board to send commands to Roboteq Motor Controller MDC2230 and I'm very newbie in embedded systems.
Firstly, I created my project via STM32CubeMX and connected RX and TX to each other. The loop-back worked correctly.
Also I can create communication between my PC and controller via RS232 to USB Converter. If I send "get Left Motor Speed" command via CuteCom, (It's: "?$03 1") Motor controller responds to PC without distortion successfully.
And also STM32 communicates with PC via that converter cable, sends and receives data correctly: I can see outputs of STM32 on CuteCom and can send commands to STM32.
At last, I connected controller to micro-controller. Here is the connection:
+--+ +---+ +---+
"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" |
+--+ +---+ +---+
But in the case of STM32 to Roboteq Controller; STM32 sends first two bytes of buffer, wrong. It must be:
( 3f 24 30 33 20 31 0d ) "?$03 1\r" , but CuteCom(*) shows:
( bf 27 30 33 20 31 0d ) "¿'03 1\r" and sometimes():
( bf 27 38 33 20 31 0d ) "¿'83 1\r"
Here is some parts of code which works in other cases but not in above connection:
...
- 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;
}
(*) I'm using some lazy way to read communication between max3232's T1OUT and Roboteq's DATA IN pin. My RS232 which I got from kynix: http://www.apogeeweb.net/ to USB converter connected to my pc, and there is M-F Jumper cable on RS232 side. I'm just touching to T1OUT of MAX232.
() And CuteCom shows output with noise.
What are the wrong parts of my approach? I know, my first fault is being a Software Engineer, not an Electrical Engineer.
I want to use STM32F407VET6 board to send commands to Roboteq Motor Controller MDC2230 and I'm very newbie in embedded systems.
Firstly, I created my project via STM32CubeMX and connected RX and TX to each other. The loop-back worked correctly.
Also I can create communication between my PC and controller via RS232 to USB Converter. If I send "get Left Motor Speed" command via CuteCom, (It's: "?$03 1") Motor controller responds to PC without distortion successfully.
And also STM32 communicates with PC via that converter cable, sends and receives data correctly: I can see outputs of STM32 on CuteCom and can send commands to STM32.
At last, I connected controller to micro-controller. Here is the connection:
+
--+ +---+ +---+->----->------+
--+ +---+ +---+ But in the case of STM32 to Roboteq Controller; STM32 sends first two bytes of buffer, wrong. It must be:( 3f 24 30 33 20 31 0d ) "?$03 1\r" , but CuteCom(*) shows:
( bf 27 30 33 20 31 0d ) "¿'03 1\r" and sometimes():
( bf 27 38 33 20 31 0d ) "¿'83 1\r"
Here is some parts of code which works in other cases but not in above connection:
...
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; } (*) I'm using some lazy way to read communication between max3232's T1OUT and Roboteq's DATA IN pin. My RS232 which I got from kynix: http://www.apogeeweb.net/ to USB converter connected to my pc, and there is M-F Jumper cable on RS232 side. I'm just touching to T1OUT of MAX232.
() And CuteCom shows output with noise.
What are the wrong parts of my approach? I know, my first fault is being a Software Engineer, not an Electrical Engineer.