#define LED_OUT_INACT( ) */
/* 延时2微秒,不精确 */ void { }
/* 延时1微秒,不精确 */ void { }
/* 延时100毫秒,不精确 */ void { }
/* 基本操作 */
unsigned char i, j, c;
mDelay100mS( ) unsigned char i; for ( i = 1; i != 0; i -- );
delay1us( ) unsigned char i; for ( i = 2; i != 0; i -- );
delay2us( )
{ P1_4 = 1; } /* P1.4 低电平驱动LED显示
for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3;
void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ }
void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口
delay2us();
CH375_CMD_PORT=cmd; delay2us();
写入数据,周期不小于1.5uS,如果单片机较快则延时 */ }
unsigned char CH375_RD_DAT_PORT() { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ }
/* 等待CH375中断并获取状态 */
unsigned char mWaitInterrupt() { /* 主机端等待操作完成, 返回操作状态 */
while( CH375_INT_WIRE ); /* 查询等待CH375操作完成中断(INT#低电delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */ return( CH375_DAT_PORT ); CH375_DAT_PORT=dat;
delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */
平) */
CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断,
获取中断状态 */
return( CH375_RD_DAT_PORT( ) );
/* c = CH375_RD_DAT_PORT( ); 返回中断状态 */
/* if ( c == USB_INT_DISCONNECT ) ?; 检测到USB设备断开事件 */ /* else if ( c == USB_INT_CONNECT ) ?; 检测到USB设备连接事件 */ }
/* 设置CH375为USB主机方式 */ unsigned char mCH375Init( ) {
unsigned char i;
#ifdef TEST_CH375_PORT
unsigned char c;
CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); /* 测试工作状态 */ CH375_WR_DAT_PORT( 0x55 ); /* 测试数据 */
c = CH375_RD_DAT_PORT( ); /* 返回数据应该是测试数据取反 */ if ( c != 0xaa ) { /* CH375出错 */
for ( i = 100; i != 0; i -- ) { /* 强制数据同步 */
CH375_WR_CMD_PORT( CMD_RESET_ALL ); /* CH375执行
硬件复位 */
}
}
mDelay100mS( ); /* 延时至少30mS */
c = CH375_RD_DAT_PORT( ); /* 延时 */
#end if
CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); /* 设置USB工作
模式 */
CH375_WR_DAT_PORT( 6 ); /* 模式代码,自动检测USB设备连接 */ for ( i = 0xff; i != 0; i -- ) /* 等待操作成功,通常需要等待10uS-20uS */
if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break; /*
操作成功 */
if ( i != 0 ) return( 0 ); /* 操作成功 */
else return( 0xff ); /* CH375出错,例如芯片型号错或者处于串口方式或者
不支持 */ }
/* 初始化磁盘 */
unsigned char mInitDisk( ) {
unsigned char mIntStatus;
CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断,
获取中断状态 */
mIntStatus = CH375_RD_DAT_PORT( );
if ( mIntStatus == USB_INT_DISCONNECT ) return( mIntStatus ); /* USB
设备断开 */
CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */
*/
mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误
CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容
量 */
mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus != USB_INT_SUCCESS ) { /* 出错重试 */
mDelay100mS( );
CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器
的容量 */ */
/* 可以由CMD_RD_USB_DATA命令将容量数据读出 */ }
/* 从U盘读取多个扇区的数据块到缓冲区 */
unsigned char mReadSector( unsigned long iLbaStart, unsigned char iSectorCount )
/* iLbaStart 是准备读取的线性起始扇区号, iSectorCount 是准备读取的扇区数 */ {
unsigned char mIntStatus; unsigned char *mBufferPoint; unsigned int mBlockCount; unsigned char mLength;
CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 从USB存储器读数return( 0 ); /* U盘已经成功初始化 */ }
if ( mIntStatus != USB_INT_SUCCESS ) return( mIntStatus ); /* 出现错误
mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */
据块 */
CH375_WR_DAT_PORT( (unsigned char)iLbaStart ); /* LBA的最低8位
*/
CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 8 ) ); CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 16 ) );
CH375_WR_DAT_PORT( (unsigned char)( iLbaStart >> 24 ) ); /* LBA的
最高8位 */
CH375_WR_DAT_PORT( iSectorCount ); /* 扇区数 */ mBufferPoint = DATA_BUFFER; /* 指向缓冲区起始地址 */ for ( mBlockCount = iSectorCount * CH375_BLK_PER_SEC;
mBlockCount != 0; mBlockCount -- ) /* 数据块计数 */
{
mIntStatus = mWaitInterrupt( ); /* 等待中断并获取状态 */ if ( mIntStatus == USB_INT_DISK_READ )
/* USB存储器读数据块,
请求数据读出 */
{
CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375
缓冲区读取数据块 */
mLength = CH375_RD_DAT_PORT( ); /* 后续数据的长度 */ while ( mLength ) /* 根据长度读取数据 */
{
SBUF = CH375_RD_DAT_PORT( ); while(!TI) ; TI = 0 ;
//*mBufferPoint = CH375_RD_DAT_PORT( ); /* 读出数据并
保存 */
}
CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 继续执行
//mBufferPoint ++; mLength --; delay2us( );
USB存储器的读操作 */
}