ch375读U盘

合集下载

ch375中文资料

ch375中文资料

对USB接口芯片CH375的功能、原理做了较详细的介绍,并给出了在单片机读写U盘中的实例及注意事项。

随着计算机技术的快速发展,USB移动存储设备的使用已经非常普遍,因此在一些需要转存数据的设备、仪器上使用USB移动存储设备接口的芯片便相继产生了,CH375就是其中之一,它是一个USB总线的通用接口芯片,支持HOST主机方式和SLAVE设备方式。

在本地端,CH375具有8位数据总线和读、写、片选控制线以及中断输出,可以方便地挂接到单片机/DS P/MCU等控制器的系统总线上。

在USB主机方式下,CH375还提供了串行通信方式,通过串行输入、串行输出和中断输出与单片机/DSP/MCU等相连接。

CH375的USB主机方式支持各种常用的USB全速设备,外部单片机/DSP/MCU可以通过CH375按照相应的USB协议与USB设备通信。

CH375芯片内部结构1 内部结构CH375芯片内部集成了PLL倍频器、主从USB接口SIE、数据缓冲区、被动并行接口、异步串行接口、命令解释器、控制传输的协议处理器、通用的固件程序等。

CH375芯片引脚排列如图1所示。

2 内部物理端点CH375芯片内部具有7个物理端点。

端点0 是默认端点,支持上传和下传,上传和下传缓冲区各是8B;端点1包括上传端点和下传端点,上传和下传缓冲区各是8B,上传端点的端点号是81H,下传端点的端点号是01H;端点2包括上传端点和下传端点,上传和下传缓冲区各是64B,上传端点的端点号是82H,下传端点的端点号是02H。

主机端点包括输出端点和输入端点,输出和输入缓冲区各是64B,主机端点与端点2合用同一组缓冲区,主机端点的输出缓冲区就是端点2的上传缓冲区,主机端点的输入缓冲区就是端点2的下传缓冲区。

其中,CH375的端点0、端点1、端点2只用于USB设备方式,在USB主机方式下只需要用到主机端点。

软件接口对于USB存储设备的应用,CH375直接提供了数据块的读写接口,以512b的物理扇区为基本读写单位,从而将USB存储设备简化为一种外部数据存储器,单片机可以自由读写USB存储设备中的数据,也可以自由定义其数据结构。

CH375和CH372常见问题的解决

CH375和CH372常见问题的解决
8:问:我的U盘插上为什麽出现错误91?
答:这是因为库不支持你的U盘格式建议你重新格式化。格成FAT16或者FAT12。
9:问:我的U盘写入时为什麽在写入64K是可以,写入90K时长度变成20多K呢,
答:我们定义的长度是16位的,当自动修改长度时只能识别64K之内,当长度超过64K时要手动修该长度,或者重新定义长度为32位。
U1_CS = 0
P0 = 0xff // 放在RD=0之前更安全,否则如果之前P0输出0,CH375输出1会短路
RD = 0 // CH375开始输出数据
P0 = 0xff // 原来的这一行就当延时吧,因为RD=0到CH375输出数据要20纳秒
ch = P0
6:问:是不是可以用CH375作主机CH372作从机进行通讯,并且不处理描述符?
答:可以。
7:问:直接写入U盘的数据为何不能格式化掉?
答:这牵扯到文件格式,对于现代格式化都是高级格式化(软盘除外),格式化就是将引导区的文件信息删除,对于存在存储器的具体文件可能还在原处。用一些工具是可以看到文件的存在的。 所以对于直接写入的数据计算机就有可能不理会。这就是你所说的删除不掉。这不会对使用U盘有影响。如果想格式化掉可能需要重新分区。
RD = 1
U1_CS = 1;
return ch
}
13:问:341可以单独控制外部设备吗?
答:341的开发就是考虑在没有处理器使用的,假如要控制剧电器或者发光管,只要用CH341+74HC273就可以了。
如果关中断,又会影响速度。如果是51单片机,想省点I/O引脚,可以用 MOVX @R0,A 和 MOVX A,@R0,这样P2口只用两个:CS和A0,其它随便用。

单片机读写U盘的接口

单片机读写U盘的接口

CH375是USB总线的通用接口芯片,支持HOST主机方式和SLAVE设备方式。

MCS-51单片机读写U盘的电路原理图,CH375芯片的TXD引脚接高电平,工作于串口方式。

在串口方式下,CH375只需要与单片机/DSP/MCU连接3个信号线,TXD引脚、RXD引脚以及INT#引脚,其他引脚都可以悬空。

除了连接线较少之外,其他外围电路与并口方式基本相同。

