This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Nrf51822 with Modbus(TTL to RS485)

I am trying to send and receive a response from a machine using  Modbus (TTL to Rs485) and nrf51822.

Connections: R0 -> RX(P0.11) ,D1->TX(p0.09), RE&DE->P0.19,VCC->5V 

Just the same as to connect with Arduino (Have implemented with Arduino mega)

I am using Keil for programming and trying to send and receive in hexadecimal format, but I am not sure if even command is transmitted and obviously I am not getting any response.

I am not sure about connections also. Attaching code.

Please let me know where I am wrong.

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "app_uart.h"
#include "app_error.h"
#include "nrf_delay.h"
#include "nrf.h"
#include "bsp.h"

//#define ENABLE_LOOPBACK_TEST  /**< if defined, then this example will be a loopback test, which means that TX should be connected to RX to get data loopback. */

#define MAX_TEST_DATA_BYTES     (15U)                /**< max number of test bytes to be used for tx and rx. */
#define UART_TX_BUF_SIZE 256                         /**< UART TX buffer size. */
#define UART_RX_BUF_SIZE 256                         /**< UART RX buffer size. */

void uart_error_handle(app_uart_evt_t * p_event)
{
    if (p_event->evt_type == APP_UART_COMMUNICATION_ERROR)
    {
        APP_ERROR_HANDLER(p_event->data.error_communication);
    }
    else if (p_event->evt_type == APP_UART_FIFO_ERROR)
    {
        APP_ERROR_HANDLER(p_event->data.error_code);
    }
}
static uint8_t data_array[6];
void uart_event_handle(app_uart_evt_t * p_event)
{
   
    static uint8_t index = 0;
    uint32_t       err_code;

    switch (p_event->evt_type)
    {
        case APP_UART_DATA_READY:
            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
            index++;

            if ((data_array[index - 1] == '\n') || (index > 4))
            {
               // err_code = ble_nus_string_send(&m_nus, data_array, index);
//                if (err_code != NRF_ERROR_INVALID_STATE)
//                {
//                    APP_ERROR_CHECK(err_code);
//                }

                index = 0;
							nrf_gpio_pin_set(21);
							nrf_delay_ms(100);
							nrf_gpio_pin_clear(21);
            }
            break;

        case APP_UART_COMMUNICATION_ERROR:
            APP_ERROR_HANDLER(p_event->data.error_communication);
            break;

        case APP_UART_FIFO_ERROR:
            APP_ERROR_HANDLER(p_event->data.error_code);
            break;

        default:
            break;
    }
}

/**
 * @brief Function for main application entry.
 */
 uint8_t check_status[5] = {0x41,0x8E,0x7E,0x7F,0x6A};
int main(void)
{
    uint32_t err_code;

    bsp_board_leds_init();

    const app_uart_comm_params_t comm_params =
      {
          RX_PIN_NUMBER,
          TX_PIN_NUMBER,
          RTS_PIN_NUMBER,
          CTS_PIN_NUMBER,
          APP_UART_FLOW_CONTROL_DISABLED,
          false,
          UART_BAUDRATE_BAUDRATE_Baud9600
      };

    APP_UART_FIFO_INIT(&comm_params,
                         UART_RX_BUF_SIZE,
                         UART_TX_BUF_SIZE,
                         uart_event_handle,
                         APP_IRQ_PRIORITY_LOWEST,
                         err_code);

    APP_ERROR_CHECK(err_code);

//#ifndef ENABLE_LOOPBACK_TEST
    printf("\r\nStart: \r\n");
			nrf_gpio_cfg_output(19);
			nrf_gpio_cfg_output(21);
			    

     while(true)
	   {

			 nrf_gpio_pin_set(19);
		   nrf_delay_ms(55);
			for(int i=0; i<5;i++)
			{
				app_uart_put(check_status[i]);
			}
			nrf_delay_ms(2);
			nrf_gpio_pin_clear(19);
			nrf_delay_ms(3000);
	   }
       
  }

Parents
  • How did you test that the USB to TTL worked? Are you able to make the nRF51 and RS485 communicate if you don't transmit hex code? The RTS and CTS lines will be necessary if you're using hardware flow control in the UART communication.

    Please add any further information that might help to narrow down the cause of this issue.

    Best regards,

    Simon

Reply
  • How did you test that the USB to TTL worked? Are you able to make the nRF51 and RS485 communicate if you don't transmit hex code? The RTS and CTS lines will be necessary if you're using hardware flow control in the UART communication.

    Please add any further information that might help to narrow down the cause of this issue.

    Best regards,

    Simon

Children
Related