燒錄Micropython 1.12至nRF52840 Dongle

前面貼文曾提到如何把Micropython燒錄到nRF52840-DK, 現在談談如何燒錄到nRF52840 Dongle。畢竟Dongle體積小巧,便宜。要整合到自己的專案,可行性較高。

首先nRF52840 Dongle (pca10059)是沒有除錯器的,所以我們要準備外部的除錯器,最常見的除錯器就是JLink。如果你手上有nRF52840-DK的開發板,這個板子上就有JLink OB除錯器。可以參考Eric Pietrowicz的貼文,雖然他在談的是把CircuitPython燒錄到nRF52840 Dongle的方法,但其實作法本質是一樣的。

另外nRF52840 Dongle也被Google的一個開源專案OpenSK使用,同樣也要燒錄其firmware到板子上去。所以作法類似,但他們使用一種叫做TC2050的特別線,這條線不便宜,好處是可以不用焊接。但我想反正pca10059不貴,而且之後也會接一些元件來玩,總之是會焊東西上去的,也就不在意現在焊幾個jumper。

因為我一開始把一塊pca10059弄壞了,所以先警告大家要小心!
不過,後來我又把這塊板子救回來了,過程大概是這樣的,我先依照Eric Pietrowicz的接線方法,把nRF52840-DK當做除錯器來使用,主要是使用P20的接頭來接線到pca10059的(VBUS, GND, SWDIO, SWDCLK)。然後下:

nrfjprog --family nrf52 --eraseall
nrfjprog --program build-pca10059-s140/firmware.hex --sectoranduicrerase -f nrf52 --reset

看起來沒有錯誤訊息,就試著把pca10059接到USB埠去,結果使用終端機去連都沒有反應。
之後我懷疑前面的燒錄並沒有成功,是不是燒到nRF52840-DK自己的晶片去了?就使用nRF Connect的programmer檢查,果然pca10059原本的bootloader還在,nRF Connect的programmer還可以連得上,也可以燒錄firmware上去。這可能要怪我當時並沒有把接腳焊好,而只是用線繞繞,甚至用膠帶貼著,或者用手壓住而己有關。總之,之後下nrfjprog --family nrf52 --eraseall還可以看到正常的訊息回應。但下一個指令nrfjprog --program build-pca10059-s140/... 就一直出現錯誤訊息,說寫不進去,無法抺除之類的。後來我想是不是沒把flash清除乾淨,就在用nRF52840-DK連著pca10059的情況下用nRF Connect的programmer按下了erase all這個按鍵。結果卡了很久就不動了!只好斷電後再重試,結果就都沒反應了。

好,以上是錯誤示範,不要跟著做哦!

那要怎麼救呢?
其實Nordic有一個貼文有教,其中有一段標題Recover after an accidental UICR erase就說 for recovering when the REG0 (VDD) voltage is 1.8 V (typically after a UICR erase):當REG0(VDD)電壓在UICR清除後變成1.8V時,可以有兩個方案:
1. 使用JLink PRO (它有自適應電壓的能力)
2. 把SB2切斷,SB1連通,除錯器的VDD接到pca10059的VDD OUT,再做燒錄動作。
所以我先把pca10059接上USB埠,用三用電表來量電壓,果然VDD OUT的電壓是1.8V。看來就是這個問題沒錯,而我手上沒有那個高貴的Jlink PRO。所以只能選擇第二個方法,但請注意這個方式焊接技術要稍為練一下,而且也要會解焊哦。SB1, SB2位置如下圖。

截圖自nRF52840 Dongle PCA10059 v1.0.0 User Guide v1.1 p.12

所以同樣的使用Eric Pietrowicz的接線方法,但SB2切斷,SB1焊成連通,而且nRF52840-DK的VDD接到pca10059的VDD OUT(不是VBUS哦)。這個時候,再進入Micropython原始程式的目錄,切換到ports/nrf子目錄後,下以下(第1行)指令:

% make BOARD=pca10059 SD=s140 sd                                                           
Use make V=1 or set BUILD_VERBOSE in your environment to increase build verbosity.
GEN build-pca10059-s140/genhdr/mpversion.h
CC modules/uos/moduos.c
CC ../../lib/utils/pyexec.c
LINK build-pca10059-s140/firmware.elf
   text   data     bss     dec     hex filename
 162124     36   4748 166908   28bfc build-pca10059-s140/firmware.elf
