📄 usbhost.c
字号:
/*
* Copyright (c) 2004,成都港顺科技发展有限公司
* All rights reserved.
*
* 编 译 器:Keil:C Compiler:7.20;Assembler:7.10
* 工程名称:POS-Test.UV2
* 文件名称:Windows.C
* 摘 要:窗体显示
*
* 单 片 机:uPSD3254
* 当前版本:0.4
* 作 者:范小飞
* 完成日期:2004-12-7 14:45
*/
#include "Main.h"
#include "CH375HFC.H"
#define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */
#define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */
#define DISK_BASE_BUF_ADDR 0x7000 /* 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */
#define FILE_DATA_BUF_ADDR 0x5000 /* 外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度,字节模式不用该缓冲区 */
#define USBA0COM 0xe800
#define USBA0DAT 0xe000
void mDelay100mS( ) //延时
{
UINT8 i, j, c;
for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3;
}
void mDelay1_2uS( )
{
return;
}
void xWriteCH375Cmd( UINT8 mCmd ) //写命令函数
{
XBYTE[USBA0COM]=mCmd;
}
void xWriteCH375Data( UINT8 mData ) //写数据函数
{
XBYTE[USBA0DAT]=mData;
}
UINT8 xReadCH375Data( void ) //读数据函数
{
UINT8 i;
i=XBYTE[USBA0DAT];
return i;
}
void CH375_PORT_INIT( ) //端口初始化
{
xWriteCH375Cmd(0x05);
}
/* 将程序空间的字符串复制到内部RAM中,返回字符串长度 */
UINT8 mCopyCodeStringToXRAM( UINT8 xdata *iDestination, UINT8 code *iSource )
{
UINT8 i = 0;
while ( *iDestination = *iSource )
{
iDestination ++;
iSource ++;
i ++;
}
return( i );
}
/* 检查操作状态,如果错误则显示错误代码并停机 */
void mStopIfError( UINT8 iError )
{
if ( iError == ERR_SUCCESS ) return; /* 操作成功 */
else
{
//显示错误代码 iError
mDelay100mS( );
while(1);
}
}
void UsbByteWrite(UINT8 *filesname, uchar len,uchar *str) //U盘写字节写函数
{
UINT8 i;
// uchar j,c;
// ulong k;
uint l,m,n;
CH375_PORT_INIT( );
mDelay100mS( );
i=CH375LibInit(); //初始化文件库
mStopIfError(i);
while(1)
{
while(CH375DiskStatus !=DISK_CONNECT)xQueryInterrupt(); //检查U盘是否己连接,如果己连接则断续,如果未连接则等待
mDelay100mS(); //延时
mDelay100mS(); //延时
for ( i = 0; i < 10; i ++ ) //检查U盘是否准备好
{
mDelay100mS( );
if ( CH375DiskReady( ) == ERR_SUCCESS ) break; //如果U盘准备好则继续下一步操作
}
mCopyCodeStringToXRAM( mCmdParam.Open.mPathName, filesname ); //对文件名进行操作
i = CH375FileOpen( ); //打开文件
if ( i == ERR_SUCCESS || i == ERR_MISS_FILE ) //如果文件打开成功或者文件名不存在则进行下一步操作
{
if(i==ERR_MISS_FILE) //如果是文件名不存在则新建文件
{
i = CH375FileCreate( ); //按给定的文件名建立文件
mStopIfError( i ); //判断返回状态是否有错:这里指新建文件是否成功
}
mCmdParam.ByteLocate.mByteOffset = 0xffffffff; /* 移到文件的尾部 */
i = CH375ByteLocate( );
mStopIfError( i );
if(len>30)
{
l=len/30;
m=len%30;
n=0;
while(l)
{
for(i=0;i<30;i++)
{
mCmdParam.ByteWrite.mByteBuffer[i]=*str;
str++;
}
mCmdParam.ByteWrite.mByteCount = 30;
i = CH375ByteWrite( ); /* 以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO */
mStopIfError( i );
l--;
}
if(m)
{
while(m)
{
mCmdParam.ByteWrite.mByteBuffer[i]=*str;
str++;
m--;
}
mCmdParam.ByteWrite.mByteCount = m;
i = CH375ByteWrite( );
mStopIfError( i );
}
else
{
mCmdParam.Close.mUpdateLen = 1; //文件长度更新
i = CH375FileClose( ); //写文件完成,关闭文件
mStopIfError( i );
break;
}
}
else
{
for(i=0;i<len;i++)
{
mCmdParam.ByteWrite.mByteBuffer[i]=*str;
str++;
}
mCmdParam.ByteWrite.mByteCount = len;
i = CH375ByteWrite( ); /* 以字节为单位向文件写入数据,单次读写的长度不能超过MAX_BYTE_IO */
mStopIfError( i );
}
mCmdParam.Close.mUpdateLen = 1; //文件长度更新
i = CH375FileClose( ); //写文件完成,关闭文件
mStopIfError( i );
break;
}
else mStopIfError( i );
}
//判断返回状态是否有错:这里指关闭文件是否成功
}
void UsbFilesWrite(UINT8 *filesname,ulong Sectorlen ,uchar *str) //U盘写字节写函数
{
UINT8 i;
uint c,b;
CH375_PORT_INIT( );
mDelay100mS( ); //端口初始化:这里指初始化串口
i=CH375LibInit(); //初始化文件库
mStopIfError(i);
while(1)
{
while(CH375DiskStatus !=DISK_CONNECT)xQueryInterrupt(); //检查U盘是否己连接,如果己连接则断续,如果未连接则等待
for ( i = 0; i < 2; i ++ ) //检查U盘是否准备好
{
if ( CH375DiskReady( ) == ERR_SUCCESS ) break; //如果U盘准备好则继续下一步操作
}
mCopyCodeStringToXRAM( mCmdParam.Open.mPathName, filesname ); //对文件名进行操作
i = CH375FileOpen( ); //打开文件
if ( i == ERR_SUCCESS || i == ERR_MISS_FILE ) //如果文件打开成功或者文件名不存在则进行下一步操作
{
if(i==ERR_MISS_FILE) //如果是文件名不存在则新建文件
{
i = CH375FileCreate( ); //按给定的文件名建立文件
mStopIfError( i ); //判断返回状态是否有错:这里指新建文件是否成功
}
mCmdParam.Locate.mSectorOffset = 0xffffffff;
i = CH375FileLocate( );
mStopIfError( i );
for(b=0;b<Sectorlen;b++)
{
CH375DirtyBuffer( );
for(c=0;c<512;c++)
{
FILE_DATA_BUF[c]=*str;
str++;
}
mCmdParam.Write.mSectorCount =1;
i=CH375FileWrite();
mStopIfError( i );
}
mCmdParam.Close.mUpdateLen = 1;
i = CH375FileClose( ); //写文件完成,关闭文件
mStopIfError( i );
break;
}
else mStopIfError( i );
}
}
void UsbByteRead(uchar *filesname,ulong startaddress ,uchar readBytelen,uchar *str) //U盘文件读取函数
{
UINT8 i;
CH375_PORT_INIT( );
mDelay100mS(); //端口初始化:这里指口串口初始化
i=CH375LibInit(); //文件系统初始化
mStopIfError(i);
while(1)
{ //判断返回状态是否有错:这里指文件系统初始化是否成功
while(CH375DiskStatus !=DISK_CONNECT)xQueryInterrupt(); //检查U盘是否己插入
mDelay100mS(); //延时
mDelay100mS(); //延时
for ( i = 0; i < 2; i ++ ) //检查U盘是否己准备好
{
mDelay100mS( ); //延时
if ( CH375DiskReady( ) == ERR_SUCCESS ) break; //如果U盘己准备好则进行下一步操作
}
mCopyCodeStringToXRAM( mCmdParam.Open.mPathName, filesname ); //文件名操作
i = CH375FileOpen( ); //打开文件
if ( i == ERR_SUCCESS )
{
mCmdParam.ByteLocate.mByteOffset = startaddress;
i = CH375ByteLocate( );
mStopIfError( i );
mCmdParam.ByteRead.mByteCount = readBytelen;
i = CH375ByteRead( );
mStopIfError( i );
for(i=0;i<readBytelen;i++)
{
str[i]=mCmdParam.ByteWrite.mByteBuffer[i];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -