1508|4

267

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【极海APM32F407 Tiny Board】4. ymodem协议移植+IAP升级 [复制链接]

 

Ymodem协议是一个古老的协议,这里先对协议进行大概的了解,然后进行实操和测评。

Ymodem 帧格式

Ymodem 有两种帧格式,主要区别是信息块长度不一样。

 

1.1 帧头

帧头表示两种数据帧长度,主要是信息块长度不同。

 

1.2 包序号

数据包序号只有1字节,因此计算范围是0~255;对于数据包大于255的,序号归零重复计算。

 

1.3 帧长度

【1】以SOH(0x01)开始的数据包,信息块是128字节,该类型帧总长度为133字节。

【2】以STX(0x02)开始的数据包,信息块是1024字节,该类型帧总长度为1029字节。

 

1.4 校验

Ymodem采用的是CRC16校验算法,校验值为2字节,传输时CRC高八位在前,低八位在后;CRC计算数据为信息块数据,不包含帧头、包号、包号反码。

 

2.Ymodem握手信号

握手信号由接收方发起,在发送方开始传输文件前,接收方需发送YMODEM_C (字符C,ASII码为0x43)命令,发送方收到后,开始传输起始帧。

 

3.Ymodem起始帧

Ymodem起始帧并不直接传输文件内容,而是先将文件名和文件大小置于数据帧中传输;起始帧是以SOH 133字节长度帧传输,格式如下。

 

  其中包号为固定为0;Filename为文件名称,文件名称后必须加0x00作为结束;Filesize为文件大小值,文件大小值后必须加0x00作为结束;余下未满128字节数据区域,则以0x00填充。

4.Ymodem数据帧

Ymodem数据帧传输,在信息块填充有效数据。

 

 

  传输有效数据时主要考虑的是最后一包数据的是处理,SOH帧和STR帧有不同的处理。

【1】对于SOH帧,若余下数据小于128字节,则以0x1A填充,该帧长度仍为133字节。

【2】对于STX帧需考虑几种情况:

●余下数据等于1024字节,以1029长度帧发送;

  ●余下数据小于1024字节,但大于128字节,以1029字节帧长度发送,无效数据以0x1A填充。

  ●余下数据等于128字节,以133字节帧长度发送。

  ●余下数据小于128字节,以133字节帧长度发送,无效数据以0x1A填充。

5.Ymodem结束帧

Ymodem的结束帧采用SOH 133字节长度帧传输,该帧不携带数据(空包),即数据区、校验都以0x00填充。

 

6.Ymodem命令

 

YModem分成YModem-1K与YModem-g。

 

YModem-1K用1024字节信息块传输取代标准的128字节传输,数据的发送回使用CRC校验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应ACK信号,接收到回应后,才会继续传输下一个信息块,保证数据已经全部接收。

 

YModem-g传输形式与YModem-1K差不多,但是它去掉了数据的CRC校验码,同时在发送完一个数据块信息后,它不会等待接收端的ACK信号,而直接传输下一个数据块。正是它没有涉及错误校验,才使得它的传输速度比YModem-1K来得块。

 

一般都会选择YModem-1K传输,平时所说的YModem也是指的是YModem-1K。下面就讲讲它的传输协议。

 

1、起始帧的数据格式

YModem的起始帧并不直接传输文件的数据,而是将文件名与文件的大小放在数据帧中传输,它的帧长=3字节数据首部+128字节数据+2字节CRC16校验码=33字节。它的数据结构如下:

SOH 00 FF filename[ ] filezise[ ] NUL[ ] CRCH CRCL

其中SOH=0x01,表示这个数据帧中包含着128字节的数据部分;在SOH后面的00 FF,00表示数据帧序号,因为是起始帧,所以它的帧序为00,至于FF,它是帧序的取反,YModem特地这么做是为了给数据是否正确提供一种判断依据,通过判断这两个字节是否为取反关系,就可以知道数据是否传输出错;filename[ ]就是文件名,如文件名foo.c,它在数据帧中存放格式为:66 6F 6F 2E 63 00,一定要在文件名最后跟上一个00,表示文件名结束;filesize[ ]就是文件大小,如上面的foo.c的大小为1KByte,即1024Byte,需要先将它转化成16进制,即0x400,所以它在数据帧的存放格式为:34 30 30 00,即“400”,同样的文件大小最后需要跟上00,表示结束;NUL[ ]表示剩下的字节都用00填充,数据部分大小为128字节,除去文件名与文件大小占用的空间外,剩余的字节全部用00填充;CRCH CRCL分别表示16位CRC校验码的高8位与低8位。

 

2、数据帧的数据格式

YModem的数据帧中会预留1024字节空间用来传输文件数据,它跟起始帧接收差不多,如下:

STX 01 FE data[1024] CRCH CRCL

 

其中STX=0x02,表示这帧数据帧后面包含着1024字节的数据部分;STX后面的01 FE,01表示第一帧数据帧,FE则是它的取反,当然如果是第二帧数据的话就是:02 FD;data[1024]表示存放着1024字节的文件数据;CRCH与CRCL是CRC16检验码的高8位与低8位。

如果文件数据的最后剩余的数据在128~1024之前,则还是使用STX的1024字节传输,但是剩余空间全部用0x1A填充,如下结构:

STX [num] [~num] data[ ] 1A …1A CRCH CRCL

 

有一种特殊的情况:如果文件大小小于等于128字节或者文件数据最后剩余的数据小于128字节,则YModem会选择SOH数据帧用128字节来传输数据,如果数据不满128字节,剩余的数据用0x1A填充这是数据正的结构就变成了:

 

文件大小小于128字节: SOH 01 FE data[ ] 1A …1A CRCH CRCL

文件最后剩余数据小于128字节:SOH [num] [~~num] data[ ] 1A…1A CRCH CRCL

 

3、结束帧数据结构

YModem的结束帧数据也采用SOH的128字节数据帧,它的结构如下:

SOH 00 FF NUL[128] CRCH CRCL

 

结束帧同样以SOH开头,表示后面跟着128字节大小的数据;结束帧的帧序也认为是00 FF;结束帧的128字节的数据部分不存放任何信息,即NUL[128]全部用00填充。

 

4、文件传输过程

文件的传输过程,以具体的例子说明。把foo.c,大小为4196Byte(16进制为0x1064)的文件作为传输的对象,则它的传输过程如下:

发送端----------------------------------------------------------------接收端

 

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C

 

SOH 00 FF “foo.c” "1064’’ NUL[118] CRC CRC >>>>>>>>>>>>>

 

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK

 

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C

 

STX 01 FE data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>>

 

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK

 

STX 02 FD data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>

 

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK

 

STX 03 FC data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>

 

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK

 

STX 04 FB data[1024] CRC CRC>>>>>>>>>>>>>>>>>>>>>>>

 

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK

 

SOH 05 FA data[100] 1A[28] CRC CRC>>>>>>>>>>>>>>>>>>

 

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK

 

EOT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< NAK

 

EOT>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK

 

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C

 

SOH 00 FF NUL[128] CRC CRC >>>>>>>>>>>>>>>>>>>>>>>

 

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ACK

 

YModem的传输过程就是上面所示。但是上面传输过程中存在许多通信信号,它们的数值与意义如下表所示:

 

 

还是有几点需要说明下:

 

1)EOT信号由发送端发送

2)CA中止传输信号也有发送端发送

3)C的含义在英文的数据手册上的意思有点难以理解,我个人理解成请求数据包,如开始传输的发送C请求起始帧数据,然后再发送C请求文件数据帧,最后有发送一次C请求结束帧!

 

移植ymodemx协议重点在于uart发送接收的接口和Flash擦写。

1. 修改common.h 中宏定义的uart接口:

2. 修改发送接口:

  

3. 修改擦除接口:

4. 修改写Flash接口:

  

至此,ymodem就已经移植ok了。

测试结果如下:

 总结: Geehy的串口操作非常顺滑,值得注意的是uart接收不能开启中断,我在这里踩过坑的,发送文件可以使用ymodem-1K模式,速度更快。

源码在sdk的example/IAP/路径下。

欢迎小伙伴留言。

 

最新回复

nmg
uart接收不能开启中断是正常的吗?   详情 回复 发表于 2023-6-5 10:19
点赞 关注
个人签名

gitee/casy

 
 

回复
举报

267

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

本应用在只有串口的情况下,做iap升级非常实用!

个人签名

gitee/casy

 
 
 

回复

5263

帖子

239

TA的资源

管理员

板凳
 

uart接收不能开启中断是正常的吗?

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

是正常的,因为ymodem是查询接收的,效率也比较高的  详情 回复 发表于 2023-7-8 17:55
 
 
 

回复

267

帖子

0

TA的资源

一粒金砂(高级)

4
 
nmg 发表于 2023-6-5 10:19 uart接收不能开启中断是正常的吗?

是正常的,因为ymodem是查询接收的,效率也比较高的

个人签名

gitee/casy

 
 
 

回复

267

帖子

0

TA的资源

一粒金砂(高级)

5
 

需要源码的朋友看这里:

链接已隐藏,如需查看请登录或者注册

个人签名

gitee/casy

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表