由于INT#引脚和TXD 引脚在C H375复位期间只能提供微弱的高电平输出电流,在进行较远距离的连接时,为了避免INT#或者TXD在CH3 75复位期间受到干扰而导致单片机误操作,可以在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 xdataUINT8VX 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(Status ); /* 出现错误 */CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */Status = mWaitInterrupt( ); /* 等待中断并获取状态 */if ( Status != USB_INT_SUCCESS ) { /* 出错重试 *//* 对于CH375A芯片,建议在此执行一次CMD_DISK_R_SENSE命令 */mDelaymS( 250 );CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 获取USB存储器的容量 */Status = mWaitInterrupt( ); /* 等待中断并获取状态 */}if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出现错误 */return( 0 ); /* U盘已经成功初始化 */}UINT8 mReadSector( UINT32 iLbaStart, UINT8 iSectorCount, UINT8X *oDataBuffer ) {UINT16 mBlockCount;UINT8 c;CH375_WR_CMD_PORT( CMD_DISK_READ ); /* 从USB存储器读数据块 */CH375_WR_DAT_PORT( (UINT8)iLbaStart ); /* LBA的最低8位 */CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 8 ) );CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 16 ) );CH375_WR_DAT_PORT( (UINT8)( iLbaStart >> 24 ) ); /* LBA的最高8位 */CH375_WR_DAT_PORT( iSectorCount ); /* 扇区数 */for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- ) {c = mWaitInterrupt( ); /* 等待中断并获取状态 */if ( c == USB_INT_DISK_READ ) { /* 等待中断并获取状态,请求数据读出 */CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从CH375缓冲区读取数据块 */c = CH375_RD_DAT_PORT( ); /* 后续数据的长度 */while ( c -- ) *oDataBuffer++ = CH375_RD_DAT_PORT( );CH375_WR_CMD_PORT( CMD_DISK_RD_GO ); /* 继续执行USB存储器的读操作 */}else break; /* 返回错误状态 */}if ( mBlockCount == 0 ) {c = mWaitInterrupt( ); /* 等待中断并获取状态*/if ( c== USB_INT_SUCCESS ) return( 0 ); /* 操作成功 */}return( c ); /* 操作失败 */}/* ********** FAT文件系统层,这层程序量实际较大,不过,该程序仅演示极简单的功能,所以精简 */UINT16 mGetPointWord( UINT8X *iAddr ) { /* 获取字数据,因为MCS51是大端格式 */ return( iAddr[0] | (UINT16)iAddr[1] << 8 );}UINT8 mIdenDisk( void ) { /* 识别分析当前逻辑盘 */UINT8 Status;DiskStart = 0; /* 以下是非常简单的FAT文件系统的分析,正式应用绝对不应该如此简单 */Status = mReadSector( 0, 1, DISK_BUFFER ); /* 读取逻辑盘引导信息 */if ( Status != 0 ) return( Status );if ( DISK_BUFFER[0] != 0xEB && DISK_BUFFER[0] != 0xE9 ) { /* 不是逻辑引导扇区 */DiskStart = DISK_BUFFER[0x1C6] | (UINT16)DISK_BUFFER[0x1C7] << 8| (UINT32)DISK_BUFFER[0x1C8] << 16 | (UINT32)DISK_BUFFER[0x1C9] << 24; Status = mReadSector( DiskStart, 1, DISK_BUFFER );if ( Status != 0 ) return( Status );}SecPerClus = DISK_BUFFER[0x0D]; /* 每簇扇区数 */RsvdSecCnt = DISK_BUFFER[0x0E]; /* 逻辑盘的保留扇区数 */FATSz16 = mGetPointWord( &DISK_BUFFER[0x16] ); /* FAT表占用扇区数 */return( 0 ); /* 成功 */}UINT16 mLinkCluster( UINT16 iCluster ) { /* 获得指定簇号的链接簇 *//* 输入: iCluster 当前簇号, 返回: 原链接簇号, 如果为0则说明错误 */UINT8 Status;Status = mReadSector( DiskStart + RsvdSecCnt + iCluster / 256, 1,DISK_BUFFER );if ( Status != 0 ) return( 0 ); /* 错误 */return( mGetPointWord( &DISK_BUFFER[ ( iCluster + iCluster ) & 0x01FF ] ) ); }UINT32 mClusterToLba(UINT16 iCluster ) { /* 将簇号转换为绝对LBA扇区地址 */ return( DiskStart + RsvdSecCnt + FATSz16 * 2 + 32 + ( iCluster - 2 ) *SecPerClus );}void mInitSTDIO( void ) { /* 仅用于调试用途及显示内容到PC机,与该程序功能完全无关 */SCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = 0xf3; TR1=1; TI=1; /* 24MHz, 9600bps */}void mStopIfError( UINT8 iErrCode ) { /* 如果错误则停止运行并显示错误状态 */ if ( iErrCode == 0 ) return;printf( "Error status, %02X", (UINT16)iErrCode );}main( ) {UINT8 Status;UINT8X *CurrentDir;UINT16 Cluster;mDelaymS( 200 ); /* 延时200毫秒 */mInitSTDIO( );CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); /* 初始化CH375,设置USB工作模式 */CH375_WR_DAT_PORT( 6 ); /* 模式代码,自动检测USB设备连接 */while ( 1 ) {printf( "Insert USB disk" );while ( mWaitInterrupt( ) != USB_INT_CONNECT ); /* 等待U盘连接 */mDelaymS( 250 ); /* 延时等待U盘进入正常工作状态 */Status = mInitDisk( ); /* 初始化U盘,实际是识别U盘的类型,必须进行此步骤 */ mStopIfError( Status );Status = mIdenDisk( ); /* 识别分析U盘文件系统,必要操作 */mStopIfError( Status );Status = mReadSector( DiskStart + RsvdSecCnt + FATSz16 * 2, 32,DISK_BUFFER );mStopIfError( Status ); /* 读取FAT16逻辑盘的根目录,通常根目录占用32个扇区*/for ( CurrentDir = DISK_BUFFER; CurrentDir[0] != 0; CurrentDir += 32 ) {if ( ( CurrentDir[0x0B] & 0x08 ) == 0 && CurrentDir[0] != 0xE5 ) {CurrentDir[0x0B] = 0; /* 为了便于显示,设置文件名或者目录名的结束标志 */ printf( "Name: %s", CurrentDir ); /* 通过串口输出显示 */}} /* 以上显示根目录下的所有文件名,以下打开第一个文件,如果是C文件的话 */if ( (DISK_BUFFER[0x0B]&0x08)==0 && DISK_BUFFER[0]!=0xE5 && DISK_BUFFER[8] =='C' ) {Cluster = mGetPointWord( &DISK_BUFFER[0x1A] ); /* 文件的首簇 */while ( Cluster < 0xFFF8 ) { /* 文件簇未结束 */if ( Cluster == 0 ) mStopIfError( 0x8F ); /* 对于首簇,可能是0长度文件*/Status = mReadSector( mClusterToLba( Cluster ), SecPerClus,DISK_BUFFER );mStopIfError( Status ); /* 读取首簇到缓冲区 */DISK_BUFFER[30] = 0; printf( "Data: %s", DISK_BUFFER ); /* 显示首行*/Cluster = mLinkCluster( Cluster ); /* 获取链接簇,返回0说明错误 */}}while ( mWaitInterrupt( ) != USB_INT_DISCONNECT ); /* 等待U盘拔出 */mDelaymS( 250 );}}该程序可以支持WINDOWS按FAT16格式化的U盘__________________________。

基于CH375控制芯片的U盘读写系统

基于CH375控制芯片的U盘读写系统
式 , 过串行输 入 、 通 串行 输 出和 中断输 出与单 片 机 相 连 接 。C 35的 U B主 H7 S
VC C c# s RT S# RT S A, CⅣ} GD N D7 D 6 D 5 D 4 D3 D 2
D1 D 0
图 1 G 35引脚 图 H7
3 电路 设 计
本设计 中 C 35 H 7 工作在主机方式下 , 以总线方式挂在单片机系统总线上 。单片机通过 R WR 高位地 D、 、 址译码产生的片选 c 和地址线 A ( C 35 A 引脚) s 8接 H 7 的 0 的综合控制, 完成与 C 35的通讯。C 35IT H7 H 7 # N
基 于 C 3 5 制 芯 片 的 U盘读 写 系 统 H7控
陈会 张喜验2周扬2 田滢 杨俊 贤 , , , ,
(. 1中国海洋大学 , 山东 青 岛 260;. 6 32 山东省科学 院海洋 仪器 仪表研究所 , 0 山东 青 岛 2 0 1 6 0) 6 摘要 : 针对一些 内部集成了 U B S 设备接 口的嵌入式微控制 器同过去的开发系统不兼容 的情况 , 于 U B 口 基 S接 控制 芯片 C 35设计 了一个不 需要 大规模改变原有系统 , 于对 原有 系统 进行 升级的 u盘 读写 系统。通过 H 7, 适
收稿 日期:O60 —9 2O .81
Байду номын сангаас
维普资讯
第5 期
陈会 , : 等 基于 G 35 H 7 控制 芯片的 u盘读写 系统
5 7
位, 从而将 U B存储设备简化为一种外部数据存储器 , S 单片机可以 自由读写 U B存储设备 中的数 据 , 可以 S 也
索等 。
C 35以 C H7 语言子程序库提供 了 U B S 存储设备的文件级接 口, 这些应用层接 口 A I P 包含了常用的文件

基于CH375的U盘读写模块在移动数据交换中的应用 (2)

基于CH375的U盘读写模块在移动数据交换中的应用 (2)

收稿日期:2005-09 作者简介:秦霆镐(1953—),男,副教授,主要研究方向为自动测控技术及楼宇自动化等。

图2 CH375的U 盘读写模块外观图基于CH375的U 盘读写模块在移动数据交换中的应用秦霆镐,凌 辉,庞海珑(上海大学自动化系,上海200072) 摘要:提出一种基于CH375的U 盘读写模块与51系列单片机相结合以实现US B 主机功能的方法,给出了该方法的软硬件具体实现。

关键词:US B 主机;数据交换;CH375中图分类号:TP39 文献标识码:B 文章编号:1006-2394(2006)01-0034-03Appli ca ti on of USB M odule Ba sed on CH375i n Da t a ExchangeQ I N G Ting 2hao,L I N G Hui,P ANG Hai 2l ong(Aut omati on Depart m ent,Shanghai University,Shanghai 200072,China )Abstract:A method of realizati on of US B host functi on is devel oped by combiningMCS 251MC U and the US B module based on the chi p of CH375.The design of s oft w are and hard ware is p resented in detail and p r os pect is made .Key words:US B host;data exchange;CH3751 基于CH375的U 盘读写模块简介CH375是一个US B 总线的通用接口芯片,支持HOST 主机方式和S LAVE 设备方式。

在本地端,CH375具有8位数据总线和读、写、片选控制线以及中断输出,可以方便地挂接到单片机/DSP /MCU 等控制器的系统总线上。

单片机通过CH375 读写U 盘时的注意事项

单片机通过CH375 读写U 盘时的注意事项

单片机通过CH375读写U盘时的注意事项版本:1B1、概述USB总线接口芯片CH375支持USB-HOST和USB-DEVICE,可以用于单片机读写U盘。

本说明中的多数内容为建议性说明,而非强制性说明,建议的目的旨在提高最终产品的稳定性和可靠性,很多内容只是针对一般情况和大多数用户而言,而未考虑个别或者例外。

本说明中列举了一些发生在某些品牌U盘上的怪现象,都是我们实际测试现象的描述,我们并没有以此评价U盘的优劣,因为实际上它们可能已经算是所有U盘中比较优秀的几种,而且,我们也不排除这仅仅是品牌U盘中的个别现象,只是正好被我们碰到而已。

2、硬件2.1. CH375芯片1) CH375内部含有时钟振荡电路,但是驱动能力比普通的单片机要弱一些,振荡波形通常比较接近正弦波(普通单片机的振荡波形接近方波),这种弱振荡的优点是对外产生的电磁干扰较少,缺点是理论上自身比较容易受外来的干扰,当然,如果电路及PCB设计良好则不会产生干扰。

2) CH375的时钟可以使用普通12MHz石英晶体或者普通12MHz有源晶振,但是不宜使用频率误差较大的陶瓷晶体。

对于普通石英晶体,虽然CH375手册中标明振荡电容为15pF,但是原则上应该根据晶体厂家的推荐值选择匹配的振荡电容,例如是18pF、20pF、22pF、24pF、27pF等。

3) 如果电源电压为3.3V,可以将XI引脚的电容C1容量选用小些(例如10pF),或者用有源晶振或者外部振荡电路为CH375的XI引脚提供时钟,以保证时钟稳定性。

有的电路还可以在CH375的XO引脚串接100Ω到300Ω的电阻,改善振荡参数。

对于CH375B芯片,不需要外串电阻。

4) 为了降低电磁辐射,并减少来自外界的干扰,振荡电路的晶体X1的金属外壳应该接地,晶体X1以及电容C1、C2应该尽量靠近CH375,C1和C2的GND端应该尽量接近CH375的GND端,相关的PCB走线应该尽量短,并且可以在周边环绕接地线或敷铜。

基于CH375 的U 盘MP3 播放器设计

基于CH375 的U 盘MP3 播放器设计
基于CH375 的U 盘MP3 播放器设计
1 方案设计
1. 1 系统功能简介 • 本设计主要完成U 盘的识别和数据的读取, 并将U 盘中读取的MP3 文件解码播放出流畅的音乐, 完成MP3 播放器的存储不解码的分离。 • 系统功能主要包括读取U盘数据和MP3 解码播放2 部分。实现设计功能需要USB接口芯片、MP3 解码芯片、 主控制器和其他外围电路。
1. 2 主要芯片的选择
1.通过比较本文选择南京沁恒电子生产的一款USB 通用接口芯片CH 375。 CH375 芯片支持HOST 主机方式和DEVICE 设备方式, 内部集成了PL L 倍频器、主 从USB 接口、数据缓冲区、被动并行接口、异步串行接口、命令解释器、控制传输 的协议处理器、通用的固件程序等。 2. 音频解码芯片选择芬兰VL SI 公司生产的VS1003。 VS1003 具有MP3/ WMA/ MIDI 解码和ADPCM 编码功能, 他内部包含一个高性能、 低功耗的DSP 处理核( VSDSP), 一个工作内存, 一片可供用户程序使用的5. 5kBRAM, 一个串行SPI 总线接口, 一个高质量的采样频率可调 的过采样DAC 以及一个16 位的 采样ADC。 3.采用高性能低功耗的STC12C5A60S2微处理器作为系统主控制器。 STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片 机,是高速/低功耗/超强抗干扰的新一代8051单片机,挃令代码完全兼容传统8051, 但速度快8-12倍。内部集成MAX810与用复位电路,2路PWM,8路高速10位A/D转换 (250K/S),针对电机控制,强干扰场合。工作频率范围0~35MHz,片上集成1280字节 RAM,有EEPROM功能,ISP(在系统可编程)/IAP(在应用可编程),无需与用编程器, 无需与用仿真器,可通过串口(P3.0/P3.1)直接下载用户程序。 能保证MP3 文件的顺畅播放。

51单片机-ch375

51单片机-ch375

51单片机usb(CH375)的设计1.1 系统功能简介本设计主要完成U盘的识别和数据的读取,并将U盘中读取的MP3文件解码播放出流畅的音乐,完成.MP3播放器的存储与解码的分离。

系统功能主要包括读取U盘数据和MP3解码播放2部分。

实现设计功能需要USB接口芯片、MP3解码芯片、主控制器和其他外围电路。

考略难易程度和实际实现程度,这里的MP3只提供从u盘的根目录读取MP3格式的文件(不包括wma,wmv,midi格式),而且u盘的文件格式必须为F AT32。

再者,考略到单片机的运行速度较慢,如果文件的采样频率额过高,可能会造成播放断断续续,因此读取的MP3文件的采样频率事先转化为频率64k ps,这样可以获得较好的音质。

2.主要芯片的选取2.1.单片机的选取由于解码和播放有很高的速度要求,且需要单片机有较大的ROM和RAM,这里我们选取了STC12C5A60S2。

STC12C5A60S2是新一代51单片机,是传统51单片机的升级换代产品,可实现“1个时钟/机器周期”,在同等晶振下运行速度可以达到传统单片机的12倍。

在这里,我们采用22.1184M.2.2.USB总线接口芯片的选取通过比较部分参数,我们选择南京沁恒电子生产的一款USB通用接口芯片CH375。

CH375是一个USB总线的通用接口芯片,CH375芯片支持HOST主机方式和DEV IC E设备方式,在本地端,CH375具有8位数据总线和读、写、片选控制线以及终端输出,可以方便地挂接到单片机等控制器的系统总线上。

最重要的是,该芯片内置固件处理海量存储设备的专用通讯协议,可以使我们的编程难度大大减小。

内部集成了PLL倍频器、主从USB接口、数据缓冲区、被动并行接口、异步串行接口、命令解释器、控制传输的协议处理器、通用的固件程序等。

2.3.音频解码芯片的选取音频解码芯片选择芬兰VLSI公司生产的VSl003。

VSl003具有MP3/wMA /MIDI解码和ADPCM编码功能,他内部包含一个高性能、低功耗的DSP处理核(VSD一SP),为用户应用提供5KB的指令RAM和0.5kb的数据RAM。

ch375读写u盘C51示例源程序

ch375读写u盘C51示例源程序

ch375读写u盘C51示例源程序/* 以下定义的详细说明请看CH375HF9.H文件 */#define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为\外部子程序\为\内部复制\#define LIB_CFG_INT_EN 1 /* CH375的INT#引脚连接方式,接s3c44b0x外部中断2引脚\/* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */ #define FILE_DATA_BUF_LEN 0x2000 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */#include \#define CH375Cmd *(volatile U8 *)(0x4000001) /*总线方式*/ #defineCH375Dat *(volatile U8 *)(0x4000000) extern U32 MCLK;/* CH375 主机文件系统接口*/ /* 支持: FAT12/FAT16/FAT32 *//* ARM单片机C语言的U盘文件读写示例程序 *//* 该程序将U盘中的/C51/CH375HFT.C文件中的小写字母转成大写字母后, 写到新建的文件NEWFILE.TXT中,如果找不到原文件CH375HFT.C, 那么该程序将显示C51子目录下所有以CH375开头的文件名, 并新建NEWFILE.TXT文件并写入提示信息,如果找不到C51子目录, 那么该程序将显示根目录下的所有文件名, 并新建NEWFILE.TXT文件并写入提示信息 *//* CH375的INT#引脚采用查询方式处理, 数据复制方式为\内部复制\本程序适用于s3c44b0x单片机, 串口0输出监控信息,57600bps */ /* ENDIAN = \void mDelay1_2uS( ) /* 至少延时1.2uS,根据单片机主频调整 */ { UINT32 i;for ( i = 30; i != 0; i -- ); }void __irq CH375Interrupt( void ) /* CH375中断服务程序,由CH375的INT#的低电平或者下降沿触发单片机中断 */ {rEXTINTPND=0xf; //clear EXTINTPND reg.rI_ISPC=BIT_EINT2; //clear pending_bitxWriteCH375Cmd( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */CH375IntStatus = xReadCH375Data( ); /* 获取中断状态 */if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus =DISK_DISCONNECT; /* 检测到USB设备断开事件 */else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus =DISK_CONNECT; /* 检测到USB设备连接事件 */ }extern void CH375Interrupt( void ); void CH375_PORT_INIT( ) /*初始化 */ {rINTCON=0x5;rINTMOD=0x0; //All=IRQ mode rPDATG=0xff; rPCONG=0xffff;rPUPG=0x0; //should be enabled rEXTINT=0x0;pISR_EINT2 = (unsigned)CH375Interrupt;rINTMSK=~(BIT_GLOBAL|BIT_EINT2); //start INT }void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ {mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时1uS */ CH375Cmd = mCmd;mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延时2uS */ }void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ {CH375Dat = mDatamDelay1_2uS( ); /* 至少延时1.2uS */ }UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ {UINT8 mData;mDelay1_2uS( ); /* 至少延时1.2uS */mData = (UINT8)CH375Dat;return( mData ); }/* 延时指定毫秒时间,根据单片机主频调整,不精确 */ void mDelaymS( UINT32 ms ) { UINT32 i;while ( ms -- ) for ( i = 25000; i != 0; i -- ); }/* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) {if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( \/* 显示错误*/ while ( 1 ) {mDelaymS( 100 ); } }/* 为printf和getkey输入输出初始化串口 */ void mInitSTDIO( ) { }U16 SERIAL_BAUD = 57600;char table_begin[] = \void ShowSysClock(int argc, char *argv[]) {printf(\ystem is running @%dHz\\n\ }int Main(void) {unsigned char t; UINT8 i, c, SecCount;UINT16 NewSize, count; /* 因为RAM容量有限,所以NewSize限制为16位,实际上如果文件较大,应该分几次读写并且将NewSize改为UINT32以便累计 */ UINT8*pCodeStr; ChangePllValue(24, 6, 1); Port_Init();console_init(57600);next_line(); puts(table_begin);puts(\ShowSysClock(0, NULL);printf(\next_line(); puts(table_begin);puts(\mDelaymS( 50 ); /* 延时100毫秒 */ printf( \测试CH375是否正常\\n\mDelaymS(60 ); /* 延时50ms */ printf(\完成!!\i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i );/* 其它电路初始化 */ CH375_PORT_INIT( ); while ( 1 ) {printf( \请插入U盘!\\n\while ( CH375DiskStatus != DISK_CONNECT ) /* 查询CH375中断并更新中断状态,等待U盘插入 */mDelaymS( 10 );/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 10; i ++ ) { /* 有的U盘总是返回未准备好,不过可以被忽略 */printf( \if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ }/* 查询磁盘物理容量 */ printf( \i = CH375DiskSize( );mStopIfError( i );printf( \/* 读取原文件 */ printf( \strcpy( (char *)mCmdParam.Open.mPathName, \/* 文件名,该文件在C51子目录下*/ i = CH375FileOpen( ); /* 打开文件 */if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { /* 没有找到文件 */ /* 列出文件 */if ( i == ERR_MISS_DIR ) pCodeStr = (UINT8 *)\/* C51子目录不存在则列出根目录下的文件 */ else pCodeStr = (UINT8 *)\/* CH375HFT.C文件不存在则列出\\C51子目录下的以CH375开头的文件 */printf( \for ( c = 0; c < 255; c ++ ) { /* 最多搜索前255个文件 */strcpy( (char *)mCmdParam.Open.mPathName, (char *)pCodeStr ); /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */i = strlen( (char const *)mCmdParam.Open.mPathName ); /* 计算文件名长度,以处理文件名结束符 */ mCmdParam.Open.mPathName[ i ] = c; /* 根据字符串长度将结束符替换为搜索的序号,从0到255 */ i = CH375FileOpen( ); /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */ if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */if ( i == ERR_FOUND_NAME ) { /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */printf( \match file d#: %s\\n\/* 显示序号和搜索到的匹配文件名或者子目录名*/continue; /* 继续搜索下一个匹配的文件名,下次搜索时序号会加1 */ }else { /* 出错 */ mStopIfError( i ); break; } }pCodeStr = (UINT8 *)\找不到/C51/CH375HFT.C文件\\xd\\n\for ( i = 0; i != 255; i ++ ) {if ( ( FILE_DATA_BUF = *pCodeStr ) == 0 ) break; pCodeStr++; }NewSize = i; /* 新文件的长度 */SecCount = 1; /* (NewSize+511)/512, 计算文件的扇区数,因为读写是以扇区为单位的 */ }else { /* 找到文件或者出错 */ mStopIfError( i ); /* printf( \i = CH375FileQuery( ); 查询当前文件的信息感谢您的阅读,祝您生活愉快。

