/********* CH375的INT#引脚连接51单片机的INT0引脚, 采用中断方式 *********/
/***************** CH375中断服务程序,使用寄存器组1 *********************/
void
CH375Interrupt( ) interrupt 0 using 1
{
unsigned char
s, len;
CH375_WR_CMD_PORT( CMD_GET_STATUS );
// 获取中断状态并取消中断请求
delay(2);
// 至少延时2uS
s = CH375_RD_DAT_PORT( );
// 获取中断状态
if ( s == USB_INT_SUCCESS ) UdiskStatus = STATUS_READY;
// 操作成功
else if ( s == USB_INT_DISCONNECT )
{
UdiskStatus = STATUS_DISCONNECT;
// 检测到USB设备断开事件
LED_OUT_INACT( );
}
else if ( s == USB_INT_CONNECT )
{
UdiskStatus = STATUS_CONNECT;
// 检测到USB设备连接事件
LED_OUT_ACT( );
}
else if ( s == USB_INT_DISK_READ ) // USB存储器读数据块,请求数据读出
{
CH375_WR_CMD_PORT( CMD_RD_USB_DATA );
// 从CH375缓冲区读取数据块
delay(2);
// 至少延时2uS
len = CH375_RD_DAT_PORT( );
// 后续数据的长度
while ( len )
{
*mBufferPoint = CH375_RD_DAT_PORT( );
// 读出数据并保存
mBufferPoint ++;
len --;
}
CH375_WR_CMD_PORT( CMD_DISK_RD_GO );
// 继续执行USB存储器的读操作
}
else if ( s == USB_INT_DISK_WRITE )// USB存储器写数据块,请求数据写入
{
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 );
// 向CH375缓冲区写入数据块
delay(2);
len = CH375_MAX_DATA_LEN;
CH375_WR_DAT_PORT( len );
// 后续数据的长度
do {
CH375_WR_DAT_PORT( *mBufferPoint );
mBufferPoint ++;
}
while ( -- len );
CH375_WR_CMD_PORT( CMD_DISK_WR_GO );
// 继续执行USB存储器的写操作
}
else// 操作失败
{
UdiskStatus = STATUS_ERROR;
}
CH375_INT_FLAG = 0;
清中断标志
}
/*************** 设置CH375为USB主机方式 *************/
unsigned char
mCH375Init( )
{
unsigned char
i;
UdiskStatus = STATUS_DISCONNECT;
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( TRUE );
// 操作成功
else return( FALSE );
// CH375出错,例如芯片型号错或者处于串口方式或者不支持
}
/*********** 等待U盘准备好或者等待上次操作结束 ***************/
unsigned char
mWaitReady( )
{
while( UdiskStatus == STATUS_WAIT );
// 等待上次操作结束
if ( UdiskStatus == STATUS_READY ) return( TRUE );
// U盘已经准备好操作,上次操作成功
else if ( UdiskStatus == STATUS_ERROR )// 上次操作失败
{
UdiskStatus = STATUS_WAIT;
CH375_WR_CMD_PORT( CMD_DISK_RESET );
// 复位U盘
while( UdiskStatus == STATUS_WAIT );
// 等待中断状态
if ( UdiskStatus == STATUS_READY ) return( TRUE );
// 等待中断状态,操作成功
return( FALSE );
/* UdiskStatus = STATUS_ERROR */
}
else if ( UdiskStatus == STATUS_DISCONNECT )
{
/* U盘已经断开 */
/*
while ( UdiskStatus == STATUS_DISCONNECT );*/
return( FALSE );
}
else if ( UdiskStatus == STATUS_CONNECT ) // U盘已经连接
{
delay(50000 );
// 如果U盘刚插入那么最好稍等一下再操作
delay(50000 );
delay(50000 );
delay(50000 );
//延时200ms
CH375_WR_CMD_PORT( CMD_DISK_INIT );
// 初始化USB存储器
while ( UdiskStatus == STATUS_CONNECT );
// 等待中断状态
if ( UdiskStatus == STATUS_READY )
// 操作成功,磁盘已经初始化并安装到系统中
{
return( TRUE );
}
else return( FALSE );
}
return( FALSE );
}
/************** 从U盘读取多个扇区的数据块到缓冲区 ******************/
unsigned char
mReadSector( unsigned long iLbaStart, unsigned char iSectorCount, unsigned char *iBuffer )
/* iLbaStart 是准备读取的线性起始扇区号, iSectorCount 是准备读取的扇区数, iBuffer 是存放返回数据的缓冲区的起址 */
{
if ( mWaitReady( ) == FALSE ) return( FALSE );
mBufferPoint = iBuffer;
// 指向缓冲区起始地址
UdiskStatus = STATUS_WAIT;
CH375_WR_CMD_PORT( CMD_DISK_READ );
// 从USB存储器读数据块
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 );
// 扇区数 */
/* 如果是纯中断方式,那么可以做其它事情,中断服务程序会读取数据 */
return( mWaitReady() );
}
Re: 单片机读写多路U盘C程序2
程序运行结果试过吗?