📄 ch375ev0.lis
字号:
.module CH375EV0.C
.area text(rom, con, rel)
0000 .dbfile E:\ICC128\2008控制台\2008console0TEST\U盘扇区读写\CH375EV0.C
0000 .dbfunc e delay2us _delay2us fV
0000 ; i -> R16
.even
0000 _delay2us::
0000 .dbline -1
0000 .dbline 59
0000 ; /* 2004.03.05
0000 ; 修改记录:
0000 ; 2007.08支持大扇区, 适用于CH375B芯片, 修改了: mInitDisk, mReadSector, mWriteSector, 增加了解: mClearError
0000 ; ****************************************
0000 ; ** Copyright (C) W.ch 1999-2004 **
0000 ; ** Web: http://www.winchiphead.com **
0000 ; ****************************************
0000 ; ** USB 1.1 Host Examples for CH375 **
0000 ; ** KC7.0@MCS-51 **
0000 ; ****************************************
0000 ; */
0000 ; /* CH375作为USB主机接口的程序示例 */
0000 ;
0000 ; /* MCS-51单片机C语言的示例程序, U盘数据读写 */
0000 ;
0000 ; #include <iom128v.h>
0000 ; #include <string.h>
0000 ; #include <stdio.h>
0000 ;
0000 ; #define MAX_SECTOR_SIZE 2048 /* 以512字节每扇区为主,部分有2K字节每扇区,最大为4K字节 */
0000 ;
0000 ; /* 定义CH375命令代码及返回状态 */
0000 ; #include "CH375INC.H"
0000 ; /* CH375特性 */
0000 ; #define CH375_BLOCK_SIZE 64 /* CH375 maximum data block size */
0000 ;
0000 ; /* 以下定义适用于MCS-51单片机,其它单片机参照修改,为了提供C语言的速度需要对本程序进行优化 */
0000 ; //#include <reg51.h>
0000 ; //unsigned char volatile xdata CH375_CMD_PORT _at_ 0xBDF1; /* CH375命令端口的I/O地址 */
0000 ; //unsigned char volatile xdata CH375_DAT_PORT _at_ 0xBCF0; /* CH375数据端口的I/O地址 */
0000 ; //unsigned char xdata DATA_BUFFER[ MAX_SECTOR_SIZE ] _at_ 0x0000; /* 外部RAM数据缓冲区的起始地址,长度不少于一次读写的数据长度 */
0000 ; //sbit CH375_INT_WIRE = 0xB0^2; /* P3.2, INT0, 连接CH375的INT#引脚,用于查询中断状态 */
0000 ;
0000 ; unsigned char DATA_BUFFER[ MAX_SECTOR_SIZE ];
0000 ;
0000 ; #define CH375_INT_WIRE ( PIND & 0x10 ) /* PINB.4, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
0000 ;
0000 ;
0000 ; #define TXB8 0
0000 ; #define FE 4
0000 ; #define DOR 3
0000 ; #define UPE 2
0000 ; #define RXC 7
0000 ;
0000 ; unsigned short BytePerSector; /* 每扇区字节数,扇区大小 */
0000 ; unsigned char BlockPerSector; /* 每扇区块数,指CH375读写时的块 BlockPerSector=BytePerSector/CH375_BLOCK_SIZE */
0000 ;
0000 ; /* 在P1.4连接一个LED用于监控演示程序的进度,低电平LED亮,当U盘插入后亮 */
0000 ; //sbit P1_4 = P1^4;
0000 ; //#define LED_OUT_ACT( ) { P1_4 = 0; } /* P1.4 低电平驱动LED显示 */
0000 ; //#define LED_OUT_INACT( ) { P1_4 = 1; } /* P1.4 低电平驱动LED显示 */
0000 ;
0000 ; #define P1_4 PORTG ^= 0x10;
0000 ; #define LED_OUT_ACT( ) { PORTG &= 0xEF; } /* PORTB.7 低电平驱动LED显示 */
0000 ; #define LED_OUT_INACT( ) { PORTG |= 0x10; } /* PORTB.7 低电平驱动LED显示 */
0000 ;
0000 ; /* 延时2微秒,不精确 */
0000 ; void delay2us( )
0000 ; {
0000 .dbline 61
0000 0AE0 ldi R16,10
0002 01C0 xjmp L5
0004 L2:
0004 .dbline 61
0004 L3:
0004 .dbline 61
0004 0A95 dec R16
0006 L5:
0006 .dbline 61
0006 ; unsigned char i;
0006 ; for ( i = 10; i != 0; i -- );
0006 0023 tst R16
0008 E9F7 brne L2
000A .dbline -2
000A L1:
000A .dbline 0 ; func end
000A 0895 ret
000C .dbsym r i 16 c
000C .dbend
000C .dbfunc e delay1us _delay1us fV
000C ; i -> R16,R17
.even
000C _delay1us::
000C .dbline -1
000C .dbline 66
000C ; }
000C ;
000C ; /* 延时1微秒,不精确 */
000C ; void delay1us( )
000C ; {
000C .dbline 68
000C 05E0 ldi R16,5
000E 10E0 ldi R17,0
0010 02C0 xjmp L10
0012 L7:
0012 .dbline 68
0012 L8:
0012 .dbline 68
0012 0150 subi R16,1
0014 1040 sbci R17,0
0016 L10:
0016 .dbline 68
0016 ; unsigned int i;
0016 ; for ( i = 5; i != 0; i -- );
0016 0030 cpi R16,0
0018 0107 cpc R16,R17
001A D9F7 brne L7
001C X0:
001C .dbline -2
001C L6:
001C .dbline 0 ; func end
001C 0895 ret
001E .dbsym r i 16 i
001E .dbend
001E .dbfunc e mDelaymS _mDelaymS fV
001E ; i -> R20,R21
001E ; cnt -> R16
.even
001E _mDelaymS::
001E 0E940000 xcall push_gset1
0022 .dbline -1
0022 .dbline 73
0022 ; }
0022 ;
0022 ; /* 延时毫秒,不精确 */
0022 ; void mDelaymS( unsigned char cnt )
0022 ; {
0022 08C0 xjmp L13
0024 L12:
0024 .dbline 75
0024 ; unsigned int i;
0024 ; while ( cnt -- ) {
0024 .dbline 76
0024 49E6 ldi R20,2665
0026 5AE0 ldi R21,10
0028 02C0 xjmp L18
002A L15:
002A .dbline 76
002A L16:
002A .dbline 76
002A 4150 subi R20,1
002C 5040 sbci R21,0
002E L18:
002E .dbline 76
002E 4030 cpi R20,0
0030 4507 cpc R20,R21
0032 D9F7 brne L15
0034 X1:
0034 .dbline 77
0034 L13:
0034 .dbline 75
0034 202E mov R2,R16
0036 3324 clr R3
0038 0150 subi R16,1
003A 2220 tst R2
003C 99F7 brne L12
003E .dbline -2
003E L11:
003E 0E940000 xcall pop_gset1
0042 .dbline 0 ; func end
0042 0895 ret
0044 .dbsym r i 20 i
0044 .dbsym r cnt 16 c
0044 .dbend
0044 .dbfunc e CH375_WR_CMD_PORT _CH375_WR_CMD_PORT fV
0044 ; cmd -> R20
.even
0044 _CH375_WR_CMD_PORT::
0044 0E940000 xcall push_gset1
0048 402F mov R20,R16
004A .dbline -1
004A .dbline 82
004A ; for ( i = 2665; i != 0; i -- );
004A ; }
004A ; }
004A ;
004A ; /* 基本操作 */
004A ;
004A ; void CH375_WR_CMD_PORT( unsigned char cmd ) { /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */
004A .dbline 83
004A ; delay2us();
004A DADF xcall _delay2us
004C .dbline 85
004C ; //CH375_CMD_PORT=cmd;
004C ; UCSR1B |= 0X01; //将数据第9位置1,表示是地址帧
004C 80919A00 lds R24,154
0050 8160 ori R24,1
0052 80939A00 sts 154,R24
0056 L20:
0056 .dbline 86
0056 L21:
0056 .dbline 86
0056 ; while(!(UCSR1A&0x20));
0056 20909B00 lds R2,155
005A 25FE sbrs R2,5
005C FCCF rjmp L20
005E .dbline 87
005E ; UDR1=cmd; //写命令
005E 40939C00 sts 156,R20
0062 .dbline 88
0062 ; mDelaymS( 30 ); /* 延时100毫秒 */
0062 0EE1 ldi R16,30
0064 DCDF xcall _mDelaymS
0066 .dbline 89
0066 ; delay2us();
0066 CCDF xcall _delay2us
0068 .dbline -2
0068 L19:
0068 0E940000 xcall pop_gset1
006C .dbline 0 ; func end
006C 0895 ret
006E .dbsym r cmd 20 c
006E .dbend
006E .dbfunc e CH375_WR_DAT_PORT _CH375_WR_DAT_PORT fV
006E ; dat -> R20
.even
006E _CH375_WR_DAT_PORT::
006E 0E940000 xcall push_gset1
0072 402F mov R20,R16
0074 .dbline -1
0074 .dbline 92
0074 ; }
0074 ;
0074 ; void CH375_WR_DAT_PORT( unsigned char dat ) { /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */
0074 .dbline 94
0074 ; //CH375_DAT_PORT=dat;
0074 ; UCSR1B &= 0XFE;
0074 80919A00 lds R24,154
0078 8E7F andi R24,254
007A 80939A00 sts 154,R24
007E L24:
007E .dbline 95
007E L25:
007E .dbline 95
007E ; while(!(UCSR1A&0x20));
007E 20909B00 lds R2,155
0082 25FE sbrs R2,5
0084 FCCF rjmp L24
0086 .dbline 96
0086 ; UDR1= dat;
0086 40939C00 sts 156,R20
008A .dbline 97
008A ; mDelaymS( 30 ); /* 延时100毫秒 */
008A 0EE1 ldi R16,30
008C C8DF xcall _mDelaymS
008E .dbline 98
008E ; delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */
008E BEDF xcall _delay1us
0090 .dbline -2
0090 L23:
0090 0E940000 xcall pop_gset1
0094 .dbline 0 ; func end
0094 0895 ret
0096 .dbsym r dat 20 c
0096 .dbend
0096 .dbfunc e CH375_RD_DAT_PORT _CH375_RD_DAT_PORT fc
0096 ; status -> R20
0096 ; resl -> R20
0096 ; resh -> R22
.even
0096 _CH375_RD_DAT_PORT::
0096 0E940000 xcall push_gset2
009A .dbline -1
009A .dbline 102
009A ; }
009A ;
009A ; unsigned char CH375_RD_DAT_PORT()
009A ; { /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */
009A .dbline 105
009A ; unsigned char status, resh;
009A ; unsigned char resl;
009A ; delay1us(); /* 因为MCS51单片机较慢所以实际上无需延时 */
009A B8DF xcall _delay1us
009C .dbline 108
009C ; //while ( !(UCSR1A & (1<<RXC)) ) // 等待接收数据
009C ; //while ( !(UCSR1A & 0x80) ) // 等待接收数据
009C ; status = UCSR1A;// 从缓冲器中获得状态、第9 位及数据
009C 40919B00 lds R20,155
00A0 .dbline 109
00A0 ; resh = UCSR1B;
00A0 60919A00 lds R22,154
00A4 .dbline 110
00A4 ; resl = UDR1;
00A4 40919C00 lds R20,156
00A8 .dbline 115
00A8 ;
00A8 ; //if ( status & (1<<FE)|(1<<DOR)|(1<<UPE) ) //如果出错,返回 -1
00A8 ; //return -1;
00A8 ; /* 过滤第9 位数据,然后返回*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -