1. 首页
  2. 论坛
  3. 外包
  4. 下载
  5. Datasheet
  6. 公开课
  7. 更多

查看: 389|回复: 18
打印 上一主题 下一主题
收起左侧

[技术问答] 求新唐M4 Xmodem例程

[复制链接]   未结帖(20)
     
4主题34帖子112积分
中级技术员
  1. 关注TA
  2. 发消息
专家等级:结帖率:25%
跳转到指定楼层
楼主
 楼主| 发表于 2017-5-18 16:48 | 只看该作者 |返回版面回帖奖励 |倒序浏览 |阅读模式
哪个大神有新唐的M0或者M4的Xmodem协议例程,当然最好有完整的串口升级例程,那就棒棒哒了
     
60主题1329帖子3990积分
中级工程师
  1. 关注TA
  2. 发消息
专家等级:结帖率:100%
沙发
发表于 2017-5-18 16:52 | 只看该作者 |返回版面
XModem协议介绍:
XModem是一种在串口通信中广泛使用的异步文件传输协议,分为XModem和1k-XModem协议两种,前者使用128字节的数据块,后者使用1024字节即1k字节的数据块。




一、XModem校验和协议


1. XModem信息包格式
XModem协议最早由Ward Christensen在20世纪70年代提出并实现的,传输数据单位为信息包,信息包格式如下:
---------------------------------------------------------------------------
|     Byte1     |    Byte2    |     Byte3      |Byte4~Byte131|  Byte132   |
|-------------------------------------------------------------------------|
|Start Of Header|Packet Number|~(Packet Number)| Packet Data |  Check Sum |
---------------------------------------------------------------------------


2. 校验和的计算
所有的数据字节都将参与和运算,由于校验和只占一个字节,如果累加的和超过255将从零开始继续累加。


3. 字段定义
<SOH> 01H
<EOT> 04H
<ACK> 06H
<NAK> 15H
<CAN> 18H


4. 校验和方式的XModem传输流程
传输流程如图所示:
------------------------------------------------------------------------------
|               SENDER                |          |          RECIEVER         |
|                                     |  <---    |  NAK                      |
|                                     |          |  Time out after 3 second  |
|                                     |  <---    |  NAK                      |
| SOH|0x01|0xFE|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  ACK                      |
| SOH|0x02|0xFD|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  NAK                      |
| SOH|0x02|0xFD|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  ACK                      |
| SOH|0x03|0xFC|Data[0~127]|CheckSum| |  --->    |                           |
|                                     |  <---    |  ACK                      |
| .                                   |          |  .                        |
| .                                   |          |  .                        |
| .                                   |          |  .                        |
|                                     |  <---    |  ACK                      |
| EOT                                 |  --->    |                           |
|                                     |  <---    |  ACK                      |
------------------------------------------------------------------------------
对于发送方仅仅支持校验和的传输方式,接收方应首先发送NAK信号来发起传输,如果发送方没有数据发送过来,需要超时等待3秒之后再发起NAK信号来进行数据传输。对于数据传输正确,接收方需要发送ACK信号来进行确认,如果数据传输有误,则发送NAK信号,发送方在接收到NAK信号之后需要重新发起该次数据传输,如果数据已近传输完成,发送方需要发送EOT信号,来结束数据传输。


5. 如何取消数据传输
当接收方发送CAN表示无条件结束本次传输过程,发送方收到CAN后,无需发送EOT来确认,直接停止数据的发送。




二、XModem-CRC16协议


1. XModem-CRC16信息包格式
XModem协议在90年代做过一次修改,将132字节处的校验和改成双字节的CRC16校验,CRC16校验的信息包格式如下:
------------------------------------------------------------------------------
|     Byte1     |    Byte2    |     Byte3      |Byte4~Byte131|Byte132~Byte133|
|----------------------------------------------------------------------------|
|Start Of Header|Packet Number|~(Packet Number)| Packet Data |   16Bit CRC   |
------------------------------------------------------------------------------
     
60主题1329帖子3990积分
中级工程师
  1. 关注TA
  2. 发消息
专家等级:结帖率:100%
板凳
发表于 2017-5-18 16:53 | 只看该作者 |返回版面
Xmodem协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个认可字节。然而,这种对每个块都进行认可的策略将导致低性能,特别是具有很长传播延迟的卫星连接的情况时,问题更加严重。
    使用循环冗余校验的与Xmodem相应的一种协议称为Xmodem-CRC。还有一种是Xmodem-1K,它以1024字节一块来传输数据。Zmodem是最有效的一个Xmodem版本,它不需要对每个块都进行认可。事实上,它只是简单地要求对损坏的块进行重发。Zmodem对按块收费的分组交换网络是非常有用的。不需要认可回送分组在很大程度上减少了通信量。
    Ymodem也是一种Xmodem的实现。它包括Xmodem-1K的所有特征,另外在一次单一会话期间为发送一组文件,增加了批处理文件传输模式。

    Xmodem协议相关控制字符:
    SOH             0x01
    STX             0x02
    EOT             0x04
    ACK             0x06
    NAK             0x15
    CAN             0x18
    CTRLZ           0x1A
    标准Xmodem协议帧格式(每个数据包含有128字节数据)
______________________________________________________________
|     |            |                   |          |            |
| SOH | 信息包序号 |  信息包序号的补码 | 数据区段 |  校验和    |
|_____|____________|___________________|__________|____________|
    1k-Xmodem帧格式(每个数据包含有1024字节数据)
______________________________________________________________
|     |            |                   |          |            |
| STX | 信息包序号 |  信息包序号的补码 | 数据区段 |  校验和    |
|_____|____________|___________________|__________|____________|

说明:
  SOH: 帧的开头字节,代表信息包中的第一个字节;
  信息包序号: 对 256 取模所得到当前包号,第一个信息包的序号为 1 ,而信息包序号范围 0~255;
  信息包序号的补码: 当前信息包号的补码;
  数据区段: 数据区段的长度固定为 128 字节;
    校验和: 1字节的算术校验和,只对数据区段计算后对 256 取模而得。

数据包说明
    对于标准Xmodem协议来说,如果传送的文件不是128的整数倍,那么最后一个数据包的有效内容肯定小于帧长,不足的部分需要用CTRL-Z(0x1A)来填充。如果传送的是bootloader工程生成的.bin文件,mcu收到后遇到0x1A字符会怎么处理?其实如果传送的是文本文件,那么接收方对于接收的内容是很容易识别的,因为CTRL-Z不是前128个ascii码,不是通用可见字符,如果是二进制文件,mcu其实也不会把它当作代码来执行。哪怕是excel文件等,由于其内部会有些结构表示各个字段长度等,所以不会读取多余的填充字符。对于1k-Xmodem,同上理。
启动传输
    传输由接收方启动,方法是向发送方发送"C"或者NAK(这里提到的NAK是用来启动传输的,它也可用来对数据产生重传的机制)。接收方发送NAK信号表示接收方打算用累加和校验;发送字符"C"则表示接收方想打算使用CRC校验。
传输过程
    当接收方发送的第一个"C"或者NAK到达发送方,发送方认为可以发送第一个数据包,传输已经启动。发送方接着应该将数据以每次128字节的数据加上包头,包号,包号补码,末尾加上校验和,打包成帧格式传送。
    发送方发了第一包后就等待接收方的确认字节ACK,收到接收方传来的ACK确认,就认为数据包被接收方正确接收,并且接收方要求发送方继续发送下一个包;如果发送方收到接收方传来的NAK(这里,NAK用来告诉发送方重传,不是用来启动传输)字节,则表示接收方请求重发刚才的数据包;如果发送方收到接收方传来的CAN字节,则表示接收方请求无条件停止传输。
结束传输
    如果发送方正常传输完全部数据,需要结束传输,正常结束需要发送方发送EOT 字节通知接收方。接收方回以ACK进行确认。当然接收方也可强制停止传输,当接收方发送CAN 字节给发送方,表示接收方想无条件停止传输,发送方收到CAN后,不需要再发送 EOT确认。
