3979|1

3

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

单片机读写多路U盘C程序2 [复制链接]

/********* CH375INT#引脚连接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;
清中断标志

}


/*************** 设置CH375USB主机方式 *************/
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() );
}


此帖出自单片机论坛

最新回复

程序运行结果试过吗?  详情 回复 发表于 2009-4-13 09:30
点赞 关注
 

回复
举报

154

帖子

0

TA的资源

纯净的硅(高级)

沙发
 

Re: 单片机读写多路U盘C程序2

程序运行结果试过吗?
此帖出自单片机论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表
  缈昏瘧锛