Conectando SIM900 a STM32F4 Nucleo

1

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)
  }
    
pregunta bex

3 respuestas

1

Primero quiero agradecerte por todas las contribuciones para encontrar la respuesta correcta y he probado todas las soluciones que sugeriste.

Después de dedicar mucho tiempo a leer la documentación de SIM900, descubrí que el problema está en los pines de E / S del módem. Estaba usando el escudo Arduino GSM con la placa Nucleo y el pin 07 de SIM900 resultó ser el pin Tx. Pensé que es el pin 08 que debería usarse para Tx pero es todo lo contrario.

En otras palabras, (Rx) 07 en el módem significa que 07 es un pin de transmisión y debe estar conectado al pin de recepción del otro dispositivo.

    
respondido por el bex
1

Estoy usando una SIM900 con un MCU diferente. No puedo comentar su código como tal, pero como otros han mencionado, el SIM900 es muy exigente con respecto a la fuente de alimentación. Asegúrese de que está dando 4.5V. Poner algunos condensadores de derivación por si acaso. Teníamos un inductor en la potencia de entrada que causó algunos problemas. No estoy seguro de lo que estaba pasando, pero una vez que se reemplazó ese inductor por uno corto, obtuvimos resultados mucho mejores.

¿Está monitoreando las luces de estado desde el SIM900? Está diseñado para tener dos LED, uno en el pin 66 - STATUS , y uno en el pin 52 - NETLIGHT . La luz de estado debe estar encendida continuamente, y el LED netlight debe estar parpadeando (lento si hay red, rápido si no lo hay). Si no enciendes correctamente el SIM900, no obtendrás nada de vuelta (a excepción de tal vez algunas bromas de vez en cuando).

    
respondido por el LShaver
0

Está bien. Este es el código que utilicé para el modo de recepción solo USART a 9600 Baud Rate. Asegúrese de que sus motivos sean comunes, o de lo contrario no funcionará.

void USART1_Init(void)
{



RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB , ENABLE);


  /* Configure USART1 pins:  Rx * - PB7 Alternative as TIM1 uses 4 channel PWM generation */

  GPIO_RX_Pin.GPIO_Pin =  GPIO_Pin_7;
  GPIO_RX_Pin.GPIO_Speed = GPIO_Speed_Level_1;
  GPIO_RX_Pin.GPIO_Mode = GPIO_Mode_AF;
  GPIO_RX_Pin.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOB, &GPIO_RX_Pin);

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_0);
    /* Configure USART1 */

UART1_BT.USART_BaudRate = 9600;
UART1_BT.USART_WordLength = USART_WordLength_8b;
UART1_BT.USART_StopBits = USART_StopBits_1;
UART1_BT.USART_Parity = USART_Parity_No ;
UART1_BT.USART_Mode = USART_Mode_Rx;
UART1_BT.USART_HardwareFlowControl = USART_HardwareFlowControl_None;


USART_Init(USART1, &UART1_BT);

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  // ONLY RX mode config
NVIC_EnableIRQ(USART1_IRQn);    //NVIC enables the IRQ
USART_Cmd(USART1, ENABLE);


}

Aquí estoy usando CooCox con bibliotecas incorporadas para la implementación rápida de código Estaba usando la placa de descubrimiento STM32F0, por lo que los pines y las funciones son diferentes. Especialmente la asignación de la función alternativa. Usé un controlador para recibir desde el pin RX. Aquí va.

void USART1_IRQHandler(void)
{

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) /* RXNE if set, then data is received in DR register.*/
{
    USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    char a;


    a = USART_ReceiveData(USART1);
}
    
respondido por el ammar.cma

Lea otras preguntas en las etiquetas