Titania (AMB3626) UART 指令與回應值完整指南
Titania (AMB3626) UART 指令與回應值完整指南
模組型號: Würth Titania 2607011111100x (AMB3626)
通訊標準: 9600 8N1(出廠預設),可改為 1200115200 baud169.4625 MHz (Band D, EN 300 220)
頻段: 169.4125
文檔參考: Manual-um-titania-260701111100x (rev4.5)
📋 快速參考表
| 指令名稱 | CMD Code | Request | Response | 用途 |
|---|---|---|---|---|
| 軟體重置 | 0x05 | 02 05 00 07 |
02 45 01 00 46 |
軟重啟,讓新設定生效 |
| 設定頻道(揮發) | 0x06 | 02 06 01 [CH] [CS] |
02 46 01 [CH] [CS] |
臨時改當前頻道,斷電失效 |
| 設定 UserSetting(非揮發) | 0x09 | 02 09 [LEN+2] [MEM] [BYTES] [DATA...] [CS] |
02 49 [LEN] [STATUS] [CS] |
寫入 flash 參數(baudrate、NetID 等) |
| 讀取 UserSetting | 0x0B | 02 0B 01 [MEM] [CS] |
02 4B [LEN] [STATUS] [DATA...] [CS] |
讀出 flash 參數現在的值 |
| 工廠重置 | 0x0D | 02 0D 00 4D |
02 4C 00 4E |
清所有 UserSettings,回到出廠預設(UART 回 9600) |
| 透明模式傳送(MAC) | 0x80 | 02 80 [LEN] [MAC DATA...] [CS] |
02 C0 [LEN] [STATUS] [CS] |
透明模式下發送無線訊號 |
| Command Mode 進入 | — | — | — | 接 /CONFIG 腳下降邊緣可進入 |
🔧 詳細指令說明
1️⃣ 軟體重置(CMD_RESET_REQ)
用途: 讓 Titania 重啟,新的 UserSettings(如 baudrate 變更)會在重啟後生效。
指令:
Start CMD LEN Checksum
02 05 00 07
回應:
Start CMD LEN Status Checksum
02 45 01 00 46
- Status = 0x00:成功,模組重啟中
- 回應出現延遲: 模組需要 100~500 ms 才會完全重啟
C 程式碼:
HAL_StatusTypeDef st = Titania_SendCommand(huart, 0x05, NULL, 0);
uint8_t resp[5];
HAL_UART_Receive(huart, resp, 5, 500); // 等待重啟完成
2️⃣ 設定當前頻道(揮發)— CMD_SET_CHANNEL_REQ
用途: 臨時改變無線頻道(runtime),重啟模組後會失效(回到預設頻道)。
頻道對應表:
| 頻道 | 頻率 (MHz) | 指令值 |
|---|---|---|
| 0 | 169.4125 | 0x00 |
| 1 | 169.4250 | 0x01 |
| 2 | 169.4375 | 0x02 |
| 3 | 169.4500 | 0x03 |
| 4 | 169.4625 | 0x04 |
指令格式:
Start CMD LEN Channel Checksum
02 06 01 [0~4] [CS]
計算 Checksum: 0x02 ^ 0x06 ^ 0x01 ^ [Channel]
範例 - 設定 Channel 2:
發送:02 06 01 02 01
回應:02 46 01 02 43
Checksum 計算:
0x02 ^ 0x06 ^ 0x01 ^ 0x02 = 0x01 ✓
0x02 ^ 0x46 ^ 0x01 ^ 0x02 = 0x43 ✓
回應解析:
02 Start
46 CMD_SET_CHANNEL_CNF
01 Length
[02] 新頻道 (0~4)
[43] Checksum
C 程式碼:
uint8_t payload[1] = { channel };
Titania_SendCommand(huart, 0x06, payload, 1);
uint8_t resp[5];
HAL_UART_Receive(huart, resp, 5, 100);
3️⃣ 設定 UserSettings(非揮發)— CMD_SET_REQ ⭐ 重要
用途: 寫入 flash 中的永久設定(UART baudrate、預設頻道、NetID、Addr 等)。重啟後仍保持。
常用 UserSettings 參數表:
| 參數名 | Memory Position (Dec / Hex) | 長度 | 值範圍 | 預設值 | 說明 |
|---|---|---|---|---|---|
PHY_DefaultChannel |
42 / 0x2A | 1 byte | 0~4 | 2 | 重啟後使用的頻道 |
UART_Baudrate |
80 / 0x50 | 4 bytes | 1200~115200 | 9600 | UART 速率(小端序 LSB first) |
MAC_DefaultDestNetID |
TODO | 2 bytes | 0x0000~0xFFFF | 0x0000 | 預設目的 NetID |
MAC_DefaultDestAddrLSB |
TODO | 2 bytes | 0x0000~0xFFFF | 0x0000 | 預設目的位址 LSB |
UART_Timeout |
TODO | 2 bytes | [見表] | [見表] | UART 無字元多久後自動送包 |
PHY_PAPower |
TODO | 1 byte | [見表] | [見表] | 發射功率索引 (-11~+15 dBm) |
RF_ConfigIndex |
TODO | 1 byte | [見表] | 2 | RF 設定(data rate、調變) |
MAC_NumRetrys |
TODO | 1 byte | 0~N | [見表] | 重送次數 |
指令格式:
Start CMD LEN MPOS NBYTES DATA... Checksum
02 09 [2+N] [MP] [LEN] [...] [CS]
- LEN = 2 + 資料長度 (包括 MPOS + NBYTES 欄位)
- MPOS = Memory Position (十進位或十六進位)
- NBYTES = 要寫多少 bytes
- DATA = 實際資料
- Checksum = 從 0x02 到 最後一個 DATA 的 XOR
範例 1 - 設定預設頻道為 Channel 3(非揮發):
發送:02 09 03 2A 01 03 4B
02 09 03 2A 01 03 4B
↑ ↑ ↑ ↑ ↑ ↑ ↑
ST CMD LEN MP NB DC CS
回應:02 49 00 00 4B
↑ ↑ ↑ ↑ ↑
ST CMD LEN ST CS
Checksum 計算:
發送: 0x02 ^ 0x09 ^ 0x03 ^ 0x2A ^ 0x01 ^ 0x03 = 0x4B ✓
回應: 0x02 ^ 0x49 ^ 0x00 ^ 0x00 = 0x4B ✓
範例 2 - 設定 UART Baudrate 為 57600(非揮發):
57600 = 0x0000E100 (十六進位)
小端序 (LSB first):[0x00, 0xE1, 0x00, 0x00]
發送:02 09 06 50 04 00 E1 00 00 CS
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
ST CMD LEN MP NB D0 D1 D2 D3 CS
MPOS = 0x50 (80 十進位)
NBYTES = 04
DATA = [00 E1 00 00]
LEN = 2 + 4 = 06
Checksum = 0x02 ^ 0x09 ^ 0x06 ^ 0x50 ^ 0x04 ^ 0x00 ^ 0xE1 ^ 0x00 ^ 0x00 = ?
回應:02 49 00 00 4B
(Status=0x00 表示成功)
回應解析:
02 Start
49 CMD_SET_CNF (確認)
00 Length
00 Status (0x00 = 成功, 非 0 = 失敗)
4B Checksum
C 程式碼:
// 設定 UART Baudrate 為 57600
uint32_t baudrate = 57600;
uint8_t payload[6];
payload[0] = 0x50; // Memory Position (UART_Baudrate)
payload[1] = 0x04; // 資料長度 4 bytes
payload[2] = (uint8_t)(baudrate & 0xFF);
payload[3] = (uint8_t)((baudrate >> 8) & 0xFF);
payload[4] = (uint8_t)((baudrate >> 16) & 0xFF);
payload[5] = (uint8_t)((baudrate >> 24) & 0xFF);
Titania_SendCommand(huart, 0x09, payload, 6);
uint8_t resp[5];
HAL_UART_Receive(huart, resp, 5, 200);
// 檢查 resp[3] == 0x00 (Status OK)
4️⃣ 讀取 UserSettings — CMD_GET_REQ
用途: 讀出 flash 中現在儲存的設定值(例如確認現在 baudrate 是多少)。
指令格式:
Start CMD LEN MPOS CS
02 0B 01 [MP] [CS]
範例 - 讀取 PHY_DefaultChannel:
發送:02 0B 01 2A 21
↑ ↑ ↑ ↑ ↑
ST CMD LEN MP CS
Checksum = 0x02 ^ 0x0B ^ 0x01 ^ 0x2A = 0x21 ✓
回應:02 4B 02 00 03 4D
↑ ↑ ↑ ↑ ↑ ↑
ST CMD LEN ST DA CS
解析:
Status = 0x00 (成功)
Data = 0x03 (目前預設頻道是 Channel 3)
Checksum = 0x02 ^ 0x4B ^ 0x02 ^ 0x00 ^ 0x03 = 0x4D ✓
C 程式碼:
uint8_t mem_pos = 0x2A; // PHY_DefaultChannel
Titania_SendCommand(huart, 0x0B, &mem_pos, 1);
uint8_t resp[6]; // Start + CMD + LEN + Status + Data + CS
HAL_UART_Receive(huart, resp, 6, 200);
uint8_t current_channel = resp[4]; // 第 5 byte 是資料
5️⃣ 工廠重置 — CMD_FACTORY_RESET_REQ ⭐ 救急指令
用途: 清除所有 UserSettings,回到出廠預設值。
| 項目 | 回復值 |
|---|---|
| UART Baudrate | 9600 |
| PHY_DefaultChannel | 2 (169.4375 MHz) |
| MAC_DefaultDestNetID | 0x0000 |
| MAC_DefaultDestAddrLSB | 0x0000 |
| 所有其他設定 | 出廠預設 |
指令:
Start CMD LEN CS
02 0D 00 4D
Checksum = 0x02 ^ 0x0D ^ 0x00 = 0x4D ✓
回應:
Start CMD LEN Status CS
02 4C 00 00 4E
Checksum = 0x02 ^ 0x4C ^ 0x00 ^ 0x00 = 0x4E ✓
C 程式碼:
Titania_SendCommand(huart, 0x0D, NULL, 0);
uint8_t resp[5];
HAL_UART_Receive(huart, resp, 5, 500);
// 模組會重啟,UART 變回 9600,所有設定清零
6️⃣ 透明模式傳送 — CMD_DATA_REQ
用途: 在透明模式下,透過 UART 送進來的資料會被打包成 MAC 訊號透過無線送出。
指令格式:
Start CMD LEN MAC_DATA... CS
02 80 [N] [...] [CS]
- LEN = MAC 訊號的長度(bytes)
- MAC_DATA = 你要發送的內容(payload)
- Checksum = 從 0x02 到最後一個 DATA 的 XOR
範例 - 發送 5 bytes 資料 "Hello":
發送:02 80 05 48 65 6C 6C 6F CS
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
ST CMD LEN H e l l o CS
"Hello" 的 ASCII 值:
H=0x48, e=0x65, l=0x6C, l=0x6C, o=0x6F
Checksum = 0x02 ^ 0x80 ^ 0x05 ^ 0x48 ^ 0x65 ^ 0x6C ^ 0x6C ^ 0x6F = ?
回應:02 C0 00 00 C0
↑ ↑ ↑ ↑ ↑
ST CMD LEN ST CS
Status = 0x00 (成功,訊號已排隊發送)
C 程式碼:
uint8_t payload[5] = { 0x48, 0x65, 0x6C, 0x6C, 0x6F }; // "Hello"
Titania_SendCommand(huart, 0x80, payload, 5);
uint8_t resp[5];
HAL_UART_Receive(huart, resp, 5, 100);
// resp[3] = Status
📊 Checksum 計算邏輯
XOR 從 Start (0x02) 一路算到最後一個 Data,不含 Checksum 本身。
static uint8_t CalcChecksum(uint8_t *buf, uint8_t len)
{
uint8_t cs = 0;
for (uint8_t i = 0; i < len; i++)
cs ^= buf[i];
return cs;
}
// 使用方式:
uint8_t frame[10] = { 0x02, 0x09, 0x03, 0x2A, 0x01, 0x03, ... };
uint8_t cs = CalcChecksum(frame, 6); // 不包括 Checksum 欄位本身
frame[6] = cs;
🎯 實務操作流程
A. 初始化一個新 Titania 模組
- 確認 UART 連線 → 用邏輯分析儀看波形確認 baudrate 是 9600
- 讀取現在設定 → CMD_GET_REQ 讀 0x2A (PHY_DefaultChannel) 和 0x50 (UART_Baudrate)
- 寫入新設定 → CMD_SET_REQ 改 UART_Baudrate、PHY_DefaultChannel、NetID、Addr 等
- 軟重啟 → CMD_RESET_REQ,等 100~500 ms
- 切換 STM32 UART 波特率 → 改成新的 baudrate
- 驗證 → 再讀一次設定確認有存進去
B. 忘記自己設的 baudrate
- 用邏輯分析儀 抓 Titania 上電時 TX 線的波形,反推現在是多少 baudrate
- 用那個 baudrate 連接 STM32
- 發送 CMD_FACTORY_RESET_REQ 清所有設定(UART 回 9600)
- 切換 STM32 UART 回 9600
- 重新用 CMD_SET_REQ 設定一次
C. 要改無線頻道(runtime 臨時改)
- 發 CMD_SET_CHANNEL_REQ (0x06) 改當前頻道
- 不需要 reset,立即生效
- 但重啟後會失效(回到預設頻道)
- 若要永久改,用 CMD_SET_REQ (0x09) 改 PHY_DefaultChannel + CMD_RESET_REQ
D. 要設定預設 NetID / Addr(MAC 層位址)
- 用 CMD_SET_REQ (0x09) 寫入:
MAC_DefaultDestNetID(memory position TODO)MAC_DefaultDestAddrLSB(memory position TODO)
- 再 CMD_RESET_REQ 重啟讓設定生效
- 之後所有透明模式的 MAC 訊號都會用這個 NetID/Addr 作為預設目的地
🔗 常用組合指令序列
序列 1:初始化 + 改速率 57600 + 頻道 3 + NetID 0x0001
Step 1: CMD_SET_REQ UART_Baudrate = 57600
→ 發送:02 09 06 50 04 00 E1 00 00 CS
→ 等待回應 02 49 00 00 4B
Step 2: CMD_SET_REQ PHY_DefaultChannel = 3
→ 發送:02 09 03 2A 01 03 4B
→ 等待回應 02 49 00 00 4B
Step 3: CMD_SET_REQ MAC_DefaultDestNetID = 0x0001
→ 發送:02 09 04 [MEM] 02 01 00 CS
→ 等待回應 02 49 00 00 4B
Step 4: CMD_RESET_REQ
→ 發送:02 05 00 07
→ 等待 500ms 讓模組重啟
→ 接收回應 02 45 01 00 46
Step 5: STM32 UART 改 57600 baud
→ 重新初始化 UART
Step 6: 驗證設定(可選)
→ CMD_GET_REQ 讀各個參數確認
序列 2:工廠重置(救急)
Step 1: CMD_FACTORY_RESET_REQ
→ 發送:02 0D 00 4D
→ 等待 500ms,模組重啟
→ 接收回應 02 4C 00 00 4E
Step 2: STM32 UART 改回 9600 baud
→ 重新初始化 UART
Step 3: 確認恢復(可選)
→ CMD_GET_REQ 讀 0x50 (UART_Baudrate)
→ 應該讀到 9600
📌 重要提醒
✅ UART 設定改變後必須 reset
- 改 UART_Baudrate 或其他非揮發參數後,必須 CMD_RESET_REQ,否則設定寫進 flash 但模組沒用新值運作。
✅ Checksum 計算務必正確
- 差一個 bit 就會被模組拒絕或誤解。
✅ 記得同步 STM32 UART 波特率
- 改完 Titania UART_Baudrate 後,STM32 也要改成一樣的速率,否則無法通訊。
✅ NetID / Addr 的 memory position 要對應手冊
- 上表中 TODO 的位置需要你查手冊第 8.13~8.16 章補上正確的十進位或十六進位位置。
✅ 工廠重置會清所有設定
- 包括 UART_Baudrate、頻道、NetID、Addr、RF_ConfigIndex 等,全部回到出廠預設。
🛠 STM32 快速範本代碼
#include "stm32f1xx_hal.h"
extern UART_HandleTypeDef huart1;
// 計算 Checksum
static uint8_t CalcChecksum(uint8_t *buf, uint8_t len)
{
uint8_t cs = 0;
for (uint8_t i = 0; i < len; i++)
cs ^= buf[i];
return cs;
}
// 發送指令
void SendTitaniaCmd(uint8_t cmd, uint8_t *data, uint8_t len)
{
uint8_t frame[64];
uint8_t idx = 0;
frame[idx++] = 0x02; // Start
frame[idx++] = cmd;
frame[idx++] = len;
for (uint8_t i = 0; i < len; i++)
frame[idx++] = data[i];
frame[idx] = CalcChecksum(frame, idx);
idx++;
HAL_UART_Transmit(&huart1, frame, idx, 100);
}
// 例子:改 baudrate 為 57600 + 頻道 3 + reset
void InitTitania(void)
{
uint8_t payload[6];
uint8_t resp[10];
// 1. 改 UART Baudrate 57600
payload[0] = 0x50; // Memory Pos (UART_Baudrate)
payload[1] = 0x04; // Length
payload[2] = 0x00; // 57600 = 0x0000E100 (LE)
payload[3] = 0xE1;
payload[4] = 0x00;
payload[5] = 0x00;
SendTitaniaCmd(0x09, payload, 6);
HAL_UART_Receive(&huart1, resp, 5, 200);
// 2. 改預設頻道為 3
payload[0] = 0x2A; // Memory Pos (PHY_DefaultChannel)
payload[1] = 0x01; // Length
payload[2] = 0x03; // Channel 3
SendTitaniaCmd(0x09, payload, 3);
HAL_UART_Receive(&huart1, resp, 5, 200);
// 3. Reset 讓設定生效
SendTitaniaCmd(0x05, NULL, 0);
HAL_Delay(500); // 等模組重啟
HAL_UART_Receive(&huart1, resp, 5, 500);
// 4. 改 STM32 UART 為 57600
huart1.Init.BaudRate = 57600;
HAL_UART_Init(&huart1);
}
📚 參考文檔
- Würth Titania Manual: Manual-um-titania-260701111100x (rev4.5)
- Titania 規格表: 2607011111100x datasheet
- Band D Frequencies: EN 300 220 (歐盟標準)
最後更新: 2026-03-10
作者備註: 本文檔整理自 Titania 官方手冊,所有指令與 memory position 須對應實際硬體版本。