AnsweredAssumed Answered

STM32F0 irda -  Can't receive SIR Data

Question asked by Jong Hoo Yoon on Jun 28, 2017

Hi, I am trying to get data from IrDA SIR mode.

I setup that USART Port 2 is sending IrDA packet and USART Port 1 is receiving ( it similar to loop-back, wired USART2 TX and USART RX )

I can see the irda wave form on USART Port 2 TX Line, but I can't receive any data on USART Port 1.

I hope get any clue what am I missing

Thanks in advance.

 

Here is our code


IRDA_HandleTypeDef hirda_1;
IRDA_HandleTypeDef hirda_2;


void HAL_IRDA_MspInit(IRDA_HandleTypeDef *hirda)
{

   GPIO_InitTypeDef GPIO_InitStruct;
   if(hirda->Instance==USART1)
   {

      __HAL_RCC_USART1_CLK_ENABLE();


   GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
   GPIO_InitStruct.Pull = GPIO_NOPULL;
   GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
   GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


   }

 

   if(hirda->Instance==USART2)
   {

      __HAL_RCC_USART2_CLK_ENABLE();

      GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
      GPIO_InitStruct.Alternate = GPIO_AF1_USART2;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


   }

   }


void init_irda(int port )
{

if ( port == COM_SIR ) {
hirda_1.Instance = USART1;
hirda_1.Init.BaudRate = 115200;
hirda_1.Init.PowerMode = IRDA_POWERMODE_NORMAL;
hirda_1.Init.Parity = IRDA_PARITY_NONE;
hirda_1.Init.Prescaler = 1;
hirda_1.Init.Mode = IRDA_MODE_TX_RX;
hirda_1.Init.WordLength = IRDA_WORDLENGTH_8B;


if ( HAL_IRDA_Init(&hirda_1) != HAL_OK ) {

Printf("HAL IRDA INIT ERROR ---------\r\n");
}


} else if ( port == COM_BT ) {

 

   hirda_2.Instance = USART2;
   hirda_2.Init.BaudRate = 115200;
   hirda_2.Init.PowerMode = IRDA_POWERMODE_NORMAL;
   hirda_2.Init.Parity = IRDA_PARITY_NONE;
   hirda_2.Init.Prescaler = 1;
   hirda_2.Init.Mode = IRDA_MODE_TX_RX;
   hirda_2.Init.WordLength = IRDA_WORDLENGTH_8B;

   if ( HAL_IRDA_Init(&hirda_2) != HAL_OK ) {

   Printf("HAL IRDA INIT ERROR ---------\r\n");
   }


}


}

 

void irda_test()
{
   uint8_t Cmd[] = {0x80};
   uint8_t ret[10];

while(1) {
    int retval;
   memset(ret,0x0,5);
   Printf("Data Transmit\r\n");
   HAL_IRDA_Transmit(&hirda_2,(uint8_t *) Cmd,1,0xFFFF);
   retval = HAL_IRDA_Receive(&hirda_1,ret,1,1000);
   if ( retval != HAL_OK ) {
      Printf("HAL RECEIVE ERROR : %08x\r\n",retval);
   } else {
      Printf("Data Received : %02x\r\n",ret[0]);
   }
   JOSTimeDly(100);

   }

}

 

 

at Main.c 

{

<...>

 

init_irda(COM_SIR);
init_irda(COM_BT);

irda_test();

}

Outcomes