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(
|