cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F0 WITH RN2485 LORA,RADIO TX RESPONSE ISSUE

akshay bansod
Associate II
Posted on March 17, 2018 at 12:33

Hello,

I have a customized board for STM32F030R8x microcontroller interfaced with Microchip Lora Module RN2483 over UART.

I want to establish P2P connection between Lora module. 

When i am connecting the modules directly over serial port using TTL converter(for testing purpose) and sending the AT commands to i am getting proper response for each command and data is been transmitted and received between modules.

Now when i am connecting my stm32 uart pins to lora module as a transmitter, i need my ADC value to be transmitted to the receiver module.

I am getting proper response from module in 

aRxBuffer this variable for reset & mac pause..

but when i am sending radio tx <adc_data>\r\n i need to get 2 responses for that one is 'ok\r\n' & 'radio_ok_tx'.

For my first ADC Tx i am Getting the first response but for second response in am receiving only char 'r'. And on my second ADC Tx onward it shows response as 'invalid parameter'.

Thank you .

following is the code for main:

#include 'main.h'

#include 'stm32f0xx_hal.h'

#include 'adc.h'

#include 'usart.h'

#include 'gpio.h'

#include <string.h>

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

uint8_t aTxStartMessage3[] = 'mac pause\r\n';

uint8_t cmd_pwr[] = 'radio set pwr 14\r\n';

char aTxStartMessage4[] = 'radio tx ';

char aTxStartMessage5[] = '123123\r\n';

/* Buffer used for reception */

uint8_t rx_index;

volatile uint8_t aRxBuffer[200];

int buftrack=0;

char CRLF[2]={'\r','\n'};

uint32_t adc_conversion;

char adc_data[6]={0};

char cmd2send[20]={0};

void SystemClock_Config(void);

int main(void)

{

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_USART1_UART_Init();

MX_ADC_Init();

HAL_UART_Receive_IT(&huart1, &rx_index, 1);         // UART Rx interrupt activated

HAL_Delay(1000);

HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);        //Toggling reset pin

HAL_Delay(1000);

//MAC PAUSE COMMAND...................

HAL_UART_Transmit(&huart1, aTxStartMessage3, sizeof(aTxStartMessage3),0XFFFF);

HAL_Delay(500);

HAL_ADC_Start(&hadc);

while (1)

{

if(HAL_ADC_PollForConversion(&hadc, 1000) == HAL_OK)

{

adc_conversion = HAL_ADC_GetValue(&hadc);

sprintf(adc_data, '%d', adc_conversion);

}

strcpy(cmd2send,aTxStartMessage4);

strcat(cmd2send,adc_data);

strcat(cmd2send,CRLF);

HAL_UART_Transmit_IT(&huart1, (uint8_t *)&cmd2send, sizeof(cmd2send));

HAL_Delay(1000);

}

}

-----------------------------------------------below is UART Rx interrupt call back function

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

/* Prevent unused argument(s) compilation warning */

UNUSED(huart);

if(rx_index!='\n')

{

aRxBuffer[buftrack]=rx_index;

buftrack++;

}

/*else if(aRxBuffer[0]=='o')

{

HAL_UART_Transmit(&huart1, (uint8_t *)dummy, sizeof(dummy),0xFFFF);

}*/

else

{

buftrack=0;

for(int i=0;i<200;i++)

{

aRxBuffer[i]=0;

}

rx_index=0;

}

/* NOTE : This function should not be modified, when the callback is needed,

the HAL_UART_RxCpltCallback can be implemented in the user file

*/

//HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);

HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx_index, 1);

}

------------------------------------below is system clock config-----------------

void SystemClock_Config(void)

{

RCC_OscInitTypeDef RCC_OscInitStruct;

RCC_ClkInitTypeDef RCC_ClkInitStruct;

RCC_PeriphCLKInitTypeDef PeriphClkInit;

/**Initializes the CPU, AHB and APB busses clocks

*/

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI14|RCC_OSCILLATORTYPE_HSE;

RCC_OscInitStruct.HSEState = RCC_HSE_ON;

RCC_OscInitStruct.HSI14State = RCC_HSI14_ON;

RCC_OscInitStruct.HSI14CalibrationValue = 16;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL10;

RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV2;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

_Error_Handler(__FILE__, __LINE__);

}

/**Initializes the CPU, AHB and APB busses clocks

*/

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)

{

_Error_Handler(__FILE__, __LINE__);

}

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;

PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;

if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

{

_Error_Handler(__FILE__, __LINE__);

}

/**Configure the Systick interrupt time

*/

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

/**Configure the Systick

*/

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

/* SysTick_IRQn interrupt configuration */

HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}

-------------------------------below uart.c code-----------------------------------------------------

UART_HandleTypeDef huart1;

/* USART1 init function */

void MX_USART1_UART_Init(void)

{

huart1.Instance = USART1;

huart1.Init.BaudRate = 57600;

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;

huart1.Init.OverSampling = UART_OVERSAMPLING_16;

huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;

huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

if (HAL_UART_Init(&huart1) != HAL_OK)

{

_Error_Handler(__FILE__, __LINE__);

}

}

4 REPLIES 4
Posted on March 17, 2018 at 14:04

Not sure there are a lot of RN2485 users here, a lot of us doing LoRa with the STM32 typically connect to an SX1272/1276 radio directly.

I would stop doing this

HAL_UART_Transmit_IT(&huart1, (uint8_t *)&cmd2send, sizeof(cmd2send));

use strlen(cmd2send) otherwise you're going to send a lot of unwanted characters to confuse the modem.

If you use sizeof() on a preformed string, it will result in sending a NUL to the modem.

char aTxStartMessage4[] = 'radio tx ';

sizeof() will be one character longer than you want.

Also be aware that sprintf() will return the length of the string it just created, so consider using the formatting in one step to create the out going string message.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
akshay bansod
Associate II
Posted on March 19, 2018 at 05:54

Thank you

Turvey.Clive.002

for your suggestion.

Andrew Neil
Evangelist III
Posted on March 19, 2018 at 12:21

i am sending radio tx <adc_data>\r\n

Note that AT commands should be terminated with \r (ie, CR) only - the \n (LF) is superfluous.

akshay bansod
Associate II
Posted on March 20, 2018 at 06:50

Thanks Andrew Neil. Point Noted.