特殊处理
    虽然数据包是以 SOH 来标志一个信息包的起始的,但在 SOH 位置上如果出现EOT则表示数据传输结束,再也没有数据传过来。接收方首先应确认数据包序号的完整性,通过对数据包序号取补,然后和数据包序号的补码异或,结果为0表示正确,结果不为0则发送NAK请求重传。
    接收方确认数据包序号正确后,然后检查是否期望的序号。如果不是期望得到的数据包序号,说明发生严重错误,应该发送一个 CAN 来中止传输。如果接收到的数据包的包序号和前一包相同,那么m收方会忽略这个重复包,向发送方发出 ACK ,准备接收下一个包。
    接收方确认了信息包序号的完整性和是正确期望的后,只对 128 字节的数据区段进行算术和校验,结果与帧中最后一个字节(算术校验和)比较,相同发送 ACK,不同发送 NAK。
     
60主题1329帖子3990积分
中级工程师
  1. 关注TA
  2. 发消息
专家等级:结帖率:100%
地板
发表于 2017-5-18 16:55 | 只看该作者 |返回版面
没有找到直接能用的,网上51了,430了,相关的代码都有,你可以找个靠谱的修改一下,移植。
     
4主题34帖子112积分
中级技术员
  1. 关注TA
  2. 发消息
专家等级:结帖率:25%
5
 楼主| 发表于 2017-5-18 17:12 | 只看该作者 |返回版面
zhuomuniao110 发表于 2017-5-18 16:55
没有找到直接能用的,网上51了,430了,相关的代码都有,你可以找个靠谱的修改一下,移植。 ...

写的太复杂了,都是其他线的,希望能有个新唐的参照啊
     
4主题34帖子112积分
中级技术员
  1. 关注TA
  2. 发消息
专家等级:结帖率:25%
6
 楼主| 发表于 2017-5-18 17:13 | 只看该作者 |返回版面
zhuomuniao110 发表于 2017-5-18 16:55
没有找到直接能用的,网上51了,430了,相关的代码都有,你可以找个靠谱的修改一下,移植。 ...

这些资料都看过了,谢谢,现在就希望能有个新唐的Dome学习哈
53主题1311帖子3922积分
中级工程师
  1. 关注TA
  2. 发消息
专家等级:结帖率:100%打赏:0.00受赏:0.01
7
发表于 2017-5-18 17:39 | 只看该作者 |返回版面
53主题1311帖子3922积分
中级工程师
  1. 关注TA
  2. 发消息
专家等级:结帖率:100%打赏:0.00受赏:0.01
8
发表于 2017-5-18 17:39 | 只看该作者 |返回版面
下载站的这个,楼主看看能用不
     
4主题34帖子112积分
中级技术员
  1. 关注TA
  2. 发消息
专家等级:结帖率:25%
9
 楼主| 发表于 2017-5-18 17:45 | 只看该作者 |返回版面
dongnanxibei 发表于 2017-5-18 17:39
下载站的这个,楼主看看能用不

谢谢层主,这个我之前已经下载了,就是个坑,里面就一个协议的说明
53主题1311帖子3922积分
中级工程师
  1. 关注TA
  2. 发消息
专家等级:结帖率:100%打赏:0.00受赏:0.01
10
发表于 2017-5-18 17:54 | 只看该作者 |返回版面
qwe12377yu 发表于 2017-5-18 17:45
谢谢层主,这个我之前已经下载了,就是个坑,里面就一个协议的说明

你想要他里面那个亿万先生的例程是吗?
     
4主题34帖子112积分
中级技术员
  1. 关注TA
  2. 发消息
专家等级:结帖率:25%
11
 楼主| 发表于 2017-5-18 17:57 | 只看该作者 |返回版面
dongnanxibei 发表于 2017-5-18 17:54
你想要他里面那个亿万先生的例程是吗?

是的咧
     
4主题34帖子112积分
中级技术员
  1. 关注TA
  2. 发消息
专家等级:结帖率:25%
12
 楼主| 发表于 2017-5-18 18:00 | 只看该作者 |返回版面
dongnanxibei 发表于 2017-5-18 17:54
你想要他里面那个亿万先生的例程是吗?

其实我想要的很简单,就是通过Xmodem协议接收一个文件
     
4主题34帖子112积分
中级技术员
  1. 关注TA
  2. 发消息
专家等级:结帖率:25%
13
 楼主| 发表于 2017-5-18 18:01 | 只看该作者 |返回版面
dongnanxibei 发表于 2017-5-18 17:54
你想要他里面那个亿万先生的例程是吗?

其实我想要的很简单,就是通过Xmodem协议接收一个文件
53主题1311帖子3922积分
中级工程师
  1. 关注TA
  2. 发消息
专家等级:结帖率:100%打赏:0.00受赏:0.01
14
发表于 2017-5-18 19:17 | 只看该作者 |返回版面




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 手机登录
x
53主题1311帖子3922积分
中级工程师
  1. 关注TA
  2. 发消息
专家等级:结帖率:100%打赏:0.00受赏:0.01
15
发表于 2017-5-18 19:17 | 只看该作者 |返回版面

  • /* ========================================================================= */
  • /* The information contained herein is the exclusive property of             */
  • /* Sunplus Technology Co. And shall not be distributed, reproduced,          */
  • /* or disclosed in whole in part without prior written permission.           */
  • /*             (C) COPYRIGHT 2004 SUNPLUS TECHNOLOGY CO.                     */
  • /*                    ALL RIGHTS RESERVED                                    */
  • /* The entire notice above must be reproduced on all authorized copies.      */
  • /* ========================================================================= */
  • /*                                                                                                                                                          */
  • /* ========================================================================= */
  • /* Project Name  : AN_SPMC75_0109                                                                             */
  • /* File Name     : Xmodem.c                                                                                                          */
  • /* Description   : XmodemЭ�����������                                                                         */
  • /*                                                                                                      */
  • /* Processor     : SPMC75F2413A                                                                                             */
  • /* Tools             : u'nSP IDE tools v1.18.1A or later version                                 */
  • /* ========================================================================= */
  • /* Revision                                                                                                                                         */
  • /* ========================================================================= */
  • /* Version       :  1.00                                                                                                            */
  • /* Date                         :        2005.9.2                                                                                                 */
  • /* Modified by   :        ����������ļ�ͷ�����µ�ͷ�ļ�                                                         */
  • /* Description         :                                                                                                                     */
  • /* ========================================================================= */

  • #include        "AN_SPMC75_0109.H"
  • /* ----------------------------------------------------------------------------------------
  • Xmodem transmit in 16-Bit CRC mode ,receiving buffer define:
  •    +--------------------------------------------------------------------------------------+
  •    |           Byte0          |                 Byte1    |           Byte2            |  Byte 3--130  |  Byte 131--132  |
  •    +--------------------------------------------------------------------------------------+
  •    | Start of header | Packet Number | ~(Packet Number) |  Packet Data  | CRC Hi | CRC Lo |
  •    +--------------------------------------------------------------------------------------+ */
  • /* ----------------------------------------------------------------------------------------
  • Xmodem transmit in Check Sum mode ,receiving buffer define:
  •    +-------------------------------------------------------------------------------------------+
  •    |           Byte0          |                 Byte1    |           Byte2            |  Byte 3--130  |  Byte 131 | Byte 132 |
  •    +-------------------------------------------------------------------------------------------+
  •    | Start of header | Packet Number | ~(Packet Number) |  Packet Data  | CheckSum  |         NOP    |
  •    +-------------------------------------------------------------------------------------------+ */
  • UInt8         rxdbuf[133] = {0};
  • // --------------------------------------------------------------- //
  • TYPESTATUS                xmodemstatus;
  • static UInt8        *rxdptr = rxdbuf;
  • static UInt16         XmodemTimeOut;
  • //===========================================================================
  • extern UInt16 Calc_CRC16(UInt8 *cptr, Int16 count);
  • extern UInt16 Calc_Cksum(UInt8 *cptr, Int16 count);
  • /*
  • //=============================================================
  • // ----Function: Calc_CRC16A();
  • // ------Syntax: UInt16 Calc_CRC16A(UInt8 *cptr, Int16 count)
  • // -Description: CRC 16 calculate
  • // -------Notes:
  • // --parameters: cptr: data Cursor                count: data length
  • // -----returns: CRC16
  • //=============================================================
  • static UInt16 Calc_CRC16A(UInt8 *cptr, Int16 count)
  • {
  •         UInt16 crc = 0,i;

  •         while(--count >= 0)
  •         {
  •                 crc = crc ^ (UInt16)(*cptr++) << 8;
  •                 for(i=0;i<8;i++)
  •                 {
  •                         if(crc & 0x8000)        crc = crc << 1 ^ 0x1021;
  •                         else        crc = crc << 1;
  •                 }
  •         }
  •         return(crc);
  • }*/
  • /*
  • //=============================================================
  • // ----Function: Calc_Cksum();
  • // ------Syntax: UInt16 Calc_Cksum(UInt8 *cptr, Int16 count);
  • // -Description: Check sum calculate
  • // -------Notes:
  • // --parameters: cptr: data Cursor                count: data length
  • // -----returns: Checksum
  • //=============================================================
  • static UInt16 Calc_Cksum(UInt8 *cptr, Int16 count)
  • {
  •         UInt16 sum = 0,i;
  •         for(i=0;i<count;i++,cptr++)        sum += *cptr;
  •         return(sum&0xff);
  • }*/
  • //=============================================================
  • // ----Function: Spmc75_XmodemPurge();
  • // ------Syntax: void Spmc75_XmodemPurge(void);
  • // -Description: Purge
  • // -------Notes: Wait 1 second
  • // --parameters: none
  • // -----returns: none
  • //=============================================================
  • static void Spmc75_XmodemPurge(void)
  • {
  •         UInt8 flush;
  •         xmodemstatus.B._timeout = FALSE;
  •         XmodemTimeOut = TIMEOUT_1S;                // 1 second timeout
  •         P_CMT_Start->B.ST0 = 1;
  •         P_UART_Ctrl->W         = CW_UART_RXEN|CW_UART_TXEN;
  •         while(!xmodemstatus.B._timeout) // read uart until done
  •         {       
  •                 flush = P_UART_Data->W;
  •         }
  •         P_UART_Ctrl->W = CW_UART_RXIE|CW_UART_RXEN|CW_UART_TXEN;
  •         P_CMT_Start->B.ST0 = 0;                        // disable timer/counter
  • }

  • //=============================================================
  • // ----Function: Spmc75_XmodemRecvwait();
  • // ------Syntax: void Spmc75_XmodemRecvwait(void);
  • // -Description: Recv wait buffer full or time out
  • // -------Notes:
  • // --parameters: none
  • // -----returns: none
  • //=============================================================
  • static void Spmc75_XmodemRecvwait(void)
  • {
  •         xmodemstatus.B._timeout = FALSE;         // set in timer counter 0 overflow interrupt routine
  •         XmodemTimeOut = TIMEOUT_1S;                        // 1 second timeout
  •         P_CMT_Start->B.ST0 = 1;
  •         while(!xmodemstatus.B._bufmark && !xmodemstatus.B._timeout);
  •                                                                                 // turn off timer - no more time outs needed
  •         P_CMT_Start->B.ST0 = 0;                         // disable timer/counter 1 clock
  • }

  • //=============================================================
  • // ----Function: Spmc75_XmodemRespond();
  • // ------Syntax: void Spmc75_XmodemRespond(UInt8 packet)
  • // -Description: Respond
  • // -------Notes:
  • // --parameters: packet: packet status
  • // -----returns: none
  • //=============================================================
  • static void Spmc75_XmodemRespond(UInt8 packet)
  • {
  •         // clear buffer flag here ... when acking or nacking sender may respond
  •         // very quickly.
  •         xmodemstatus.B._bufmark = EMPTY;
  •         xmodemstatus.B._recverr = FALSE;                 // framing and over run detection
  •         if((packet == GOOD) || (packet == DUP) || (packet == END))
  •         {
  •                 while(P_UART_Status->B.BY);                 // wait till transmit register is empty
  •                 P_UART_Data->W = ACK;                                 // now for the next packet
  •         }
  •         else
  •         {
  •                 while(P_UART_Status->B.BY);                        // wait till transmit register is empty
  •                 Spmc75_XmodemPurge();                                 // let transmitter empty its buffer
  •                 P_UART_Data->W = NAK;                                 // tell sender error
  •         }
  • }

  • //=============================================================
  • // ----Function: Spmc75_XmodemSendc();
  • // ------Syntax: void Spmc75_XmodemSendc(void);
  • // -Description: Send 'C'/NAK for request host transmitter
  • // -------Notes: 'C'->(wait 3s)->NAK->(wait 3s)->'C'->.....
  • // --parameters: none
  • // -----returns: none
  • //=============================================================
  • static void Spmc75_XmodemSendc(void)
  • {
  •         XmodemTimeOut = TIMEOUT_3S;                        // 3 second timeout
  •         xmodemstatus.B._bufmark = EMPTY;
  •         xmodemstatus.B._recverr = FALSE;        // checked in Spmc75_ValidatePacket for framing or overruns
  •                                                                                 // send character 'C'/NAK until we get a packet from the sender
  •         while(!xmodemstatus.B._bufmark)
  •         {
  •                 xmodemstatus.B._timeout = FALSE;
  •                 xmodemstatus.B._recvmod = 1;        // tell sender CRC mode
  •                 while(P_UART_Status->B.BY);         // wait till Data register is empty
  •                 P_UART_Data->W = CRCCHR;                 // signal transmitter that I'm ready in CRC mode ... 128 byte packets
  •                 P_CMT_Start->B.ST0 = 1;                 // Allow CMT0 timer start timing
  •                                                                                 // wait for timeout or recv buffer to fill
  •                 while(!xmodemstatus.B._timeout && !xmodemstatus.B._bufmark);
  •                 P_CMT_Start->B.ST0 = 0;                 // disable timer/counter 1 clock
  •                
  •                 if(xmodemstatus.B._timeout)         // start wait loop again
  •                 {
  •                         xmodemstatus.B._timeout = FALSE;
  •                         xmodemstatus.B._recvmod = 0;// tell sender Checksum mode
  •                         while(P_UART_Status->B.BY); // wait till Data register is empty
  •                         P_UART_Data->W = NAK;                // signal transmitter that I'm ready in Checksum mode ... 128 byte packets
  •                         P_CMT_Start->B.ST0 = 1;                // Allow CMT0 timer start timing
  •                         while(!xmodemstatus.B._timeout && !xmodemstatus.B._bufmark);
  •                         P_CMT_Start->B.ST0 = 0;                // disable timer/counter clock
  •                 }
  •         }
  • }

  • //=============================================================
  • // ----Function: Spmc75_ValidatePacket();
  • // ------Syntax: UInt8 Spmc75_ValidatePacket(UInt8 *bufptr);
  • // -Description: Validate Packet status.
  • // -------Notes: Validate Packet is OK will apply 'break' Interrupt
  • // --parameters: bufptr: should Validate Packet data Cursor
  • // -----returns: result
  • //=============================================================
  • static UInt8 Spmc75_ValidatePacket(UInt8 *bufptr)
  • {
  •         UInt8 packet = BAD;
  •        
  •         if(!xmodemstatus.B._timeout)
  •         {
  •                 if(!xmodemstatus.B._recverr)
  •                 {
  •                         if(bufptr[0] == SOH)
  •                         {                                                                                                 // valid start
  •                                 if(bufptr[1] == xmodemstatus.B._number+1)
  •                                 {                                                                                         // sequential block number ?
  •                                         if((bufptr[1] + bufptr[2]) == 0xff)
  •                                         {                                                                                 // block number and block number checksum are ok
  •                                                                                                                         // compute CRC and validate it
  •                                                 if(xmodemstatus.B._recvmod)
  •                                                 {
  •                                                         if(Calc_CRC16(&bufptr[3],128) == ((bufptr[131]<<8) | bufptr[132]))
  •                                                         {
  •                                                                 xmodemstatus.B._number = bufptr[1];        // good packet ... ok to increment
  •                                                                 if(xmodemstatus.B._number == 0xFF)        xmodemstatus.B._number = 0;
  •                                                                 packet = GOOD;
  •                                                                 BREAK();               
  •                                                         }
  •                                                 }
  •                                                 else if(Calc_Cksum(&bufptr[3],128) == bufptr[131])
  •                                                 {
  •                                                         xmodemstatus.B._number = bufptr[1];        // good packet ... ok to increment
  •                                                         if(xmodemstatus.B._number == 0xFF)        xmodemstatus.B._number = 0;
  •                                                         packet = GOOD;
  •                                                         BREAK();       
  •                                                 }
  •                                                
  •                                         }                                                                                 // block number checksum
  •                                 }                                                                                         // bad block number or same block number
  •                                 else if(bufptr[1] == xmodemstatus.B._number)
  •                                 {                                                                                         // same block number ... ack got glitched
  •                                         packet = DUP;                                                         // packet is previous packet don't inc packet number
  •                                 }
  •                         }                                                                                                // check for the end       
  •                         else if(bufptr[0] == EOT)
  •                         {
  •                                 packet = END;
  •                                 xmodemstatus.B._recvrdy = 1;
  •                         }
  •                 }
  •                 else        packet = ERR;
  •         }
  •         else        packet = OUT;
  •         return(packet);
  • }

  • //=============================================================
  • // ----Function: Xmodem_Rxd_ISR();
  • // ------Syntax: void Xmodem_Rxd_ISR(void);
  • // -Description: Xmodem receive interrupt service.
  • // -------Notes: Used in UART Rxd ISR.
  • // --parameters: none
  • // -----returns: none
  • //=============================================================
  • void Xmodem_Rxd_ISR(void)
  • {
  •         UInt8 *localptr = rxdptr;
  •        
  •         *localptr++ = P_UART_Data->W;                         // get char
  •         // Framing or over run error check for errors
  •         if(P_UART_RXStatus->W & (CW_UART_Clear_FE|CW_UART_Clear_PE|CW_UART_Clear_OE))
  •         {
  •                 xmodemstatus.B._recverr = TRUE;
  •                  P_UART_RXStatus->W = CW_UART_Clear_FE|CW_UART_Clear_PE|CW_UART_Clear_OE;
  •         }                                                                                // read status register after reading data register
  •                                                                        
  •         switch(rxdbuf[0])                                                 // determine if buffer full
  •         {
  •                 case(SOH):
  •                         if(xmodemstatus.B._recvmod)                // receive CRC16 mode
  •                         {
  •                                 if(localptr > &rxdbuf[132])
  •                                 {
  •                                         xmodemstatus.B._bufmark = FULL;
  •                                         localptr = &rxdbuf[0];
  •                                 }
  •                         }
  •                         else                                                        // receive Checksum mode
  •                         {
  •                                 if(localptr > &rxdbuf[131])
  •                                 {
  •                                         xmodemstatus.B._bufmark = FULL;
  •                                         localptr = &rxdbuf[0];
  •                                 }
  •                         }
  •                         break;
  •                
  •                 default:
  •                         xmodemstatus.B._bufmark = FULL; // first char unknown
  •                         localptr = &rxdbuf[0];
  •                         break;
  •         }
  •         rxdptr = localptr;                                                 // restore global pointer
  • }

  • //=============================================================
  • // ----Function: Spmc75_XmodemReceive();
  • // ------Syntax: void Spmc75_XmodemReceive(void);
  • // -Description: Receive data from PC in Xmodem Protocol
  • // -------Notes: First send 'C'/NAK, then receive data and responsion
  • // --parameters: none
  • // -----returns: none
  • //=============================================================
  • void Spmc75_XmodemReceive(void)
  • {
  •         UInt8 packet;                                                                 // status flag
  •        
  •         rxdptr = rxdbuf;                                                         // point to recv buffer
  •         Spmc75_XmodemSendc();                                                 // send a 'c' until the buffer gets full
  •         packet = Spmc75_ValidatePacket(rxdbuf);         // validate packet 1
  •         rxdptr = rxdbuf;                                                         // re-initialize buffer pointer before acknowledging
  •         Spmc75_XmodemRespond(packet);                                 // ack or nak

  •         while(packet != GOOD)                                                 // if we nak'ed above wait for packet 1 again
  •         {
  •                 Spmc75_XmodemRecvwait();
  •                 packet = Spmc75_ValidatePacket(rxdbuf); // validate packet 1
  •                 rxdptr = rxdbuf;                                                 // re-initialize buffer pointer before acknowledging
  •                 Spmc75_XmodemRespond(packet);                         // ack or nak
  •         }
  •        
  •         while(packet != END)                                                 // get remainder of file
  •         {
  •                 Spmc75_XmodemRecvwait();                                 // wait for error or buffer full
  •                 packet = Spmc75_ValidatePacket(rxdbuf); // validate the packet
  •                 rxdptr = rxdbuf;                                                 // re-initialize buffer pointer before acknowledging
  •                 Spmc75_XmodemRespond(packet);                         // ack or nak
  •         }// end of file transmission
  • }

  • //=============================================================
  • // ----Function: Spmc75_XmodemInitial();
  • // ------Syntax: void Spmc75_XmodemInitial(void);
  • // -Description: Initialization
  • // -------Notes: Initial UART and CMT0, CMT0->8Hz
  • // --parameters: none
  • // -----returns: none
  • //=============================================================
  • void Spmc75_XmodemInitial(void)
  • {
  •         Spmc75_UART_Init();
  •         Spmc75_CMT0_Init();
  •         xmodemstatus.W = 0;
  • }

  • //=============================================================
  • // ----Function: Spmc75_TimeOut_ISR();
  • // ------Syntax: void Spmc75_TimeOut_ISR(void);
  • // -Description: Time out service.
  • // -------Notes: Used in CMT0 ISR.
  • // --parameters: none.
  • // -----returns: none.
  • //=============================================================
  • void Spmc75_TimeOut_ISR(void)
  • {
  •         static UInt16 clock = 0;
  •        
  •         if(++clock > XmodemTimeOut)
  •         {
  •                 clock = 0;
  •                 xmodemstatus.B._timeout = TRUE;
  •         }
  • }
  • //=============================================================
  • // *END*
  • //=============================================================
  • 复制代码
    53主题1311帖子3922积分
    中级工程师
    1. 关注TA
    2. 发消息
    专家等级:结帖率:100%打赏:0.00受赏:0.01
    16
    发表于 2017-5-18 19:18 | 只看该作者 |返回版面
    代码在压缩包,全部的,你可以修改成新唐的。
    53主题1311帖子3922积分
    中级工程师
    1. 关注TA
    2. 发消息
    专家等级:结帖率:100%打赏:0.00受赏:0.01
    17
    发表于 2017-5-18 19:19 | 只看该作者 |返回版面
    如果你不会修改,可以花钱找我修改啊。哈哈,我帮你找到源码已经花费了不少时间了。
    33主题923帖子2764积分
    初级工程师
    1. 关注TA
    2. 发消息
    专家等级:结帖率:0%打赏:0.00受赏:10.00
    18
    发表于 2017-5-18 20:07 | 只看该作者 |返回版面
    这种貌似比较古老了吧
         
    4主题34帖子112积分
    中级技术员
    1. 关注TA
    2. 发消息
    专家等级:结帖率:25%
    19
     楼主| 发表于 2017-5-19 08:59 | 只看该作者 |返回版面
    dongnanxibei 发表于 2017-5-18 19:19
    如果你不会修改,可以花钱找我修改啊。哈哈,我帮你找到源码已经花费了不少时间了。 ...

    感谢花钱的话,我在考虑考虑
    *滑动验证:
    您需要登录后才可以回帖 登录 | 注册 手机登录
    本版积分规则
    分享 快速回复 返回顶部 返回列表
    亿万先生手机版