📄 ch375udevice.lst
字号:
C51 COMPILER V7.20 CH375UDEVICE 11/15/2005 22:07:19 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE CH375UDEVICE
OBJECT MODULE PLACED IN CH375UDevice.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil Uvision V7.20\C51\BIN\C51.EXE CH375UDevice.C BROWSE DEBUG OBJECTEXTEND
line level source
1 //=================================================================================================
2 //*************************************************************************************************
3 // Module Name : CH375UDevice.C
4 // Device object:
5 // Create date : 2005-11-07
6 // Modify date : 2005-11-11
7 // Description : USB 1.1 U Device for CH375
8 //
9 // Author : Li yuanzheng
10 // Version : V1.0
11 //*************************************************************************************************
12 //=================================================================================================
13 //
14 /* 这个程序用180行C代码就能够读取FAT16文件系统U盘的根目录,可以看到根目录下的文件
15 名,并可显示
16 首文件内容,不过,该程序很不严谨,也没有任何错误处理,对U盘兼容性较差,只是用于简单试
17 验,作为参考.
18 这个程序可以支持WINDOWS按FAT16格式化的U盘,因为程序精简,所以只兼容超过50%以上的U
19 盘品牌,如果换
20 成CH375A芯片则兼容性可提高到85%,当然,如果使用WCH公司的子程序库或者正式版本的C源
21 程序兼容性更好。
22 下
23 欢测试以下U盘通过:郎科/超稳经典64M/超稳迷你128M/U160-64M/超稳普及128M,爱国者/迷
24 你王16M/邮箱型,
25 黑匣子/64M,微闪/64M,飙王/32M/64M/128M,晶彩/C200-64M,新科/256M,昂达/128M...,欢迎
26 提供测试结果
27 未通过U盘:爱国者/智慧棒128M,清华普天/USB2.0-128M,当然,使用WCH的子程序库或CH375A
28 都可以测试通过 */
29 //-------------------------------------------------------------------------------------------------
30 // Includes
31 //-------------------------------------------------------------------------------------------------
32
33 #include <regx52.h> // 以下定义适用于MCS-51单片机,其它单片机参照修改
34 #include <stdio.h>
35 #include "CH375H.H"
36 #include "CH375UDevice.H"
37
38 //=================================================================================================
39 //
40 //UINT8X FILE_DATA_BUF[512*32] _at_ 0x0000; // 外部RAM数据缓冲区的起始地址 (DISK_BUFFER)
41
42 UINT32 DiskStart; // 逻辑盘的起始绝对扇区号LBA
43 UINT8 SecPerClus; // 逻辑盘的每簇扇区数
44 UINT8 ResvdSecCnt; // 逻辑盘的保留扇区数
45 UINT16 FATSize16; // FAT16逻辑盘的FAT表占用的扇区数
46
47 //=================================================================================================
48 //
49 //=================================================================================================
50 //
51
52 //=================================================================================================
53 // BulkOnly传输协议层,被CH375内置了,无需编写单片机程序
54 //=================================================================================================
55 //
C51 COMPILER V7.20 CH375UDEVICE 11/15/2005 22:07:19 PAGE 2
56 //=================================================================================================
57 //=================================================================================================
58 // RBC/SCSI命令层,虽然被CH375内置了,但是要写程序发出命令及收发数据
59 //=================================================================================================
60 //=================================================================================================
61 //
62 //-------------------------------------------------------------------------------------------------
63 // 初始化磁盘
64 UINT8 mInitDisk( void )
65 {
66 1 xWriteCH375Cmd( CMD_GET_STATUS ); // 产生操作完成中断, 获取中断状态
67 1 xQueryInterrupt( ); // 等待中断并获取状态
68 1 if( CH375IntStatus == USB_INT_DISCONNECT ) return( CH375IntStatus ); // USB设备断开
69 1
70 1 xWriteCH375Cmd( CMD_DISK_INIT ); // 初始化USB存储器
71 1 xQueryInterrupt( ); // 等待中断并获取状态
72 1 if( CH375IntStatus != USB_INT_SUCCESS ) return( CH375IntStatus ); // 出现错误
73 1
74 1 xWriteCH375Cmd( CMD_DISK_SIZE ); // 获取USB存储器的容量
75 1 xQueryInterrupt( ); // 等待中断并获取状态
76 1 if( CH375IntStatus != USB_INT_SUCCESS ) // 出错重试
77 1 { // 对于CH375A芯片,建议在此执行一次CMD_DISK_R_SENSE命令
78 2 mDelaymS( 250 );
79 2 xWriteCH375Cmd( CMD_DISK_SIZE ); // 获取USB存储器的容量
80 2 xQueryInterrupt( ); // 等待中断并获取状态
81 2 }
82 1 if( CH375IntStatus != USB_INT_SUCCESS ) return( CH375IntStatus ); // 出现错误
83 1
84 1 return( 0 ); // U盘已经成功初始化
85 1 }
86
87 //-------------------------------------------------------------------------------------------------
88 // 从USB存储器的指定地点读数据块到外部缓冲区
89 UINT8 mReadSector( UINT32 iLbaStart, UINT8 iSectorCount, UINT8X *DataBuffer )
90 {
91 1 UINT16 mBlockCount;
92 1
93 1 // 从USB存储器读数据块
94 1 xWriteCH375Cmd( CMD_DISK_READ );
95 1
96 1 xWriteCH375Data( (UINT8)iLbaStart ); // LBA的最低8位
97 1 xWriteCH375Data( (UINT8)( iLbaStart >> 8 ) );
98 1 xWriteCH375Data( (UINT8)( iLbaStart >> 16 ) );
99 1 xWriteCH375Data( (UINT8)( iLbaStart >> 24 ) ); // LBA的最高8位
100 1
101 1 xWriteCH375Data( iSectorCount ); // 扇区数
102 1 for ( mBlockCount = iSectorCount * 8; mBlockCount != 0; mBlockCount -- )
103 1 {
104 2 xQueryInterrupt( ); // 等待中断并获取状态
105 2 if ( CH375IntStatus == USB_INT_DISK_READ ) // 等待中断并获取状态,请求数据读出
106 2 {
107 3 xWriteCH375Cmd( CMD_RD_USB_DATA ); // 从CH375缓冲区读取数据块
108 3 CH375IntStatus = xReadCH375Data( ); // 后续数据的长度
109 3 while ( CH375IntStatus -- ) *DataBuffer++ = xReadCH375Data( );
110 3 xWriteCH375Cmd( CMD_DISK_RD_GO ); // 继续执行USB存储器的读操作
111 3 }
112 2 else break; // 返回错误状态
113 2 }
114 1
115 1 if ( mBlockCount == 0 )
116 1 {
117 2 xQueryInterrupt( ); // 等待中断并获取状态
C51 COMPILER V7.20 CH375UDEVICE 11/15/2005 22:07:19 PAGE 3
118 2 if ( CH375IntStatus == USB_INT_SUCCESS ) return( 0 ); // 操作成功
119 2 }
120 1
121 1 return( CH375IntStatus ); // 操作失败
122 1 }
123
124 //=================================================================================================
125 //=================================================================================================
126 // FAT文件系统层,这层程序量实际较大,不过,该程序仅演示极简单的功能,所以精简
127 //=================================================================================================
128 //=================================================================================================
129 //
130 //-------------------------------------------------------------------------------------------------
131 // 获取字数据,因为MCS51是大端格式
132 UINT16 mGetPointWord( UINT8X *iAddr )
133 {
134 1 return( iAddr[0] | (UINT16)iAddr[1] << 8 );
135 1 }
136
137 //-------------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -