一、Y modem協(xié)議
X modem是較早的文件傳輸協(xié)議。Y modem是X modem的改良版,有傳輸快速穩(wěn)定優(yōu)勢(shì),通常所說(shuō)的Y modem一般指YModem-1K。

圖1 Y modem協(xié)議幀
二者核心差異可概括為下表:

點(diǎn)擊可查看大圖
二、基于X modem的OTA代碼修改
目前瑞薩官網(wǎng)提供的OTA代碼基于X modem協(xié)議(例如r20an0640ej樣例程序的System_BootLoader工程),改為Y modem協(xié)議需修改協(xié)議相關(guān)的傳輸邏輯、校驗(yàn)邏輯、幀處理邏輯等部分。
01握手信號(hào)調(diào)整
X modem握手:
通常接收方可能以簡(jiǎn)單ACK或特定字符(如有些實(shí)現(xiàn)中接收方發(fā)‘C’表示用CRC16校驗(yàn))啟動(dòng),邏輯相對(duì)簡(jiǎn)單。
Y modem握手:
必須由接收方發(fā)起YMODEM_C(字符‘C’,ASCII碼0x43),發(fā)送方收到后才開始傳輸起始幀(含文件名、文件大)。
修改點(diǎn):
新增函數(shù)void ymodem_send_c(void),用于發(fā)送Ymodem協(xié)議必需的0x43(‘C’)握手信號(hào),通知發(fā)送方傳輸起始幀。
02起始幀結(jié)構(gòu)與處理
X modem起始幀:
一般直接傳輸數(shù)據(jù)塊,無(wú)文件信息。
Y modem起始幀:
需將文件名、文件大小放入起始幀(以SOH133字節(jié)長(zhǎng)度幀傳輸,包號(hào)固定0x00,包號(hào)反碼0xff)。

圖2 Y modem起始幀
修改點(diǎn):
定義Y modem起始幀結(jié)構(gòu)體ymodem_start_frame_t
修改幀校驗(yàn)函數(shù)uint8_t xmodem_check_frame (uint8_t* const p_xmodem_buff),增加對(duì)起始幀格式的校驗(yàn)邏輯。
03數(shù)據(jù)幀接收處理
X modem數(shù)據(jù)幀:
幀頭為SOH(128字節(jié)塊)或STX(部分衍生版1024字節(jié)塊),現(xiàn)有代碼幀頭為SOH(128字節(jié)塊)。
Y modem數(shù)據(jù)幀:
幀頭以SOH(128字節(jié)信息塊)、STX(1024字節(jié)信息塊)區(qū)分,傳輸時(shí)需按規(guī)則填充數(shù)據(jù)。SOH幀如最后一包不足128字節(jié)時(shí)的填充0x1A處理,最后一幀長(zhǎng)度仍為133字節(jié);STX幀最后一包數(shù)據(jù)小于等于128字節(jié)以133字節(jié)幀長(zhǎng)度發(fā)送,大于128字節(jié)小于等于1024字節(jié),以1029長(zhǎng)度幀發(fā)送,無(wú)效數(shù)據(jù)填充0x1A。

圖3 Y modem數(shù)據(jù)幀
修改點(diǎn):
修改uint8_txmodem_check_frame(uint8_t* const p_xmodem_buff),修改數(shù)據(jù)幀的接收處理。
04結(jié)束幀處理
X modem結(jié)束幀:
一般發(fā)送EOT(0x04)字符,接收方回ACK即結(jié)束。
Y modem結(jié)束幀:
采用SOH133字節(jié)空包(數(shù)據(jù)區(qū)、校驗(yàn)等填0x00)作為結(jié)束幀,需構(gòu)建對(duì)應(yīng)結(jié)束幀發(fā)送邏輯:

