fanstel blg840F not sending at comment reply

I recently bought a fanstel blg840 device, and I have programmed At client firmware in nrf91 and custom code into nrf52, but the problem is nrf52 is sending at comments to the nrf9160, but it doesn't reply back? Do you have any idea of this?              this is my code 

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <nrf.h>
#include <nrfx_uart.h>
#include <core_cm4.h>
#include "SEGGER_RTT.h"

#define UART_TX_PIN 6
#define UART_RX_PIN 8
#define UART_BAUD_RATE NRF_UART_BAUDRATE_115200

#define MAX_RETRIES 3
#define RETRY_DELAY_MS 2000
#define SERVER_URL "example.com"
#define SERVER_PORT 443
#define HTTPS 1
#define API_PATH "/api/telemetry"

static const nrfx_uart_t uart = NRFX_UART_INSTANCE(0);
static nrfx_uart_config_t uart_config = NRFX_UART_DEFAULT_CONFIG;

void uart_init(void);
bool uart_send_command(const char *cmd, char *response, size_t response_size);
bool check_sim_status(void);
bool connect_network(void);
bool send_telemetry(void);
void manage_connection(void);
void delay_ms(int ms);
void reset_modem(void);
void disconnect_network(void);

// ========== UART Init ==========
void uart_init(void) {
SEGGER_RTT_WriteString(0, "Initializing UART...\n");
uart_config.pseltxd = UART_TX_PIN;
uart_config.pselrxd = UART_RX_PIN;
uart_config.hwfc = NRF_UART_HWFC_DISABLED;
uart_config.parity = NRF_UART_PARITY_EXCLUDED;
uart_config.baudrate = UART_BAUD_RATE;
uart_config.interrupt_priority = APP_IRQ_PRIORITY_LOW;
nrfx_uart_init(&uart, &uart_config, NULL);
SEGGER_RTT_WriteString(0, "UART Initialized.\n");
}

// ========== UART Send Command ==========
bool uart_send_command(const char *cmd, char *response, size_t response_size) {
SEGGER_RTT_printf(0, "Sending command: %s\n", cmd);

nrfx_uart_tx(&uart, (const uint8_t*)cmd, strlen(cmd));
nrfx_uart_tx(&uart, (const uint8_t*)"\r\n", 2);

int i = 0;
while (i < (int)response_size - 1) {
if (nrfx_uart_rx(&uart, (uint8_t*)&response[i], 1) == NRFX_SUCCESS) {
if (response[i] == '\n') break;
i++;
}
}
response[i] = '\0';

SEGGER_RTT_printf(0, "Received response: %s\n", response);
return true;
}

// ========== SIM Status ==========
bool check_sim_status(void) {
char response[256];
SEGGER_RTT_WriteString(0, "Checking SIM status...\n");
uart_send_command("AT+CPIN?", response, sizeof(response));
bool ready = strstr(response, "READY") != NULL;
SEGGER_RTT_printf(0, "SIM status: %s\n", ready ? "READY" : "NOT READY");
return ready;
}

// ========== Connect Network ==========
bool connect_network(void) {
char response[256];
SEGGER_RTT_WriteString(0, "Connecting to network...\n");

if (!check_sim_status()) {
SEGGER_RTT_WriteString(0, "SIM not ready, cannot connect.\n");
return false;
}

uart_send_command("AT+CFUN=1", response, sizeof(response));
delay_ms(1000);

uart_send_command("AT+COPS=0", response, sizeof(response));
delay_ms(1000);

uart_send_command("AT+CGATT=1", response, sizeof(response));
delay_ms(1000);

uart_send_command("AT+CGATT?", response, sizeof(response));
bool connected = strstr(response, ": 1") != NULL;
SEGGER_RTT_printf(0, "Network attach status: %s\n", connected ? "Attached" : "Not attached");
return connected;
}

// ========== Disconnect Network ==========
void disconnect_network(void) {
char response[256];
SEGGER_RTT_WriteString(0, "Disconnecting network...\n");
uart_send_command("AT+CGATT=0", response, sizeof(response));
uart_send_command("AT+CFUN=0", response, sizeof(response));
SEGGER_RTT_WriteString(0, "Network disconnected.\n");
}

// ========== Reset Modem ==========
void reset_modem(void) {
SEGGER_RTT_WriteString(0, "Resetting modem...\n");
disconnect_network();
delay_ms(3000); // Simulate power cycle delay
SEGGER_RTT_WriteString(0, "Modem reset done.\n");
}

// ========== Send Telemetry ==========
bool send_telemetry(void) {
char response[256];
char cmd[256];
const char *body = "{\"count\":60}";
int body_len = strlen(body);

SEGGER_RTT_WriteString(0, "Opening HTTP connection...\n");
snprintf(cmd, sizeof(cmd), "AT#XHTTPCCON=\"%s\",%d,%d", SERVER_URL, SERVER_PORT, HTTPS);
uart_send_command(cmd, response, sizeof(response));
if (strstr(response, "OK") == NULL) {
SEGGER_RTT_WriteString(0, "Failed to open HTTP connection.\n");
return false;
}

SEGGER_RTT_WriteString(0, "Sending HTTP POST...\n");
snprintf(cmd, sizeof(cmd), "AT#XHTTPCREQ=0,\"POST\",\"%s\",\"Content-Type: application/json\",%d", API_PATH, body_len);
uart_send_command(cmd, response, sizeof(response));
uart_send_command(body, response, sizeof(response));

if (strstr(response, "200 OK") == NULL) {
SEGGER_RTT_WriteString(0, "HTTP POST failed or no 200 OK.\n");
return false;
}

uart_send_command("AT#XHTTPDIS", response, sizeof(response));
SEGGER_RTT_WriteString(0, "HTTP session closed.\n");

return true;
}

// ========== Reconnection Strategy ==========
void manage_connection(void) {
int retries = 0;
SEGGER_RTT_WriteString(0, "Managing connection...\n");
while (retries < MAX_RETRIES) {
if (connect_network()) {
SEGGER_RTT_WriteString(0, "Connected to network successfully.\n");
return;
}
retries++;
SEGGER_RTT_printf(0, "Connection attempt %d failed. Retrying...\n", retries);
delay_ms(RETRY_DELAY_MS);
}

SEGGER_RTT_WriteString(0, "Max retries reached. Resetting modem...\n");
reset_modem();

retries = 0;
while (retries < MAX_RETRIES) {
if (connect_network()) {
SEGGER_RTT_WriteString(0, "Connected after modem reset.\n");
return;
}
retries++;
SEGGER_RTT_printf(0, "Retry after reset attempt %d failed.\n", retries);
delay_ms(RETRY_DELAY_MS);
}

SEGGER_RTT_WriteString(0, "Final escalation: MCU Reset!\n");
NVIC_SystemReset();
}

// ========== Delay ==========
void delay_ms(int ms) {
for (int i = 0; i < ms * 1000; i++) __NOP();
}

// ========== Main ==========
int main(void) {
SEGGER_RTT_WriteString(0, "Starting application...\n");
uart_init();
manage_connection();

while (1) {
if (!send_telemetry()) {
SEGGER_RTT_WriteString(0, "Telemetry send failed. Re-managing connection...\n");
manage_connection();
}
delay_ms(10000); // 10 sec delay between telemetry posts
}

return 0;
}

   

  • Hello Thanu,
    I'd like to ask some basic question initially just to be sure. Are you able to program both of these devices separately? They are powered up and code is running on them? Can you see for example that the stack pointer is moving?
    Q1: You are sending commands from the nRF52, are you sure they are sent in the expected way? Are you able to see the command activity with an oscillioscope?
    Q2: Are you getting or seeing any signal coming out of the nRF91 indicating that it is listening or rejecting incoming commands?
    Q3: It seems you have enabled RTT, is that on both the nRF52 and nRF91, what is it printing?
    Best regards
    Asbjørn
Related