本文包含原理图、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的低电平吸入电流。
单片机读写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
; 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( |