圖4 Y modem結(jié)束幀
修改點(diǎn):
修改uint8_t xmodem_rx_frame (uint8_t* p_xmodem_buff),對(duì)結(jié)束幀進(jìn)行判斷,響應(yīng)兩次EOT,分別回復(fù)NACK和ACK。
05校驗(yàn)機(jī)制升級(jí)
X modem校驗(yàn):
使用校驗(yàn)和或CRC16,目前X modem例程使用校驗(yàn)和。
Y modem校驗(yàn):
Y modem強(qiáng)制規(guī)范使用CRC16校驗(yàn),且計(jì)算范圍明確為信息塊數(shù)據(jù)(不含幀頭、包號(hào)等)。需確保CRC16計(jì)算函數(shù)精準(zhǔn),修改原X modem可能存在的簡(jiǎn)易校驗(yàn)邏輯:
修改點(diǎn):
新增static uint16_t CRC16_check (unsigned char *q,int len)函數(shù),對(duì)數(shù)據(jù)進(jìn)行CRC16校驗(yàn)。
移除Xmodem校驗(yàn)和邏輯,強(qiáng)制使用CRC16校驗(yàn)。
06數(shù)據(jù)緩沖區(qū)配置
X modem數(shù)據(jù)緩沖配置:
XModem數(shù)據(jù)包會(huì)被送入一個(gè)由buffer.c控制的緩沖區(qū)。該緩沖區(qū)為循環(huán)緩沖區(qū),即當(dāng)?shù)竭_(dá)緩沖區(qū)末尾時(shí),會(huì)回環(huán)至起始位置。由于數(shù)據(jù)幀接收的數(shù)組從132字節(jié)變成1029字節(jié),RAM開銷變大。
XModem例程里,每個(gè)packet132bytes(128數(shù)據(jù)+3header+1校驗(yàn)),代碼中的XMODEM_FRAME_SIZE是132U。
Y modem數(shù)據(jù)緩沖配置:
YModem例程里,定義YMODEM_FRAME_SIZE_1024為1029U,YMODEM_FRAME_SIZE_128為133U。
定義環(huán)形存儲(chǔ)的BUFFER_SIZE定義為1542,保持原有配置,數(shù)據(jù)的解析正常。
修改點(diǎn):
可根據(jù)實(shí)際測(cè)試結(jié)果增加BUFFER_SIZE
07硬件驅(qū)動(dòng)與配置適配
瑞薩RX系列需確保串口驅(qū)動(dòng)適配Y modem的波特率、數(shù)據(jù)位、停止位等配置,可以使用smart configurator進(jìn)行驅(qū)動(dòng)配置(如常見的波特率 115200bps、8數(shù)據(jù)位、1停止位、無(wú)校驗(yàn)等)。
088多文件傳輸適配
若OTA需傳輸多個(gè)文件,需在代碼中添加多文件遍歷、逐個(gè)構(gòu)建起始幀+數(shù)據(jù)幀+結(jié)束幀的邏輯。由于客戶只要求傳輸單個(gè)文件,不涉及相關(guān)修改。
三、實(shí)測(cè)結(jié)果
01測(cè)試環(huán)境搭建

點(diǎn)擊可查看大圖
02功能測(cè)試
MCU執(zhí)行bootloader升級(jí)程序,串口輸出"Please start file send using YModem protocol...";
Teraterm選擇Ymodem協(xié)議發(fā)送固件文件;
傳輸過(guò)程中通過(guò)Bus Hound抓取幀序列,驗(yàn)證:
起始幀(文件名/大小正確);
數(shù)據(jù)幀(1024字節(jié)塊與CRC16校驗(yàn)正確);
結(jié)束幀(判定正確)。
升級(jí)完成后,MCU自動(dòng)跳轉(zhuǎn)至新固件,功能驗(yàn)證通過(guò)。
-
mcu
+關(guān)注
關(guān)注
147文章
18924瀏覽量
398012 -
瑞薩
+關(guān)注
關(guān)注
37文章
22481瀏覽量
90852 -
串口
+關(guān)注
關(guān)注
15文章
1618瀏覽量
82809 -
代碼
+關(guān)注
關(guān)注
30文章
4967瀏覽量
73954 -
文件傳輸協(xié)議
+關(guān)注
關(guān)注
0文章
4瀏覽量
992
發(fā)布評(píng)論請(qǐng)先 登錄
瑞薩電子MCU無(wú)感OTA升級(jí)功能介紹
UART協(xié)議的數(shù)據(jù)傳輸格式是怎樣的
如何使用IrDa進(jìn)行紅外數(shù)據(jù)傳輸?
DMA進(jìn)行數(shù)據(jù)傳輸和CPU進(jìn)行數(shù)據(jù)傳輸的疑問(wèn)
數(shù)據(jù)傳輸的通信系統(tǒng)設(shè)計(jì)
基于短消息的OTA數(shù)據(jù)傳輸安全機(jī)制
Modem數(shù)據(jù)傳輸標(biāo)準(zhǔn)
數(shù)據(jù)傳輸速率是什么意思
tcp_ip 協(xié)議講座:介紹數(shù)據(jù)傳輸
如何實(shí)現(xiàn)MQTT協(xié)議數(shù)據(jù)傳輸?
DTU的多種協(xié)議,解鎖數(shù)據(jù)傳輸的無(wú)限可能
使用Y modem協(xié)議進(jìn)行瑞薩RX MCU OTA數(shù)據(jù)傳輸
評(píng)論