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

📄 hpi.c

📁 利用单片机实现的USB1.1通信中的人机接口部分的实现代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include 	"FM3164.H"
#include 	"common.h"
#include 	"TPBULK.H"
#include 	"HPI.H"
#include 	"HAL.H"
#include 	"Fat.h"
//#include 	"INTRINS.H"
//bit		SAVE_FLASH;
extern 	bit		SLAVE_IS_ATTACHED;
extern 	bit		SLAVE_FOUND;		// Slave USB device found
extern 	bit		TIMEOUT_ERR;		// timeout error during data endpoint transfer
extern 	bit		DATA_STOP;		// device unplugged during data transfer
extern 	bit		bData1;
extern 	bit		NOW_READ;		//确定当前的写操作是否要加延时,在执行了tpbulkread后=1,执行tpbulkwrite后=0

extern 	uchar 	xdata 	DBUF[2060];			//锁定缓冲区的大小为2048字节
extern	uchar 	xdata 	CurFatSector[512];		//锁定每扇区的大小为512字节
extern	uchar	xdata	flash_buf[128];
extern	uchar	xdata	now_recorder[4];	//now what the ic card pluged into,it series num will be record

extern	UART_RECE_BLOCK		xdata	UartCmdBlock;
extern	UART_SEND_BLOCK		xdata 	UartRspBlock;
extern	uchar	xdata	now_recorder[4];	//now what the ic card pluged into,it series num will be record

xdata	uchar	modify_time[6];			//文件修改时间
uchar 	xdata 	CurDirInfo[512]	_at_	0x0c00;	//定义了当前文件项扇区信息
uchar 	xdata 	file_name[11];
SYS_INFO_BLOCK 		xdata 	DeviceInfo	_at_	0x180;
FILE_INFO 	xdata 	ThisFile	_at_	0x1D0;
extern	data	union
	{
	uint		flash_page;
	uchar	flash_arr[2];
	struct
		{
		uchar	page_MSB;
		uchar	page_LSB;
		}flash_byte;
	}flash_address;
extern	data	union
	{
	uint		add_word;
	uchar	add_byte[2];
	}add_start;						//I2C start address that need operate

extern	bit	compare_arr(uchar *source,uchar *target,uchar number);
extern	void 	copy_ram_same(uchar *source,uchar *target,uchar	number_of);
extern	void time_to_fat(uchar	*source_time_ptr,ulong	*fat_style_ptr);
extern	void	read_page(void);
extern	void	read_realtime(uchar *old_time1);
extern	void	fm_write(uchar *load_add,uchar write_len);
void	flash_reset_read(void);
void	read_to_dbuf(uchar	step,uint	read_len);		//将FM24C64的数据载入到USB缓冲区,参数为地址分辨码
extern	void         delay_1ms();
/*bit DetectDevice(void)
	{
	return SLAVE_IS_ATTACHED;
	}
*/
//void	test_read(void)
//	{
//	idata		ulong	count1;
//	for(count1=0;count1<1024;count1++)
//		{
//		RBC_Read(count1,2,DBUF);
//		}
//	}
void	get_file_name(void)	//把记录仪编号转化为文件名(11字节ASCII)存放在file_name
	{
	uchar	i;
	for(i=0;i<4;i++)
		{
		file_name[2*i]=(now_recorder[i]>>4)+0x30;		//转为ASCII
		file_name[2*i+1]=(now_recorder[i]&0x0f)+0x30;	//转为ASCII
		}
	for(i=0;i<8;i++)
		if(file_name[i]>'9')
			file_name[i]=file_name[i]+7;
	file_name[8]='H';
	file_name[9]='A';
	file_name[10]='N';		//扩展名都定为*.HAN
	}

bit OpenFile(void)
	{
	uint 		data		i;
	uchar 	idata		sector;
	PDIR_INFO 	xdata	pDirInfo;

	if(!SLAVE_IS_ATTACHED)		//如果没有连接的设备
		{
		UartRspBlock.uart_rsp_block_usb.errcode=ERC_NODEVICE;	//用串口返回文件未打开的信息并退出
		return FALSE;
		}
//设备已经连接
	ThisFile.bFileOpen=0;
	////////由记录仪编号得到文件名////////
	get_file_name();
	for(sector=0;sector<DeviceInfo.BPB_RootEntCnt>>4;sector++)	//从根目录项的扇区中找出一个区域是和参数代表的文件名重合的
		{
		//////////////////////////////////////////////////
		if(!RBC_Read(DeviceInfo.RootStartSector+sector,1,CurDirInfo))
			{
			UartRspBlock.uart_rsp_block_usb.errcode=ERC_DEVICEERR;	//读入时出错,直接返回
			return FALSE;
			}
		///////////////////////////////////////////
		for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)		//在扇区的每个目录项中找前11个字节(短文件名和扩展名)相同的文件项
			{
			if(CurDirInfo[i]==0x00)
				{
				UartRspBlock.uart_rsp_block_usb.errcode=ERC_FILENOTFOUND;	//到了目录项的结束还没找到就说明本文件并不存在
				return FALSE;
				}
			///////////////////////////////////////////
			if(compare_arr(CurDirInfo+i,file_name,11))		//如果找到了所要的文件
				{
//			    	ThisFile.bFileOpen=1;				//文件名匹配,找到了
				pDirInfo=(PDIR_INFO)(CurDirInfo+i);
				ThisFile.StartCluster=SwapINT16(pDirInfo->startCluster);
			//zyf 编 START 2005。05。18
				if(ThisFile.StartCluster==0)	//如果起始簇为0,是系统未分配存储空间与之,要在此处为其分配,只有在文件长度为0的时候才允许
					{
					check_free_capacity(0);	//检查空间是否足够写文件
					ThisFile.ClusterPointer=ThisFile.StartCluster=DeviceInfo.FirstFreeClu;
					ThisFile.SectorPointer=0;
					}
			//zyf 编END
				ThisFile.LengthInByte=SwapINT32(pDirInfo->length);
				ThisFile.ClusterPointer=ThisFile.StartCluster;
				ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.StartCluster);
				ThisFile.SectorofCluster=0;
				copy_ram_same(CurDirInfo+i,ThisFile.FileName,11);	//载入当前文件名
				ThisFile.NowFatSecNum=ThisFatSecNum(ThisFile.StartCluster);		//当前簇在当前FAT表项中的绝对扇区号
				ThisFile.NowFatEntOffset=ThisFatEntOffset(ThisFile.StartCluster);	//当前簇在当前FAT表项中的相对指针
				ThisFile.NowDirItem=i;	//得到在当前文件项的序号
				ThisFile.NowDirSec=sector;	//得到在当前文件项的所在扇区
			// 读入本文件所在FAT表的第一个扇区  ////////////////////
				if(!RBC_Read(ThisFile.NowFatSecNum,1,CurFatSector))		//将当前被打开文件的FAT16扇区加载到CurFatSector
					return FALSE;
				ThisFile.bFileOpen=1;
				return TRUE;
				}
			}
		}
	return FALSE;
	}

