Skip to content

XIAO BLE nrf52840 bare minimum working code, need help! #267

@tomasz90

Description

@tomasz90

Hi!
I tried to flash my xiao ble with some firmware which I found on github, but none of them worked with this uc. I had success with esp32, but in my opinion this is rather poor choice, because of high battery consumption.
Can you tell me where is the bug in my code? I tried almost anything, but cant make it working... Microcontoler is advertising, but can't be picked up by nearby devices.. I didn't include key shuffling, cause I wanted to have bare minimum code which actually works. Here is my code:

#include <bluefruit.h>
#include <cstring>

#define ADVERTISING_CYCLE_DURATION_MS 1000
#define ADVERTISING_INTERVAL_MS 20
#define LIGHT_SLEEP_INTERVAL_MS (ADVERTISING_CYCLE_DURATION_MS - ADVERTISING_INTERVAL_MS)
#define ADVERTISING_INTERVAL_TICKS 32 // 20ms

static uint8_t public_key[28] = { /* here Advertisement key converted from base64 to hex? */};

static uint8_t adv_payload[] = {
        0x1e, /* Length (30) */
        0xff,
        0x4c, 0x00, /* Company ID (Apple) */
        0x12, 0x19, /* Offline Finding type and length */
        0x00,       /* State */
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, /* First two bits */
        0x00, /* Hint (0x00) */
};

void setBleAddress() {
    uint8_t addr[6];

    addr[0] = public_key[0] | 0b11000000;
    addr[1] = public_key[1];
    addr[2] = public_key[2];
    addr[3] = public_key[3];
    addr[4] = public_key[4];
    addr[5] = public_key[5];

    ble_gap_addr_t gap_addr;

    // Set the address type (example: public address)
    gap_addr.addr_type = 0x01; //this was in esp32: BLE_ADDR_TYPE_RANDOM = 0x01

    // Copy the address into the structure
    std::memcpy(gap_addr.addr, addr, BLE_GAP_ADDR_LEN);

    // Set the address using the setAddr method
    Bluefruit.setAddr(&gap_addr);
}

void setPayloadFromPubKey() {
    /* copy last 22 bytes */
    memcpy(&adv_payload[7], &public_key[6], 22);
    /* append two bits of public key */
    adv_payload[29] = public_key[0] >> 6;
}

void setup() {
    Serial.begin(115200);

    setPayloadFromPubKey();

    setBleAddress();

    while (!Bluefruit.begin()) {
        Serial.println("Retrying...");
        delay(500);
    }

    Bluefruit.Advertising.setType(BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED);
    Bluefruit.Advertising.setInterval(ADVERTISING_INTERVAL_TICKS, ADVERTISING_INTERVAL_TICKS);

    // Set advertising payload
    Bluefruit.Advertising.setData(adv_payload, sizeof(adv_payload));
}

void loop() {
    Bluefruit.Advertising.start();
    delay(ADVERTISING_INTERVAL_MS);
    Bluefruit.Advertising.stop();
    delay(LIGHT_SLEEP_INTERVAL_MS);
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions