⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmodem.c

📁 nrf9e5 nordic公司出品的带有无线发送接收的单片机的bootloader程序。支持xmodem下载
💻 C
字号:
#include <absacc.h>
#include "xmodem.h"
#include "reg9e5.h"
#include "PubFunc.h"
#include "timer0.h"
#include "serial.h"
#include "25lc320.h"


/******************************************************************************
51系列中,对于int型的双字节数,在内存中的存放顺序为前高后低
如int 0x1234,在内存中实际的存放位置为0x12,0x34
******************************************************************************/
WORD calCRC(BYTE idata *ptr, BYTE data count)
{
	WORD_UN data crc;
	BYTE data i;

	crc.bytArray[0]	= 0;
	crc.bytArray[1] = 0;
	//while (count-- > 0) {
	while(count>0){
		count--;
		crc.bytArray[0] ^= *ptr;
		crc.bytArray[1] ^= 0;
		ptr++;
		
		for (i = 0; i < 8; ++i) {
			if (crc.bytArray[0] & 0x80) {
				//crc.wValue = crc.wValue << 1 ^ 0x1021;
				crc.wValue = crc.wValue << 1;
				crc.bytArray[0] ^= 0x10;
				crc.bytArray[1] ^= 0x21;
			} else {
				crc.wValue = crc.wValue << 1;
			}
		}
	}
	return crc.wValue;
}

void SaveCode(void)
{
	WORD data addr;
	
	addr = (((WORD)XmodemRecvBuf[2])<<7)+896;//写到1024(128*x+896)位置处    //*128 - 96;				//0
	_25LC320_WriteByteInPage(addr, XmodemRecvBuf+4);		//2
//	_25LC320_WriteByteInPage(addr+32, XmodemRecvBuf+36);	//34
	_25LC320_WriteByteInPage(addr+64, XmodemRecvBuf+68);	//66
//	_25LC320_WriteByteInPage(addr+96, XmodemRecvBuf+100);	//98
}

bit XmodemCheck(void)
{
	WORD_UN data rtn;
	if (XmodemRecvBuf[2] + XmodemRecvBuf[3] - 0xFF== 0) {		//0 1
		rtn.wValue = calCRC(XmodemRecvBuf + 4, 128);			//2
		return ( rtn.bytArray[0] == XmodemRecvBuf[132] && rtn.bytArray[1] == XmodemRecvBuf[133]); //130  131
	}
	return 0;
}

void xmodem(void)
{
	BYTE data i;
	CUSTOM_TIMER tmrWaiting;
	
	for (i = 0; i < 20; i++) {
		SetCustomTimer(&tmrWaiting, SECONDS(1));
		SBUF = XMODEM_C;
		serial_recv_num=1;
		while (!IsTimeOut(&tmrWaiting)) {
				if(XmodemRecvBuf[1]==XMODEM_SOH){
					if(serial_recv_num>=134){		//0:u 1:soh 2-133 total 132 134end								
						if (XmodemCheck()) {
							if(XmodemRecvBuf[2]>32)			//24
								;
//								SIOSendData("\r\nFile>3K:", sizeof("\r\nFile>3K:"));
								else { SaveCode();  }
							SBUF = XMODEM_ACK;
						}
						else{
 							SBUF = XMODEM_NAK;
						}
						SetCustomTimer(&tmrWaiting, SECONDS(1));
						serial_recv_num=1; 
				}
			}
			else if(XmodemRecvBuf[1]==XMODEM_EOT){
					SBUF = XMODEM_ACK;
					return;
			}
//			else 
//				serial_recv_num=1;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -