1. 綜述
DA14531MOD內置一顆1Mb的SPI FLASH用於存儲DA14531的固件。手冊中雖然標註了144KB的ROM,但似乎無法編程。DA14531一般啓動時從外部總線或內部32KB大小的OTP加載程序到RAM中運行。啓動方式請參考:
https://lpccs-docs.renesas.com/DA14535/AN-B-072-DA14531-Booting-from-serial-interfaces/Booting/Booting.html
對於DA14531MOD來説,SPI接口已經連接了模塊內封的SPI FLASH,如果SPI FLASH中存在可啓動的程序且OTP中沒有特殊配置的情況下模塊加載並運行該程序。
除此之外,在模塊外引出的引腳中只能使用引腳P0_5的1-wire UART接口進行總線啓動。在官方文檔的第7小節介紹了從串口總線中啓動的通信協議。
對內封SPI FLASH進行燒錄有兩種方法:
-
使用
JLink -
使用
1-wire UART
官方工具SmartSnippets™ Toolbox支持上述兩種方式,具體操作方式請閲讀官方文檔UM-B-083。不論是哪一種方法基本流程是相同的,上位機首先通過驅動JLink或串口上傳一個支持編程外部FLASH的燒錄程序到芯片然後復位。當燒錄程序運行後,通過通訊接口(驅動JLink直接讀寫RAM/1-wire UART)下發命令給燒錄程序完成外部FLASH的燒錄。
官方工具支持命令行調用,一般情況下可以滿足生產自動化燒錄的需求。本文主要描述如何在不依賴官方工具的前提下通過1-wire UART方式燒錄模塊內封的SPI FLASH。
2. 前期準備
官方提供了支持燒錄外部FLASH的源碼以及預編譯的程序,分別位於:
-
源碼:
SDK_PATH/utilities/flash_programmer -
預編譯程序:
SDK_PATH/config/toolbox_resources/DA1453x/common
源碼可用於參考通信協議或實現高級需求,只是燒錄外部FLASH可以直接使用預編譯程序。對於DA14531MOD來説,要使用的是flash_programmer_531.bin這個程序。在SmartSnippets™ Toolbox的安裝目錄中也可以找到同名文件,但和最新SDK中的不同,應該是SDK版本的原因。使用哪個都可以實現基本的燒錄需求。
2.1. 單線串口
官方建議的連接方式是將常規串口的RX和TX引腳短接後串一個1K的電阻,再將串口和模塊的J14(芯片P0_5)連接。由於短接後上位機發送的數據會同時被接收,所以實現上位機時需要過濾掉這些數據(例如官方工具就會自動過濾),或使用支持單線串口的設備作為上位機。
3. 燒錄步驟
-
讀取燒錄程序
flash_programmer_531.bin,在其末尾添加5個字節0x00 0x00 0x00 0x00 0x05構成SW code bytes(該步驟作用不明確,官方工具會附加這個5個字節) -
通過
1-wire UART啓動:協議可參考官方文檔協議本身較為簡單,需要注意的有3點
-
Checksum使用的算法是BCC校驗算法(異或校驗算法),使用初始值0,依次與SW code bytes的所有字節進行異或運算後得出。
-
接收到芯片發出的
0x02時需要儘快響應 -
上位機確認Checksum後發送確認ACK
0x06後,芯片將自動復位。下一步是與flash_programmer程序交互,如果上位機發送ACK後立即發送flash_programmer的命令可能會失敗。此處需要延時一段時間。
-
-
使用
ACTION_SPI_ID讀取內封SPI FLASH ID(該步驟可選,但通過這個步驟可以初步判斷SPI FLASH是否正常。官方工具通過該命令確認flash_programmer是否成功運行) -
使用
ACTION_SPI_GPIOS配置SPI GPIO -
使用
ACTION_SPI_READ讀取當前FLASH中的內容(可選) -
使用
ACTION_SPI_ERASE擦除FLASH(可以選擇整塊擦除或ACTION_SPI_ERASE_BLOCK區域擦除,協議不同) -
讀取待燒錄固件,併為固件添加8字節的頭
0x70 0x50 0x00 0x00 0x00 0x00 SIZE_1 SIZE_0,其中前6字節為固定值,後2字節為大端字節序的固件長度(不包括新添加的8字節頭)。該固件頭必須添加,只有包含該頭時DA14531才會加載固件到RAM中運行。 -
使用
ACTION_SPI_WRITE發送固件 -
再次讀取FLASH內容,校驗寫入是否成功
-
發送復位命令
ACTION_PLATFORM_RESET運行程序(可選)
3.1. flash_programmer協議
該程序所有通信協議遵守相同的結構:
| index | note |
|---|---|
[0:1] |
payload length n |
[2:5] |
payload crc |
[6] |
payload[0] aka the action code |
[7:n+5] |
payload[1]~payload[n-1] |
其中負載字段至少包含1字節的命令碼(action code)。負載長度和負載CRC均使用大端字節序。
CRC參數如下:
POLY: 0x04C11DB7
INIT: 0xFFFFFFFF
XOROUT: 0xFFFFFFFF
REFIN: enable
REFOUT: enable
上位機發送的請求依據命令碼的不同在負載字段會擴展不同的固定格式,flash_programmer的響應主要有兩種,附帶數據的ACTION_CONTENTS和用作ACK的ACTION_OK。其餘響應請參考源碼。
| index | note |
|---|---|
[0:1] |
payload length n |
[2:5] |
payload crc |
[6] |
ACTION_CONTENTS: 0x82 |
[7:n + 5] |
payload[1]~payload[n-1] |
| index | note |
|---|---|
[0:1] |
1 |
[2:5] |
payload crc |
[6] |
ACTION_OK: 0x83 |
ACTION_SPI_ID
-
請求
index note [0:1]1 [2:5]payload crc [6]0x93 -
成功響應
index note [0:1]payload length 5 [2:5]payload crc [6]ACTION_CONTENTS: 0x82 [7:10]big-endian FLASH CHIP ID
ACTION_SPI_GPIOS
-
請求
index note [0:1]9 [2:5]payload crc [6]0x95 [7]spi CS gpio port [8]spi CS gpio pin [9]spi CLK gpio port [10]spi CLK gpio pin [11]spi MOSI gpio port [12]spi MOSI gpio pin [13]spi MISO gpio port [14]spi MISO gpio pin 對於DA14531MOD的內封SPI FLASH來説,必須配置為:
index note value [7]spi CS gpio port 0 [8]spi CS gpio pin 1 [9]spi CLK gpio port 0 [10]spi CLK gpio pin 4 [11]spi MOSI gpio port 0 [12]spi MOSI gpio pin 0 [13]spi MISO gpio port 0 [14]spi MISO gpio pin 3 -
成功響應 ACTION_OK
ACTION_SPI_READ
-
請求
index note [0:1]7 [2:5]payload crc [6]0x90 [7:10]start address (big-endian) [11:12]read length (big-endian) -
成功響應
index note [0:1]read length + 1 [2:5]payload crc [6]ACTION_CONTENTS: 0x82 [7:read length + 6]data
ACTION_SPI_ERASE
-
請求
index note [0:1]1 [2:5]payload crc [6]0x92 -
成功響應 ACTION_OK
ACTION_SPI_WRITE
-
請求
index note [0:1]write length + 1 [2:5]payload crc [6]0x91 [7:write length + 6]data -
成功響應 ACTION_OK
ACTION_PLATFORM_RESET
-
請求
index note [0:1]1 [2:5]payload crc [6]0xC0