Hello, I recently bought RAK4631 with RAK19001 base board and Iam trying to make it working with PlatformIO. My problem is that, builded firmware wont upload to RAK4631 ref.
Processing wiscore_rak4631 (platform: nordicnrf52; board: wiscore_rak4631; framework: arduino)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/nordicnrf52/wiscore_rak4631.html
PLATFORM: Nordic nRF52 (10.2.0) > WisCore RAK4631 Board
HARDWARE: NRF52840 64MHz, 243KB RAM, 796KB Flash
DEBUG: Current (jlink) External (jlink, stlink)
PACKAGES:
- framework-arduinoadafruitnrf52 @ 1.10500.0 (1.5.0)
- framework-cmsis @ 2.50700.210515 (5.7.0)
- tool-adafruit-nrfutil @ 1.503.0 (5.3)
- tool-bossac-nordicnrf52 @ 1.10901.201022 (1.9.1)
- tool-openocd @ 3.1200.0 (12.0)
- tool-sreccat @ 1.164.0 (1.64)
- toolchain-gccarmnoneeabi @ 1.70201.0 (7.2.1)
Converting main.ino
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 13 compatible libraries
Scanning dependencies...
Dependency Graph
|-- Adafruit TinyUSB Library
|-- Wire @ 1.0
Building in release mode
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\Adafruit_TinyUSB_API.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\Adafruit_USBD_CDC.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\Adafruit_USBD_Device.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\Adafruit_USBH_Host.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\cdc\Adafruit_USBH_CDC.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\hid\Adafruit_USBD_HID.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\midi\Adafruit_USBD_MIDI.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\msc\Adafruit_USBD_MSC.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\msc\Adafruit_USBH_MSC.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\ports\esp32\Adafruit_TinyUSB_esp32.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\ports\nrf\Adafruit_TinyUSB_nrf.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\ports\rp2040\Adafruit_TinyUSB_rp2040.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\ports\samd\Adafruit_TinyUSB_samd.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\arduino\webusb\Adafruit_USBD_WebUSB.cpp.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\audio\audio_device.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\bth\bth_device.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\cdc\cdc_device.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\cdc\cdc_host.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\dfu\dfu_device.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\dfu\dfu_rt_device.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\hid\hid_device.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\hid\hid_host.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\midi\midi_device.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\msc\msc_device.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\msc\msc_host.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\net\ecm_rndis_device.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\net\ncm_device.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\usbtmc\usbtmc_device.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\vendor\vendor_device.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\class\video\video_device.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\common\tusb_fifo.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\device\usbd.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\device\usbd_control.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\host\hub.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\host\usbh.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\portable\chipidea\ci_hs\dcd_ci_hs.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\portable\chipidea\ci_hs\hcd_ci_hs.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\portable\microchip\samd\dcd_samd.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\portable\nordic\nrf5x\dcd_nrf5x.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\portable\raspberrypi\pio_usb\dcd_pio_usb.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\portable\raspberrypi\pio_usb\hcd_pio_usb.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\portable\raspberrypi\rp2040\dcd_rp2040.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\portable\raspberrypi\rp2040\hcd_rp2040.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\portable\raspberrypi\rp2040\rp2040_usb.c.o
Compiling .pio\build\wiscore_rak4631\lib8ec\Adafruit_TinyUSB_Arduino\tusb.c.o
Compiling .pio\build\wiscore_rak4631\src\main.ino.cpp.o
Compiling .pio\build\wiscore_rak4631\lib669\Wire\Wire_nRF52.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduinoVariant\variant.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\HardwarePWM.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\IPAddress.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\Print.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\RingBuffer.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\Stream.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\Tone.cpp.o
Archiving .pio\build\wiscore_rak4631\libFrameworkArduinoVariant.a
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\Uart.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\WInterrupts.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\WMath.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\WString.cpp.o
Indexing .pio\build\wiscore_rak4631\libFrameworkArduinoVariant.a
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\abi.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\avr\dtostrf.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\delay.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\freertos\Source\croutine.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\freertos\Source\event_groups.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\freertos\Source\list.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\freertos\Source\portable\MemMang\heap_3.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\freertos\Source\queue.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\freertos\Source\stream_buffer.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\freertos\Source\tasks.c.o
Archiving .pio\build\wiscore_rak4631\lib669\libWire.a
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\freertos\Source\timers.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\freertos\portable\CMSIS\nrf52\port_cmsis.c.o
Indexing .pio\build\wiscore_rak4631\lib669\libWire.a
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\freertos\portable\CMSIS\nrf52\port_cmsis_systick.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\freertos\portable\GCC\nrf52\port.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\hooks.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\itoa.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\linker\gcc_startup_nrf52.S.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\linker\gcc_startup_nrf52840.S.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\main.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\new.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\nordic\nrfx\drivers\src\nrfx_gpiote.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\nordic\nrfx\drivers\src\nrfx_power.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\nordic\nrfx\drivers\src\nrfx_pwm.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\nordic\nrfx\drivers\src\nrfx_qspi.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\nordic\nrfx\drivers\src\nrfx_spim.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\nordic\nrfx\drivers\src\nrfx_spis.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\nordic\nrfx\drivers\src\nrfx_timer.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\nordic\nrfx\mdk\system_nrf52.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\nordic\nrfx\mdk\system_nrf52840.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\pulse.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\pulse_asm.S.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\rtos.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\sysview\Config\SEGGER_SYSVIEW_Config_FreeRTOS.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\sysview\SEGGER\SEGGER_RTT.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\sysview\SEGGER\SEGGER_RTT_ASM_ARMv7M.S.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\sysview\SEGGER\SEGGER_RTT_printf.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\sysview\SEGGER\SEGGER_SYSVIEW.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\sysview\SEGGER_SYSVIEW_FreeRTOS.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\utility\AdaCallback.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\utility\SoftwareTimer.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\utility\adafruit_fifo.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\utility\debug.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\utility\utilities.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\wiring.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\wiring_analog.cpp.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\wiring_analog_nRF52.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\wiring_digital.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\wiring_private.c.o
Compiling .pio\build\wiscore_rak4631\FrameworkArduino\wiring_shift.c.o
Archiving .pio\build\wiscore_rak4631\libFrameworkArduino.a
Indexing .pio\build\wiscore_rak4631\libFrameworkArduino.a
Linking .pio\build\wiscore_rak4631\firmware.elf
Checking size .pio\build\wiscore_rak4631\firmware.elf
Building .pio\build\wiscore_rak4631\firmware.hex
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM: [ ] 2.9% (used 7176 bytes from 248832 bytes)
Flash: [= ] 5.3% (used 43080 bytes from 815104 bytes)
Building .pio\build\wiscore_rak4631\firmware.zip
Zip created at .pio\build\wiscore_rak4631\firmware.zip
Configuring upload protocol...
AVAILABLE: jlink, nrfjprog, nrfutil, stlink
CURRENT: upload_protocol = nrfutil
Looking for upload port...
Using manually specified: COM5
Forcing reset using 1200bps open/close on port COM5
Waiting for the new upload port...
Uploading .pio\build\wiscore_rak4631\firmware.zip
Upgrading target on COM5 with DFU package D:\Documents\PlatformIO\Projects\snaduz\.pio\build\wiscore_rak4631\firmware.zip. Flow control is disabled, Single bank, Touch disabled
Failed to upgrade target. Error is: WriteFile failed (PermissionError(13, 'The device does not recognize the command.', None, 22))
Traceback (most recent call last):
File "C:\Users\%USER\.platformio\packages\tool-adafruit-nrfutil\site-packages\nordicsemi\__main__.py", line 296, in serial
dfu.dfu_send_images()
File "C:\Users\%USER\.platformio\packages\tool-adafruit-nrfutil\site-packages\nordicsemi\dfu\dfu.py", line 235, in dfu_send_images
self._dfu_send_image(HexType.APPLICATION, self.manifest.application)
File "C:\Users\%USER\.platformio\packages\tool-adafruit-nrfutil\site-packages\nordicsemi\dfu\dfu.py", line 206, in _dfu_send_image
self.dfu_transport.send_firmware(firmware)
File "C:\Users\%USER\.platformio\packages\tool-adafruit-nrfutil\site-packages\nordicsemi\dfu\dfu_transport_serial.py", line 213, in send_firmware
self.send_packet(pkt)
File "C:\Users\%USER\.platformio\packages\tool-adafruit-nrfutil\site-packages\nordicsemi\dfu\dfu_transport_serial.py", line 241, in send_packet
self.serial_port.write(bytearray(pkt.data))
File "C:\Users\%USER\.platformio\packages\tool-adafruit-nrfutil\site-packages\serial\serialwin32.py", line 317, in write
raise SerialException("WriteFile failed ({!r})".format(ctypes.WinError()))
serial.serialutil.SerialException: WriteFile failed (PermissionError(13, 'The device does not recognize the command.', None, 22))
Possible causes:
- Selected Bootloader version does not match the one on Bluefruit device.
Please upgrade the Bootloader or select correct version in Tools->Bootloader.
- Baud rate must be 115200, Flow control must be off.
- Target is not in DFU mode. Ground DFU pin and RESET and release both to enter DFU mode.
==================================================================================== [SUCCESS] Took 14.38 seconds ====================================================================================
* Terminal will be reused by tasks, press any key to close it.
I tryed like everything- change COM or cable, re-flash firmware (with RUI3 firm. its working fine), run vscode in administrator mode. Also iam seeing RAK as USB with 3 files inside ( CURRENT.UF2, INDEX, INFO_UF2) and the green LED is dimming on and off, the blue LED stays off, so it should mean that there is no issue with DFU mode.
firmware build from INFO_UF2:
UF2 Bootloader 0.4.2 lib/nrfx (v2.0.0) lib/tinyusb (0.10.1-293-gaf8e5a90) lib/uf2
(remotes/origin/configupdate-9-gadbb8c7)
Model: WisBlock RAK4631 Board
Board-ID: WisBlock-RAK4631-Board
Date: Dec 1 2021
SoftDevice: S140 7.2.0
Programming on Windows, and as example i took some BLE example:
/**
@file ble_uart.ino
@author Bernd Giesecke ([email protected])
@brief BLE example shows how to implement UART over BLE
@version 0.1
@date 2020-07-27
@copyright Copyright (c) 2020
@note RAK4631 GPIO mapping to nRF52840 GPIO ports
RAK4631 <-> nRF52840
WB_IO1 <-> P0.17 (GPIO 17)
WB_IO2 <-> P1.02 (GPIO 34)
WB_IO3 <-> P0.21 (GPIO 21)
WB_IO4 <-> P0.04 (GPIO 4)
WB_IO5 <-> P0.09 (GPIO 9)
WB_IO6 <-> P0.10 (GPIO 10)
WB_SW1 <-> P0.01 (GPIO 1)
WB_A0 <-> P0.04/AIN2 (AnalogIn A2)
WB_A1 <-> P0.31/AIN7 (AnalogIn A7)
*/
#include <Arduino.h>
#include <bluefruit.h>
#include <Wire.h>
// Forward declarations for functions
void ble_connect_callback(uint16_t conn_handle);
void ble_disconnect_callback(uint16_t conn_handle, uint8_t reason);
/**
@brief BLE UART service
@note Used for BLE UART communication
*/
BLEUart g_BleUart;
/** Flag if BLE UART client is connected */
bool g_BleUartConnected = false;
/**
@brief Arduino setup function. Called once after power on or reset
*/
void setup()
{
// Initialize built in green LED
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
// Initialize Serial for debug output
Serial.begin(115200);
// Wait for USB Serial to be ready or terminal to be connected
time_t timeout = millis(); // Timeout in case the system runs on its own
// Waiting for Serial
while (!Serial)
{
if ((millis() - timeout) < 5000)
{
// Blink the LED to show that we are alive
delay(100);
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
else
{
// Timeout while waiting for USB Serial
break;
}
}
Serial.println("================================");
Serial.println("RAK4631 BLE UART example");
Serial.println("================================");
// Config the peripheral connection with maximum bandwidth
// more SRAM required by SoftDevice
// Note: All config***() function must be called before begin()
Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);
Bluefruit.configPrphConn(92, BLE_GAP_EVENT_LENGTH_MIN, 16, 16);
Bluefruit.begin(1, 0);
// Set max power. Accepted values are: -40, -30, -20, -16, -12, -8, -4, 0, 4
Bluefruit.setTxPower(4);
// Set the BLE device name
Bluefruit.setName("RAK4631_UART");
Bluefruit.Periph.setConnectCallback(ble_connect_callback);
Bluefruit.Periph.setDisconnectCallback(ble_disconnect_callback);
// Configure and Start BLE Uart Service
g_BleUart.begin();
// Set up and start advertising
// Advertising packet
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
Bluefruit.Advertising.addTxPower();
Bluefruit.Advertising.addName();
/* Start Advertising
- Enable auto advertising if disconnected
- Interval: fast mode = 20 ms, slow mode = 152.5 ms
- Timeout for fast mode is 30 seconds
- Start(timeout) with timeout = 0 will advertise forever (until connected)
For recommended advertising interval
https://developer.apple.com/library/content/qa/qa1931/_index.html
*/
Bluefruit.Advertising.restartOnDisconnect(true);
Bluefruit.Advertising.setInterval(32, 244); // in unit of 0.625 ms
Bluefruit.Advertising.setFastTimeout(30); // number of seconds in fast mode
Bluefruit.Advertising.start(0); // 0 = Don't stop advertising after n seconds
}
/**
@brief Callback when client connects
@param conn_handle: Connection handle id
*/
void ble_connect_callback(uint16_t conn_handle)
{
(void)conn_handle;
g_BleUartConnected = true;
Serial.println("BLE client connected");
}
/**
@brief Callback invoked when a connection is dropped
@param conn_handle: connection handle id
@param reason: disconnect reason
*/
void ble_disconnect_callback(uint16_t conn_handle, uint8_t reason)
{
(void)conn_handle;
(void)reason;
g_BleUartConnected = false;
Serial.println("BLE client disconnected");
}
/**
@brief Arduino loop. Runs forever until power off or reset
*/
void loop()
{
// Forward anything received from USB Serial to BLE UART
if (Serial.available() && g_BleUartConnected)
{
g_BleUart.print(Serial.readString());
}
// Forward anything received from BLE UART to USB Serial
if (g_BleUart.available())
{
Serial.print(g_BleUart.readString());
}
}
platformio.ini:
[env:wiscore_rak4631]
platform = nordicnrf52
board = wiscore_rak4631
framework = arduino
project structure:
Thanks