设计一个基于CH375对U盘的读写

设计一个基于CH375对U盘的读写
并口方式
CH375的TXD引脚通过1KΩ左右的下拉电阻接地或者直接接地,从而使CH375工作于并口方式。
CH375芯片具有通用的被动并行接口,可以直接连接多种单片机、DSP、MCU等。在普通的MCS-51系列单片机的典型应用电路中,CH375芯片可以通过8位被动并行接口的D7~D0、-RD、-WR、-CS、A0直接挂接到单片机U2的系统总线上。
3.1.1 本地端的单片机软件……………………………………………………
3.1.2时序…………………………………………………………………………
3.1.3单片机读写U盘文件………………………………………………………………
3.1.4软件设计流程图………………………………………………………………
3.2LCD液晶显示部分软件设计………………………………………………………
1.2 显示模块方案选择
液晶显示屏显示YB12864ZA
数码管显示
1.3系统方框图
第二章硬件电路设计
硬件电路主要分为单片机最小系统及CH375接口电路和LCD液晶显示电路组成。
2.1AT89S51单片机最小系统电路
2.1.151单片机的内部结构
1、中央处理单元(8位)
数据处理、测试位,置位,复位 位操作
1.1CH375工作方式方案选择
CH375芯片可以工作于USB-HOST主机方式或者USB设备方式。
CH375的USB主机方式支持并行接口和串行接口,在USB主机方式下,CH375支持各种常用的USB全速设备,外部单片机需要编写固件程序按照相应的USB协议与USB设备通讯。但是对于USB存储设备,CH375内置了相关协议,通常情况下,外部单片机不需要编写固件程序,就可以直接通讯。
2.2.1 USB总线接口芯CH375………………………………………………………………

USB接口芯片CH375的原理及应用概况

USB接口芯片CH375的原理及应用概况

USB接口芯片CH375的原理及应用对USB接口芯片CH375的功能、原理做了较详细的介绍,并给出了在单片机读写U盘中的实例及注意事项。

随着计算机技术的快速发展,USB移动存储设备的使用已经非常普遍,因此在一些需要转存数据的设备、仪器上使用USB移动存储设备接口的芯片便相继产生了,CH375就是其中之一,它是一个USB总线的通用接口芯片,支持HOST主机方式和SLAVE设备方式。

在本地端,CH375具有8位数据总线和读、写、片选控制线以及中断输出,可以方便地挂接到单片机/DSP/MCU等控制器的系统总线上。

在USB主机方式下,CH375还提供了串行通信方式,通过串行输入、串行输出和中断输出与单片机/DSP/MCU等相连接。

CH375的USB主机方式支持各种常用的USB全速设备,外部单片机/DSP/MCU可以通过CH375按照相应的USB协议与USB设备通信。

CH375芯片内部结构1 内部结构CH375芯片内部集成了PLL倍频器、主从USB接口SIE、数据缓冲区、被动并行接口、异步串行接口、命令解释器、控制传输的协议处理器、通用的固件程序等。

CH375芯片引脚排列如图1所示。

2 内部物理端点CH375芯片内部具有7个物理端点。

端点0是默认端点,支持上传和下传,上传和下传缓冲区各是8B;端点1包括上传端点和下传端点,上传和下传缓冲区各是8B,上传端点的端点号是81H,下传端点的端点号是01H;端点2包括上传端点和下传端点,上传和下传缓冲区各是64B,上传端点的端点号是82H,下传端点的端点号是02H。

主机端点包括输出端点和输入端点,输出和输入缓冲区各是64B,主机端点与端点2合用同一组缓冲区,主机端点的输出缓冲区就是端点2的上传缓冲区,主机端点的输入缓冲区就是端点2的下传缓冲区。

其中,CH375的端点0、端点1、端点2只用于USB设备方式,在USB主机方式下只需要用到主机端点。

软件接口对于USB存储设备的应用,CH375直接提供了数据块的读写接口,以512b 的物理扇区为基本读写单位,从而将USB存储设备简化为一种外部数据存储器,单片机可以自由读写USB存储设备中的数据,也可以自由定义其数据结构。

单片机通过CH375读写U盘文件的问题解答

单片机通过CH375读写U盘文件的问题解答

单片机通过CH375读写U盘文件的问题解答单片机通过CH375读写U盘文件的问题解答(转自官网)(发布:2009-9-17 18:07 | 作者:zxgsdu | 来源:本站| 查看:86次| 字号: 小中大* 需要设计参考资料(光盘资料可以参考FILELIST.TXT文档,网上资料更新)USB主机方式的应用可以参考CH375的资料,与计算机连接的USB设备方式(或自己做U盘)可以参考CH372的资料。

如果是读写U盘并且用量较少或者是系统集成,关心快速入门并且简单易用,那么可以参考半成品U盘文件读写模块的说明CH375HM.ZIP;如果是做原始产品设计,关心成本,那么可以参考CH375评估板资料CH375EVT.ZIP,其中有单片机读写U盘的多个例子源程序和U盘文件级子程序库的API说明。

在设计USB-HOST电路和PCB之前,强烈建议参考CH375的USB电路及PCB设计注意事项README.PDF。

常规问题例如不工作/连接失败可以参考CH372的问题解答,关于USB传输速度可以参考评估板中的说明。

* 有关U盘文件的一些基础知识WINDOWS下U盘的文件系统主要有FAT12/FAT16/FAT32,我们的子程序库都能支持,使用角度感觉无区别。

单片机不需要考虑文件系统,只需要了解文件名、文件长度等基础知识。

一个U盘中可以有多个文件,每个文件都是一组数据的集合,以文件名区分和识别。

文件长度是指文件中有效数据的长度,而实际占用的磁盘空间通常大于或者等于文件长度,实际文件数据的存放可能不是连续的,而是通过一组“指针”链接的多个块(也就是分配单元或簇),从而能够根据需要随时增大文件长度以容纳更多数据。

目录是为了便于分类管理,管理者可以人为指定将多个文件归档在一起,例如2004年的文件归到一个目录中。

* 读写U盘中的文件对单片机有要求吗硬件上,单片机需要提供至少600字节的RAM,RAM多些可以提高速度,软件上可以采用我们的子程序库,但是产生的程序代码可能会有几K字节,也就是说单片机的程序空间必须能够放得在几K到十几K的代码。

CH375读取U盘文件的算法

CH375读取U盘文件的算法
系统说明:
1. 关于文件系统及文件名的说明:
U盘为FAT32文件系统,一个分区,读取的文件在根目录下,目的文件名符合DOS文件的8.3规则;
目的文件名在MCU程序存储器中的存放格式全同于短文件名在目录项中的格式,即:
文件名共占用11个字节,其中主文件名8个,扩展名3个,分别左对齐,不足8或3个用空格
CALL MAIN_FILE_FIND
JNB FLAG_Find_FLNAME, MAIN_file_read_end
; 读取文件开始簇号高位
MOV A, USBD_PTR_record
CH375_RD BIT P2.5 ; =0 CH375读数据
CH375_CS BIT P2.4 ; =0 CH375片选有效
CH375_PORT EQU P1 ; 连接到CH375数据端口
本例使用的 STC12C5410 仅有256B的内部扩展RAM作为缓冲区,采用每次读一个扇区但保留半个扇
的方法完成读扇区操作.使用前半扇时,前4次取数将数据保存到缓冲区,后4次取数不保存数据,使
用后半扇时则相反.每次都是完整的读扇区操作,有用的数据在缓冲区内.
4. CH375与STC12C5410引脚关系:
5. 在结尾处追加数据记录,如扇区结束,到下一扇,如簇结束则:
6. 搜索FAT表,找到一个未用的簇,设其编号为: X0;
7. 将这个未用的簇的编号(X0)写到当前簇X1表项内,即X1的"指针域"的值是X0
同时将X0的指针域置为: 0F,FF,FF,FF 即表示最后簇;
8. 找到簇号X0对应的扇区,转5;
; CH375<-->5410-|-------|---------------|--------------

CH375 的U 盘文件级子程序库说明

CH375 的U 盘文件级子程序库说明

4.2.3 CH375 的U 盘文件级子程序库说明CH375以C语言子程序库提供了USB存储设备的文件级接口,这些应用层接口API包含了常用的文件级操作,可以移植并嵌入到各种常用的单片机程序中。

4.2.3.1概述很多数码产品以及单片机系统都需要存储器,当前,U 盘(含闪盘、USB 闪存盘、USB 移动硬盘等,下同)已经成为很常用的移动存储设备,其价格仅比相同容量的闪存略高,而远比闪存易于采购和易于携带,并且U 盘的规格通用,具有多种容量可供选用。

所以,数码产品以及单片机系统可以直接采用U 盘作为大容量的移动存储器。

CH375 是USB总线的HOST 主机及DEVICE设备双用接口芯片,单片机可以通过CH375读写U 盘中的数据,由于很多产品最终会与使用WINDOWS 操作系统的个人计算机交换数据,所以为了方便数据交换,U 盘中的数据应该符合WINDOWS 的文件系统格式。

CH375 提供了U 盘文件级子程序库,单片机可以直接调用子程序读写U 盘中的文件数据,硬件上只需要在原单片机系统中增加一个CH375芯片,综合成本较低。

CH375的U 盘文件级子程序库支持常用的FAT12、FAT16 和FAT32 文件系统,支持容量高达100GB 的U 盘。

单片机不需要考虑文件系统,只需要了解文件名、文件长度等基础知识。

一个U 盘中可以有多个文件,每个文件都是一组数据的集合,以文件名区分和识别。

文件长度是指文件中有效数据的长度,而实际占用的磁盘空间通常大于或者等于文件长度,实际文件数据的存放可能不是连续的,而是通过一组“指针”链接的多个块(也就是分配单元或簇),从而能够根据需要随时增大文件长度以容纳更多数据。

目录是为了便于分类管理,管理者可以人为指定将多个文件归档在一起,例如2004 年的文件归到一个目录中。

4.2.3.2子程序库分类子程序库有两种文件路径表示方式,一种是完整全路径,另一种是逐级路径。

目前子程序库主要使用“完整全路径”方式,而普及版源程序的方式是“逐级路径”。

CH372或CH375的USB通讯的问题解答

CH372或CH375的USB通讯的问题解答

有关CH372或CH375的USB通讯的问题解答* 需要设计参考资料(光盘资料可以参考FILELIST.TXT文档,网上资料更新)1、如果是在没有单片机的情况下,进行简单的I/O输入输出,那么可以参考CH341的资料,CH341不需要单片机就能独立工作,可以提供串口、并口、兼容IIC或I2C的2线接口、兼容SPI及JTAG的4线接口、5线接口等,可以提供多个GPIO通用I/O,可以用于控制低速模数转换AD、DA、数字I/O、I/O扩展等。

2、如果是单片机/DSP等与计算机相连接,也就是USB设备方式的应用,那么参考CH372的资料。

可以下载CH372+CH451评估板/演示板的资CH372EVT.ZIP,有PDF文档和例子程序,例如,评估板说明及USB设备应用参考CH375451,参考电路和PCB,小数据量交互传输/应用层中断演示的例子DEMO,含MCS51单片机C程序和汇编程序,批量数据传输的例子BULK测试速度,USB 外置固件的C和汇编例子XFIRM,VC/VB/BC/DELPHI的例子等。

另外,可以下载CH37X在计算机WINDOWS下的简单调试工具CH372DBG.ZIP,其中有MCS51单片机上位机与下位机的C源程序,PC机程序可以通过USB对MCS51进行简单仿真和控制,其中的C程序稍作修改就可以用于其它单片机。

调试工具DEBUG372可以用于调试和检查下位机的程序。

3、如果是单片机/DSP等控制其它USB设备,也就是USB主机方式的应用,那么可以参考CH375的资料。

如果是读写U盘并且用量较少或者是系统集成,关心快速入门并且简单易用,那么可以参考半成品U盘文件读写模块的说明CH375HM.ZIP;如果是做原始产品设计,关心成本,那么可以参考CH375评估板资料CH375EVT.ZIP,其中有单片机读写U盘的例子和U盘文件级子程序库的API 说明;如果是单片机控制USB打印机等,或者CH375与CH372等其它USB产品通讯,可以参考USB主机方式应用参考CH375HST.ZIP。

CH375HM

CH375HM

2、功能与特点
用于嵌入式系统/单片机读写 U 盘、闪盘、闪存盘、USB 移动硬盘、USB 读卡器等。 支持符合 USB 相关规范基于 Bulk-Only 传输协议的各种 U 盘/闪存盘/外置硬盘。 支持文件系统 FAT12 和 FAT16 及 FAT32,如果需要支持 FAT32 请看本文后面的说明。 提供工具程序,只要连接计算机 USB 端口,就可以随时升级模块,随时设置模块。 支持小端格式和大端格式的数据字节顺序,适用于绝大多数单片机系统。 文件操作功能:搜索、新建、删除、读写数据,查询和修改信息等。 读写模式:高速的扇区模式、方便的字节模式、简化的数据流模式。 提供 3 种硬件以适应不同的 I/O 接口:标准版、串口版、低电压版。 提供多种软件供随时下载到模块硬件中,通过多种软硬件组合支持各种不同的 I/O 接口。 模块具有简单的自动演示功能,提供串口连接方式下的计算机端的演示工具。
3.3 升级和配置模块
在模块上电或者复位时,模 块将检查跳线 J1 的状态。 当跳线 J1 断开时进入正常工作状态, 当 跳线 J1 短路时进入功能配置状 态。当升级模块程序或者配置完 毕后, 必须将跳线 J1 断开, 重新 上电才能进入正常工作状态。 在功能配置状态下,只要用 USB 对连线连接计算机的 USB 端 口和模块的 USB 端口,就可以对 模块进行在线程序升级和功能配 置。 首次连接计算机时, WINDOWS 提示找到 USB 新硬件,所以需要 执行驱 动程序 包 CH372DRV.EXE 安装 U 盘模块的驱动程序(就是 CH372 或 CH375 的 WINDOWS 通用 驱动程序) , 然后运行模块工具程 序 CH37XDL.EXE,选择目标程序 文件进行下载或者重新配置模块 的接口。界面通常如右图。

USB接口芯片CH375的原理及应用

USB接口芯片CH375的原理及应用

USB接口芯片CH375的原理及应用随着计算机技术的迅速进展,移动存储设备的用法已经十分普遍,因此在一些需要转存数据的设备、仪器上用法USB移动存储设备接口的芯片便相继产生了,CH375就是其中之一,它是一个USB的通用接口芯片,支持HOST主机方式和SLAVE设备方式。

在本地端,CH375具有8位数据总线和读、写、片选控制线以及中断输出,可以便利地挂接到//等控制器的系统总线上。

在USB主机方式下,CH375还提供了串行通信方式,通过串行输入、串行输出和中断输出与单片机/DSP/MCU等相衔接。

CH375的USB主机方式支持各种常用的USB 全速设备,外部单片机/DSP/MCU可以通过CH375根据相应的USB协议与USB设备通信。

CH375芯片内部结构1 、内部结构CH375芯片内部集成了PLL倍频器、主从USB接口SIE、数据缓冲区、被动并行接口、异步串行接口、指令说明器、控制传输的协议处理器、通用的固件程序等。

CH375芯片引脚罗列1所示。

图 12 、内部物理端点CH375芯片内部具有7个物理端点。

端点0是默认端点,支持上传和下传,上传和下传缓冲区各是8B;端点1包括上传端点和下传端点,上传和下传缓冲区各是8B,上传端点的端点号是81H,下传端点的端点号是01H;端点2包括上传端点和下传端点,上传和下传缓冲区各是64B,上传端点的端点号是82H,下传端点的端点号是02H。

主机端点包括输出端点和输入端点,输出和输入缓冲区各是64B,主机端点与端点2合用同一组缓冲区,主机端点的输出缓冲区就是端点2的上传缓冲区,主机端点的输入缓冲区就是端点2的下传缓冲区。

其中,CH375的端点0、端点1、端点2只用于USB设备方式,在USB主机方式下只需要用到主机端点。

软件接口对于USB存储设备的应用,CH375挺直提供了数据块的读写接口,以512b 的物理扇区为基本读写单位,从而将USB存储设备简化为一种外部数据存储器,单片机可以自由读写USB存储设备中的数据,也可以自由定义其数据结构。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

特别说明此资料来自百度文库(/)您目前所看到的文档是使用的抱米花百度文库下载器所生成此文档原地址来自/view/92509af90242a8956bece47b.html 感谢您的支持抱米花/lotusbaob51+ch375UflqMfl()E?2005-10-16 19:50:007*S±*M$ 180ffC flSWflFAT 16tffSUfl cWflif i ,1ritunwffiTmn JS+*MW1W1NDOWStFAT 164t4-I flJU, YSJ*M*IM31 LAFflikilit5O% ±ftiU CH375AfrtjiiUfl‟MEW185%,O*1tTh WCH J tIEtft&*fl<i cflTUflIt:flfl64M/flfl128MfU16O-64MJt& 128M,fl/ifl16M/fl,I! f/64M,1&N/64M, MI32M/64MI128M, Z/C200-64M$?*4/256M,:1±7128M..., 503Wfl4ttM*fl128M,‟]Rt3!USB2.0-1 28M, ,4N1W CH flW)CH375A *14 i nclude <stdio.h>4 i nclude “CH375INC.H”#include <reg5l.h> /TtfflTMcs51Thfl*#define UNT8 unsigned that#define Ull‟TT 16 unsigned short#define UUTT32 unsigned long#define UII‟TT8X unsigned char xdata#define Ull‟JT8VX unsigned char volatile xdataUINT8VX CH375 CMD PORT atOxBDFl;1* CH375*tFE1flIJO*thtlE *7U1NT8VX CH375 DAT PORT at OxBCFO; I CR375 EL4fl II flJIJOtthhE *7#define CR375 INT WIRE INTO 1* P3.2, ICH375flNT#IPj1W*i‟ftJ+ *1UINT8X DISK BUFFER[5 12*32] at Ox0000; 1*9RAM11hiIE*1UINT32 DiskStart; 7*! tMLBA *1U1NT8 SecPerClus; 7*UII‟1T8RsvdSecCnt; 1*IcU1NT 16FATSz16; /* FAT 16i JFAT Jffi I%*77*!#USBfl*7 **********void niDelaymS( UINT8 delay) {U]ENT8i,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 WRCMDPORT(UINT8 cmd) {1* CH375IJ44flA*4CH37SCMDPORT=cmd;for(cmd =2; cmd =0; cmd )7*W*4i-flt2uS */void CH375 WRDATPORT( UINT8 dat) {1* IiJ CR375 flJ3ttM* FT ACH375 DAT PORT=dat; 7* MCS51 tJLQWffi thflKtUINT8 CR375 RD DAT PORT( void) {/*bkCR375flthflflreturn(CH375DATPORT);7* MCS51 IL JZflHt*/ UINT8 mWaitlnterrupt( void) { 7*CR375#kwhile( CR375 TNT WIRE); 7**/CR375 WR CMD PORT(CMD GET STATUS); 7*11JW*1 return( CH375 RD DAT PORT(j);BullcOn1y4flitJ43L,41CR375T,t*1L*M*77***********RBC/SCSIfl,.flCR375 J I7***********/UINT8 nilnitDisk( void) {7* 4D4r1tfl*7UINT8 Status;CR375_WR_CMD_PORT( CMD_GET_STATUS); 7* JZtI$,*7 Status = CR3 75 RD DAT PORTO;if ( Status = USB INT DISCONNECT ) retum( Status); /* USB1J19T*7CR375 WRCMDPORT( CMD DISK INIT); 1* ft{IUSBM*7Status = mWaitlnterruptQ; 7*rj *7if ( Status != USB TNT SUCCESS) retum( Status); 7**1CR375 WRCMDPORT( CMD DISK SIZE); 7*USB‘fljfl*7Status = mWaitlnterruptQ; 7*fliJ*7if( Status != USB TNT SUCCESS) {1* tIä*77* tTCR375fl,*J‟Mt—CMDDISKRSENSE*4*7rnDelaymS( 250);CR375 WRCMDPORT( CMD DISK SIZE); 7*NZUSB#MJWt*7Status = mWaitlnterruptQ; 7*rfi *7if ( Status != USB TNT SUCCESS ) retum( Status); 7*t±iEQ4’i*7return( 0); 1* UDM1*1UINT8 mReadSector( UINT32 iLbaStart, UINT8 iSectorCount, UINT8X *oDataBuffer)U1NT 16mBlockCount;U1NT8 c;CH375WRCMDPORT( CMD DISK READ); 7*AUSBiflflCH375WRDATPORT( (UINT8)iLbaStart); 1* LBA{8ttcL*7CH375WRDATPORT( (UINT8)( iLbaStart >> 8));CH375WRDATPORT( (UINT8)( iLbaStart>> 16));CH375WRDATPORT((UINT8)( iLbaStart >> 24));/* LBAflJ18tL *7CH375WRDATPORT( iSectorCount); i8; mBlockCount != 0; mBlockCount --) {for (mBlockCount = iSectorCount*c = mWaitlnterruptQ; 1*if(c =USB TNT DISK READ) {7* flflj*7CH375WRCMDPORT( CMDRDUSBDATA); 1*),kCH375flktV**1c = CH375RDDATPORTQ;7*tES*1while (c --) *oDataBufferf_f = CH375RDDATPORT();CH375WRCMDPORT( CMD DISK RD 00);1*ffUSB4Jfl4‟1E*7 else break; /* J14W1kif ( mBlockCount = 0) {c=mWaitlnterrupt();1*if( c== USB TNT SUCCESS ) retum( 0); 1*1’MZJ*1return( c); 7* 4’J*77***********A*1? *7UINT16 mGetPointWord(UTNT8X *iAddr) { 1*MCS51ticM445Et*7 retum( iAddr[0] I(UINT16)iAddr[1] <<8);UINT8 mldenflisk( void) {7* *1UINT8 Status;DiskStart =0; /Status = niReadSector( 0, 1, DISK_BUFFER); /* I1ft/if( Status != 0) retum( Status);if( DISK BUFFER[O] != OxEB && DISK BUFFER[O] != OxE9) {1*DiskStart = DISK BUFFER[OxlC6] (UINT16)DISKBUFFER[OxlC7] <<8 (UINT32)DISKBUFFER[OxlC8] <<16 I(UTNT32)DISK BUFFER[OxlC9] <<24;Status = mReadSector( DiskStart, 1, DISK_BUFFER);if ( Status != 0 ) return( Status);SecPerClus = DISK BUFFER[OxOD]; 1**1RsvdSecCnt = DISK BUFFER[OxOE]; 1**1FATSz16 = mGetPointWord( &DISKBUFFER[0x161);1* FATIJU IZ*1 return( 0); /*MtbUINT16 mLinkCluster( U1NT16 iCluster) {1* *1!iA: iCluster J:Jtfl n*o *1UINT8 Status;Status = mReadSector( DiskStart + RsvdSecCnt + iCluster I 256, 1,DISK_BUFFER);if( Status != 0) return( 0); /**/return( mGetPointWord( &DISK BUFFER[ ( iCluster + iCluster) & OxO1FF]));UINT32 mClusterToLba( U1NT16 iCluster) {1*I#$t4LBAIJthEretum( DiskStart + RsvdSecCnt + FATSz16* 2 + 32 + (iCluster - 2)*SecPerClus);void mInitSTDIO( void) {1* flPCt,-bflt5ESCON = 0x50; PCON = 0x80; TMOD = 0x20; TH1 = Oxf3; TR1=1; TI=1; !24MHz, 9600bps */void mStoplfError( UINT8 iErrCode) {/*U* IU#I49tk*1if ( iErrCode = 0) return;printf( “Error status, %02X\n”,(UINT16)iErrCode);mainQ{UINT8 Status;UINT8XUINT16Cluster;mDelaymS( 200); /* flt200tLt*7mInitSTDIOQ;CH375_WR_CMD_PORT( CMD_SET_USB_MODE); /*CH375,tWUSBI1‟Pttt*7 CH375WRDATPORT( 6); 7*WJt4t4j, USBfl3while (1) {printf( “Insert USB disk\n”);while (mWaitlnterrupt() != USB_INT_CONNECT); 7*ImDelaymS( 250); /*UAIIfjStatus = mlnitDisk(); /*ftUiJUffifhHmStoplfError( Status);Status = midenDiskO; 7*R’J3*7mStoplfError( Status);2, 32,Status = mReadSector( DiskStart + RsvdSecCnt + FATSz16*DISK_BUFFER);mStoplfError( Status); /* i*FAT 16fl flJ*II,3fl‟*r!ij1J 32t, I/for ( CurrentDir = DISK_BUFFER; CurrentDir[0] != 0; CurrentDir += 32) { if( (CurrentDir[OxOBl & 0x08 ) == 0 && CurrentDir[0] !OxE5){ CurrentDir[OxOBj =0; 7*T±,t1tfl<43 AM*tprintf( “Name:%s\n”,CurrentDir); 7*1L1f* fl1LBW}7*±St flfl,ttff,flflCtfffl*7 if( (DISK BUFFER[OxOB]&0x08)==0 && DISK BUFFER[0]!=OxE5 && DISK BUFFER[8] ==…C‟){Cluster = mGetPointWord( &DISK BUFFER[Ox1A]); /*ff *7while (Cluster <OxFFF8) {7*if( Cluster == 0) mStoplfError( Ox8F); /*/Status = mReadSector( mClusterToLba( Cluster ), SecPerClus,DISK_BUFFER);mStoplfError( Status); 7*J1?‟jI:*7DISK_BUFFER[30] =0; printf( …Data:%s\n”,DISK BUFFER); /*Cluster = mLinkCluster( Cluster); 7**7}while (mWaitlnterrupt() != USB_INT_DISCONNECT); 7*1U1LB*7mDelaymS( 250);。

相关文档
最新文档