bit CreateFile(void)		//建立文件,插入文件表项32字节的数据,修正FAT的内容
	{
	unsigned int data	sector,i;
	PDIR_INFO xdata	pDirInfo;
	if(!SLAVE_IS_ATTACHED)		//如果优盘未插入则给出回应
		{
		UartRspBlock.uart_rsp_block_usb.errcode=ERC_NODEVICE;
		return FALSE;
		}
	/////// Search a free space in the root dir space and build the item ///
	ThisFile.bFileOpen=0;

	for(sector=0;sector<DeviceInfo.BPB_RootEntCnt>>4;sector++)		//在根目录区查找是否有用来存放新文件的文件表项的位置
	    	{
		if(!RBC_Read(DeviceInfo.RootStartSector+sector,1,CurDirInfo))		//读取失败则终止
			{
			UartRspBlock.uart_rsp_block_usb.errcode=ERC_DEVICEERR;
			return FALSE;
			}
		///////////////////////////////////////////////////
		for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)	//在读出的每个扇区中查找
			{
			if((CurDirInfo[i]==0x00)||(CurDirInfo[i]==0xE5))	//文件表项的首字节为00或E5表示此项为空或者已经删除的文件表项,可以用来写新的文件表项
				{
				ThisFile.NowDirItem=i;		//得到在当前文件项的序号
				ThisFile.NowDirSec=sector;		//得到在当前文件项的所在扇区
				pDirInfo=(PDIR_INFO)(CurDirInfo+i);	//将要建立的表项内容复制放在该搜索到的位置上
				copy_ram_same(file_name,pDirInfo->name,11);	//文件名和扩展名一起拷贝8+3byte
//				pDirInfo->startCluster=SwapINT16(FindFirstFreeClus());	//起始扇区先设置为第1个闲簇,FAT16只有低位簇号
				pDirInfo->startCluster=SwapINT16(DeviceInfo.FirstFreeClu);	//起始扇区先设置为第1个闲簇,FAT16只有低位簇号
				pDirInfo->startCluster_msb=0;	//起始扇区先设置为第1个闲簇,FAT16只有低位簇号,高位为0
				pDirInfo->length=0;				//插入的文件长度暂时定为0字节
				time_to_fat(modify_time,(ulong *)(&pDirInfo->lastUpdateTime));	//pDirInfo->lastUpdateTime,将时间和日期都转换为FAT的格式
				pDirInfo->Dir_CrtTime=pDirInfo->lastUpdateTime;		//创建时间即最后写时间
				pDirInfo->Dir_CrtDate=pDirInfo->lastUpdateDate;		//创建日期即最后写日期
				NOW_READ=1;
				if(!RBC_Write(DeviceInfo.RootStartSector+sector,1,CurDirInfo))	//回写到该扇区
		  	 		{
		  	 		UartRspBlock.uart_rsp_block_usb.errcode=ERC_DEVICEERR;		//回写失败
					return FALSE;
		  	 		}
//				else
//					return(OpenFile());
//--------------------Naoki 060720 Update------------------------------------------------------
				ThisFile.StartCluster=SwapINT16(pDirInfo->startCluster);
				if(ThisFile.StartCluster==0)	//如果起始簇为0,是系统未分配存储空间与之,要在此处为其分配,只有在文件长度为0的时候才允许
				{
					check_free_capacity(0);	//检查空间是否足够写文件
					ThisFile.ClusterPointer=ThisFile.StartCluster=DeviceInfo.FirstFreeClu;
					ThisFile.SectorPointer=0;
				}
				ThisFile.LengthInByte=SwapINT32(pDirInfo->length);
				ThisFile.ClusterPointer=ThisFile.StartCluster;
				ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.StartCluster);
				ThisFile.SectorofCluster=0;
				ThisFile.NowFatSecNum=ThisFatSecNum(ThisFile.StartCluster);		//当前簇在当前FAT表项中的绝对扇区号
				ThisFile.NowFatEntOffset=ThisFatEntOffset(ThisFile.StartCluster);	//当前簇在当前FAT表项中的相对指针
				if(!RBC_Read(ThisFile.NowFatSecNum,1,CurFatSector))		//将当前被打开文件的FAT16扇区加载到CurFatSector
					return FALSE;
				ThisFile.bFileOpen=1;
				return TRUE;
//---------------------------------------------------------------------------------------------
				}
			}
		}
	}

//此时还需要将文件的最后修改时间与编号连同文件名进行加密数据存储,以备校验文件的合法性
void	save_file_modify_time(void)
	{
	uchar	i;
	flash_buf[0]=now_recorder[0]+modify_time[0];
	flash_buf[1]=now_recorder[1]+modify_time[1];
	flash_buf[2]=now_recorder[2]+modify_time[2];
	flash_buf[3]=now_recorder[3]+modify_time[3];
	flash_buf[4]=file_name[0]+modify_time[4];
	flash_buf[5]=file_name[1]+modify_time[5];
	flash_buf[6]=file_name[2]+modify_time[0];
	flash_buf[7]=file_name[3]+modify_time[1];
	flash_buf[8]=file_name[4]+modify_time[2];
	flash_buf[9]=file_name[5]+modify_time[3];
	flash_buf[10]=file_name[6]+modify_time[4];
	flash_buf[11]=file_name[7]+modify_time[5];

	for(i=8;i<12;i++)
		{
		flash_buf[i]^=flash_buf[i-4];

⌨️ 快捷键说明

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