⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch375ev0.lis

📁 使用ATMEGA128加CH375对U盘扇区进行读写,本程序在ICCAVR上调试,并在相应硬件电路上调试通过!供参考用
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .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 + -