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);
}
}