Hi,
I'm using ble_app_att_mtu_throughput to communicate some data from a nRF52832 to another one. I reached my goal (1.4Mbps) but now I would know what the two board communicate.
I menaged the code in particular:
in amt.h:
#define AMT_BYTE_TRANSFER_CNT (244 * 5)
instead of:
#define AMT_BYTE_TRANSFER_CNT (1024 * 1024)
just to manage well my 244 byte packets;
in the last part of amts.c I changed 244 with 1024, so:
static void char_notification_send(nrf_ble_amts_t * p_ctx)
{
uint8_t data[256];
uint16_t payload_len = p_ctx->max_payload_len;
nrf_ble_amts_evt_t evt;
if (p_ctx->bytes_sent >= AMT_BYTE_TRANSFER_CNT)
{
evt.bytes_transfered_cnt = p_ctx->bytes_sent;
evt.evt_type = NRF_BLE_AMTS_EVT_TRANSFER_FINISHED;
p_ctx->evt_handler(evt);
p_ctx->busy = false;
p_ctx->bytes_sent = 0;
p_ctx->kbytes_sent = 0;
return;
}
ble_gatts_hvx_params_t const hvx_param =
{
.type = BLE_GATT_HVX_NOTIFICATION,
.handle = p_ctx->amts_char_handles.value_handle,
.p_data = data,
.p_len = &payload_len,
};
uint32_t err_code = NRF_SUCCESS;
while (err_code == NRF_SUCCESS)
{
(void)uint32_encode(p_ctx->bytes_sent, data);
err_code = sd_ble_gatts_hvx(p_ctx->conn_handle, &hvx_param);
if (err_code == NRF_ERROR_RESOURCES)
{
// Wait for BLE_GATTS_EVT_HVN_TX_COMPLETE.
p_ctx->busy = true;
break;
}
else if (err_code != NRF_SUCCESS)
{
NRF_LOG_ERROR("sd_ble_gatts_hvx() failed: 0x%x", err_code);
}
p_ctx->bytes_sent += payload_len;
if (p_ctx->kbytes_sent != (p_ctx->bytes_sent / 244))
{
p_ctx->kbytes_sent = (p_ctx->bytes_sent / 244);
evt.evt_type = NRF_BLE_AMTS_EVT_PACKET_244B;
evt.bytes_transfered_cnt = p_ctx->bytes_sent;
p_ctx->evt_handler(evt);
}
}
}
instead of:
static void char_notification_send(nrf_ble_amts_t * p_ctx)
{
uint8_t data[256];
uint16_t payload_len = p_ctx->max_payload_len;
nrf_ble_amts_evt_t evt;
if (p_ctx->bytes_sent >= AMT_BYTE_TRANSFER_CNT)
{
evt.bytes_transfered_cnt = p_ctx->bytes_sent;
evt.evt_type = NRF_BLE_AMTS_EVT_TRANSFER_FINISHED;
p_ctx->evt_handler(evt);
p_ctx->busy = false;
p_ctx->bytes_sent = 0;
p_ctx->kbytes_sent = 0;
return;
}
ble_gatts_hvx_params_t const hvx_param =
{
.type = BLE_GATT_HVX_NOTIFICATION,
.handle = p_ctx->amts_char_handles.value_handle,
.p_data = data,
.p_len = &payload_len,
};
uint32_t err_code = NRF_SUCCESS;
while (err_code == NRF_SUCCESS)
{
(void)uint32_encode(p_ctx->bytes_sent, data);
err_code = sd_ble_gatts_hvx(p_ctx->conn_handle, &hvx_param);
if (err_code == NRF_ERROR_RESOURCES)
{
// Wait for BLE_GATTS_EVT_HVN_TX_COMPLETE.
p_ctx->busy = true;
break;
}
else if (err_code != NRF_SUCCESS)
{
NRF_LOG_ERROR("sd_ble_gatts_hvx() failed: 0x%x", err_code);
}
p_ctx->bytes_sent += payload_len;
if (p_ctx->kbytes_sent != (p_ctx->bytes_sent / 1024))
{
p_ctx->kbytes_sent = (p_ctx->bytes_sent / 1024);
evt.evt_type = NRF_BLE_AMTS_EVT_PACKET_244B;
evt.bytes_transfered_cnt = p_ctx->bytes_sent;
p_ctx->evt_handler(evt);
}
}
}
then in amt.h I added NRF_BLE_AMTS_EVT_PACKET_244B:
typedef enum
{
NRF_BLE_AMTS_EVT_NOTIF_ENABLED,
NRF_BLE_AMTS_EVT_NOTIF_DISABLED,
NRF_BLE_AMTS_EVT_TRANSFER_1KB,
NRF_BLE_AMTS_EVT_PACKET_244B,
NRF_BLE_AMTS_EVT_TRANSFER_FINISHED,
} nrf_ble_amts_evt_type_t;
so in the main I used NRF_BLE_AMTS_EVT_PACKET_244B instead of NRF_BLE_AMTS_EVT_PACKET_1KB:
case NRF_BLE_AMTS_EVT_PACKET_244B:
{
NRF_LOG_INFO("Packet sent");
bsp_board_led_on(PROGRESS_LED);
nrf_delay_ms(0.5);
bsp_board_led_off(PROGRESS_LED);
} break;
So I did this modifications to trigger the case NRF_BLE_AMTS_EVT_PACKET_244B each 244B instead of 1KB, blinking one of the led on the board.
What I noticed is that if I send at least 4 packets (so AMT_BYTE_TRANSFER_CNT >= 244*4) it's ok, but if I send less than 4 packets from the terminal I see that I receive however 4 packets. For example, if I set AMT_BYTE_TRANSFER_CNT = 244*2, that's what I see on PuTTY terminal:
Central:
as you see "Sent 976 bytes of ATT payload" which are 244*4, meanwhile on the peripheral happen the same:

May you can say me, since I did some modifications, if I should manage something else?
Thanks.
