找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

MCS-51单片机读写U盘(CH375芯片)

[复制链接]
187196467 发表于 2011-9-2 23:49:52 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×

MCS-51单片机读写U盘(CH375芯片)                                 
        CH375是USB总线的通用接口芯片,支持HOST主机方式和SLAVE设备方式。
MCS-51单片机读写U盘的电路原理图,CH375芯片的TXD引脚接高电平,工作于串口方式。在串口方式下,CH375只需要与单片机/DSP/MCU连接3个信号线,TXD引脚、RXD引脚以及INT#引脚,其他引脚都可以悬空。除了连接线较少之外,其他外围电路与并口方式基本相同。由于INT#引脚和TXD 引脚在CH375复位期间只能提供微弱的高电平输出电流,在进行较远距离的连接时,为了避免INT#或者TXD在CH375复位期间受到干扰而导致单片机误操作,可以在INT#引脚或者TXD引脚上加阻值为1~5kΩ的上拉电阻,以维持较稳定的高电平。在CH375芯片复位完成后,INT#引脚和TXD引脚将能够提供5mA的高电平输出电流或者5mA的低电平吸入电流。
200665111038775.jpg
单片机读写U盘的接口
由于CH375内置了处理Mass-Storage海量存储设备的专用通信协议的固件,所以嵌入式系统的单片机可以通过CH375将U盘(USB闪存盘、USB外置硬盘)作为可移动的大容量存储器。数据读写只需要几条指令,而不需要详细了解USB通信协议。
如果嵌入式系统需要将USB存储设备组织为文件系统,可调用CH375文件级子程序库提供的接口API,由子程序库处理文件系统。
MCS-51单片机读写U盘范例源程序如下:
#include
#include "CH375INC.H"
#include /* 以下定义适用于MCS-51单片机 */
#define UINT8 unsigned char
#define UINT16 unsigned short
#define UINT32 unsigned long
#define UINT8X unsigned char xdata
#define UINT8VX unsigned char volatile xdata
UINT8VX CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */
UINT8VX CH375_DAT_PORT _at_ 0xBCF0; /* CH375数据端口的I/O地址 */
#define CH375_INT_WIRE INT0 /* P3.2, 连接CH375的INT#引脚,用于查询中
断状态 */
UINT8X DISK_BUFFER[512*32] _at_ 0x0000; /* 外部RAM数据缓冲区的起始地址 */
UINT32 DiskStart; /* 逻辑盘的起始绝对扇区号LBA */
UINT8 SecPerClus; /* 逻辑盘的每簇扇区数 */
UINT8 RsvdSecCnt; /* 逻辑盘的保留扇区数 */
UINT16



300300.jpg

; FATSz16; /* FAT16逻辑盘的FAT表占用的扇区数 */

/* ********** 硬件USB接口层,无论如何这层省不掉,单片机总要与CH375接口吧 */
void mDelaymS( UINT8 delay ) {
UINT8 i, j, c;
for ( i = delay; i != 0; i -- ) {
for ( j = 200; j != 0; j -- ) c += 3;
for ( j = 200; j != 0; j -- ) c += 3;
}
}
void CH375_WR_CMD_PORT( UINT8 cmd ) { /* 向CH375的命令端口写入命令 */
CH375_CMD_PORT=cmd;
for ( cmd = 2; cmd != 0; cmd -- ); /* 发出命令码前后应该各延时2uS */
}
void CH375_WR_DAT_PORT( UINT8 dat ) { /* 向CH375的数据端口写入数据 */
CH375_DAT_PORT=dat; /* 因为MCS51单片机较慢所以实际上无需延时 */
}
UINT8 CH375_RD_DAT_PORT( void ) { /* 从CH375的数据端口读出数据 */
return( CH375_DAT_PORT ); /* 因为MCS51单片机较慢所以实际上无需延时 */
}
UINT8 mWaitInterrupt( void ) { /* 等待CH375中断并获取状态,返回操作状态 */
while( CH375_INT_WIRE ); /* 查询等待CH375操作完成中断(INT#低电平) */
CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断,获取中断状态 */
return( CH375_RD_DAT_PORT( ) );
}
/* ********** BulkOnly传输协议层,被CH375内置了,无需编写单片机程序 */
/* ********** RBC/SCSI命令层,虽然被CH375内置了,但是要写程序发出命令及收发数据
*/
UINT8 mInitDisk( void ) { /* 初始化磁盘 */
UINT8 Status;
CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */
Status = CH375_RD_DAT_PORT( );
if ( Status == USB_INT_DISCONNECT ) return( Status ); /* USB设备断开 */
CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存储器 */
Status = mWaitInterrupt( ); /* 等待中断并获取状态 */
if ( Status != USB_INT_SUCCESS ) return(
shenhua0771 发表于 2011-9-4 07:41:52 | 显示全部楼层
多谢分享!!!!!!!!!!!!!!!
nongguanhai 发表于 2012-4-21 16:39:05 | 显示全部楼层
多谢分享!!!!!!!!!!!!!!

qwerty 发表于 2012-4-22 13:38:49 | 显示全部楼层
在学SD卡驱动的不知道这个是不是一样的。
qiangli1984 发表于 2012-4-24 20:39:50 | 显示全部楼层
谢谢!!!!!!!{:soso_e100:}
aenniwang 发表于 2012-4-26 12:52:57 | 显示全部楼层
asafsfasdfasdfasdf
aiyinsixue 发表于 2012-4-27 18:19:58 | 显示全部楼层
好主意,回头试一试

7631001 发表于 2012-5-6 11:11:50 | 显示全部楼层
谢谢分享 !!!!!!!!!!
田力 发表于 2012-5-10 18:43:02 | 显示全部楼层
谢谢分享 !!!!!!!!!!


本文内容摘录自:MCU资讯论坛(http://www.mcuzx.net/) 详细文章请参考:http://www.mcuzx.net/forum.php?mod=viewthread&tid=1483
LGQ 发表于 2012-5-28 08:56:21 | 显示全部楼层
这个论坛有很多实用的资料以后经常来
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 10:30 , Processed in 0.058078 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表