arm-none-eabi-objcopy -O ihex build-pca10059-s140/firmware.elf build-pca10059-s140/firmware.hex
nrfjprog --eraseall -f nrf52
Erasing user available code and UICR flash areas.
Applying system reset.
nrfjprog --program drivers/bluetooth/s140_nrf52_6.1.1/s140_nrf52_6.1.1_softdevice.hex -f nrf52
Parsing hex file.
Reading flash area to program to guarantee it is erased.
Checking that the area to write is not protected.
Programming device.
nrfjprog --program build-pca10059-s140/firmware.hex --sectorerase -f nrf52
Parsing hex file.
Erasing page at address 0x26000.
Erasing page at address 0x27000.
Erasing page at address 0x28000.
Erasing page at address 0x29000.
Erasing page at address 0x2A000.
Erasing page at address 0x2B000.
Erasing page at address 0x2C000.
Erasing page at address 0x2D000.
Erasing page at address 0x2E000.
Erasing page at address 0x2F000.
Erasing page at address 0x30000.
Erasing page at address 0x31000.
Erasing page at address 0x32000.
Erasing page at address 0x33000.
Erasing page at address 0x34000.
Erasing page at address 0x35000.
Erasing page at address 0x36000.
Erasing page at address 0x37000.
Erasing page at address 0x38000.
Erasing page at address 0x39000.
Erasing page at address 0x3A000.
Erasing page at address 0x3B000.
Erasing page at address 0x3C000.
Erasing page at address 0x3D000.
Erasing page at address 0x3E000.
Erasing page at address 0x3F000.
Erasing page at address 0x40000.
Erasing page at address 0x41000.
Erasing page at address 0x42000.
Erasing page at address 0x43000.
Erasing page at address 0x44000.
Erasing page at address 0x45000.
Erasing page at address 0x46000.
Erasing page at address 0x47000.
Erasing page at address 0x48000.
Erasing page at address 0x49000.
Erasing page at address 0x4A000.
Erasing page at address 0x4B000.
Erasing page at address 0x4C000.
Erasing page at address 0x4D000.
Applying system reset.
Checking that the area to write is not protected.
Programming device.
nrfjprog --reset -f nrf52
Applying system reset.
Run.
% 

所有的訊息都很正常,把pca10059身上的接線都移除後,記得之前我們把SB2切斷,SB1焊成連通吧!現在要回復回來,也就是SB1要解焊成切斷狀態,SB2要焊成連通。然後再把pca10059插到USB埠去。此時並沒有看到發生什麼事,也沒有任何一顆LED燈有亮。但是下以下指令:

 % ls -l /dev/cu*
crw-rw-rw-  1 root  wheel   18,   1  4  1 15:32 /dev/cu.Bluetooth-Incoming-Port
crw-rw-rw-  1 root  wheel   18,   3  4 21 09:59 /dev/cu.usbmodem0000000000001

發現多了一個裝置!所以下screen /dev/cu.usbmodem000...01 115200
就看到:


哇!成功了,試了一下把LED燈點亮一顆,也成功了。


所以也許不用那麼辛苦的玩SB1, SB2。使用Eric Pietrowicz的接線方法,直接下make BOARD=pca10059 SD=s140 sd可能就會成功了!以上是我的猜想,我還沒試過,但不用擔心,至少還有SB1, SB2可以救你。

2020/4/23 補充
    昨天google資料時看到有網友kak提到安裝Micropython到nRF52840 Dongle的作法,他用的是nRF Connect。剛才嘗試了一下也是可以成功的,這個方式採用Dongle本身原來內建的Bootloader, 不需要另外準備除錯器;而且也不用焊接,也不用買很貴的TC2050線。只要用nRF Connect把以下兩個檔案燒進去就可以:

  build-pca10059-s140/firmware.elf build-pca10059-s140/firmware.hex
  drivers/bluetooth/s140_nrf52_6.1.1/s140_nrf52_6.1.1_softdevice.hex 

以上目錄相對於micropython/ports/nrf
請參看之前貼文了解如何取得這些檔案
但是這個方式做出來的板子,雖然可以用串列埠連進去REPL,也可以打程式,但是原本可以將程式存到Flash的,現在卻存不進去了!還不確定是不是因為燒錄方式不同造成的,改天再用除錯器燒一次,就知道了。

2020/5/1 補充
 試著再用除錯器燒錄一次,結果就可以正常的把python程式存到Flash的檔案系統去了。

後來不知為何,用USB供電的方式出了問題,VDD Out怎麼量都會是0.4V,只在我把除錯器也連上去時才會變成正常的3V! 用之前的方法回復成原廠狀態也是一樣。而且如下圖,high voltage regulator的輸出電壓最低也是1.8V,沒有0.4V的選項!



看來是做出了一塊磚塊,有點可惜這個板子。不過,可以這樣用就不用把它丢掉了:就是由外部供電,把SB2切斷SB1焊通,弄個電池盒,正極接到VDD Out。還是可以插到USB埠去,原來的nRF Connect for Desktop應用程式還是可以正常使用,COM埠功能也可以正常使用;除錯器的使用還更穩定,也不用思考是不是要切換SB1,SB2。由USB埠拔下後,藍牙功能因為由電池供電還更方便使用呢。

==============================================================
2023/5/18 更新
==============================================================

時過3年, MicroPython由2020時的1.12版, 現在已更新到1.20了, nRF52840 Dongle也老了, 我手上這批都是2019生產的。現在再來看看要安裝MicroPython到nRF52840 Dongle上是不是簡單多了, 以前那些奇怪的問題都已經解掉了吧!


到MicroPython的nRF52840 Dongle (pca10059)的下載網頁https://micropython.org/download/pca10059/查看一下:
發現現在的firmware是給.hex檔, 3年前記得是給.uf2之類的檔, 如此那就試試直接使用nRFConnect for Desktop裡的Programmer, 把這個.hex檔直接拖拉進去, 然後按write, 就完成燒錄MicroPython到這個板子上的動作了! 
此時Programmer原本認得到這個板子, 會告訴你說認不得這個板子了,  到裝置管理員去看, 會發現如下圖, 出現了一個USB序列裝置(COMxx)。


使用TeraTerm或Putty, 連入這個序列埠, 如下圖, 發現MicroPython已經就緒了! 我們如之前那樣, 寫python程式, 把板子上的藍色LED燈點亮, 果然成功了。


那如果我不想玩MicroPython了, 可以把它燒別的firmware進去, 回復原本的狀態嗎? 可以的, 只要按板子上的RESET鍵, nRFConnect for Desktop裡的Programmer就又可以認到這個板子了。


此時看裝置管理員, 會看到一個nRF52 SDFU USB (COMx)的裝置, 而 nRFConnect for Desktop裡的Programmer則會看到一個Open DFU Bootloader裝置, 如下圖。就可以燒其他firmware進去了。


但是這個官網上的.hex檔, 沒有藍牙的功能!
想來是沒有編譯到, 只好自己動手來編譯一下了, 作法參見我另一篇貼文: 在Nordic nRF52晶片上跑Micropython
簡單在這裡提示一下, 在MacOS, Linux等系統下, 取得MicroPython原始程式, 解壓縮, 進入該目錄, 執行如下操作, 其中download_ble_stack.sh會下載多個Nordic的藍牙堆疊程式, 可以給定參數只下載一個, 例如: download_ble_stack.sh s140_nrf52_6_1_1。目前針對pca10059這個USB Dongle, 可以選擇s140 6.1.1 或者 s140 7.3.0。我目前使用6.1.1。

% cd micropython-1.20.0
% make -C mpy-cross
% cd ports/nrf
% make BOARD=pca10059
% ./drivers/bluetooth/download_ble_stack.sh
% make BOARD=pca10059 clean
% make BOARD=pca10059 SD=s140
  
因為 nRFConnect for Desktop裡的Programmer不一定有相對應版本的Nordic的藍牙堆疊程式(SoftDevice), 請到Nordic官網找一下正確版本的SoftDevice, 下載後, 同樣可以看到一個.hex檔。
把這個.hex檔和之前我們自己編譯出來的.hex檔都拖拉到Programmer工具程式去, 再按Write就可燒錄出有藍牙功能的MicroPython nRF52840 Dongle。
註: 我們編出來的.hex檔, 位於ports/nrf/build-pca10059-s140/firmware.hex

留言

這個網誌中的熱門文章

D-BUS學習筆記

關於藍牙裝置找尋(inquiry, scan)兩三事

Cisco Switch學習筆記: EtherChannel