Estoy intentando conectar Simcom SIM900 a Nucleo-F411RE utilizando la siguiente configuración para USART1 :
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
HAL_UART_Init(&huart1);
}
También la inicialización GPIO es la siguiente:
GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
Ahora estoy intentando enviar el comando "AT\r"
y recibir el "OK"
o "ERROR"
del módem, pero parece que no obtengo nada de él. He intentado enviar "AT\n"
"AT\n\r"
también pero ninguno estaba dando el resultado adecuado.
Utilizo el osciloscopio para ver si los bits binarios se transmiten al módem y funciona bien. ¿Cuál puede ser el problema potencial?
Creo que hay una discrepancia en la configuración entre Nucleo y el módem, pero aún no se ha podido resolver.
Editar: Mi función principal se ve así:
#define TXATMESSAGESIZE (COUNTOF(Message) - 1)
#define RXBUFFERSIZE 10
#define COUNTOF(__BUFFER__) (sizeof(__BUFFER__) / sizeof(*(__BUFFER__)))
uint8_t Message[] = "AT\r\n";
uint8_t aRxSIM900Buffer[RXBUFFERSIZE];
UART_HandleTypeDef huart1;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
/* UART TX and RX */
HAL_UART_Transmit(&huart1, (uint8_t*) Message, TXATMESSAGESIZE, 1);
if( HAL_UART_Receive(&huart1, (uint8_t*) aRxSIM900Buffer, RXBUFFERSIZE, 10) != HAL_OK)
{
while(1){
}
}
}
Edit 2:
Cuando entro en la función HAL_UART_Receive
en el modo de depuración, veo el programa atascado dentro de la función static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout()
. Para ser exactos, va primero dentro de este si y espera a que se reciba el siguiente carácter:
/* Wait until flag is set */
if(Status == RESET)
{
while(__HAL_UART_GET_FLAG(huart, Flag) == RESET)
{
/* Check for the Timeout */
if(Timeout != HAL_MAX_DELAY)
{
if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
...(otherstuff)
}