📄 ch375.lst
字号:
C51 COMPILER V8.02 CH375 05/29/2008 12:04:17 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE CH375
OBJECT MODULE PLACED IN CH375.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CH375.C BROWSE DEBUG OBJECTEXTEND
line level source
1
2 #include <reg52.h>
3 #include <stdio.h>
4 #include <absacc.h>
5 #include <intrins.h>
6
7
8 #define CH375_CMD_PORT_ADDR 0xBDF1 /* CH375命令端口的I/O地址 */
9 #define CH375_DAT_PORT_ADDR 0xBCF0 /* CH375数据端口的I/O地址 */
10 #define CH375_INT_WIRE INT0 /* P3.2, INT0, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
11 #define DATA_BUFFER_ADDR 0xE000
12
13 //************** 中断状态输出******************
14
15 #define USB_INT_SUCCESS 0x14
16 #define USB_INT_CONNECT 0x15
17 #define USB_INT_DISCONNECT 0x16
18 #define USB_INT_BUS_OVER 0x17
19 #define USB_INT_DISK_READ 0x1d
20 #define USB_INT_DISK_WRITE 0x1e
21 #define USB_INT_DISK_ERR 0x1f
22 //*****************************
23 unsigned char data Cmd_buffer[5];
24 unsigned char xdata data_buffer[512] _at_ DATA_BUFFER_ADDR;
25
26 unsigned char i;
27
28 /* 延时1毫秒,不精确 */
29 void delay1ms(unsigned char k){
30 1 unsigned int i ;
31 1 while(k>0){for (i=0;i<250;i++); k--;}
32 1 }
33 // delay 5us for 24Mhz
34 void delay5us(){
35 1 _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
36 1 _nop_();_nop_();_nop_();_nop_();_nop_();
37 1
38 1 }
39
40 void delay2us(){
41 1 _nop_(); _nop_(); _nop_(); _nop_();
42 1 _nop_();_nop_();_nop_();_nop_();
43 1
44 1 }
45 //接受数据
46 unsigned char recv_data (void)
47 {
48 1 unsigned char dat1;
49 1 RI = 0;
50 1 while (!RI);
51 1 dat1 = SBUF;
52 1 RI = 0;
53 1 return dat1;
54 1 }
55 /* 为printf和getkey输入输出初始化串口 */
C51 COMPILER V8.02 CH375 05/29/2008 12:04:17 PAGE 2
56 void mInitSTDIO( )
57 {
58 1 SCON = 0x50;
59 1 PCON = 0x80;
60 1 TMOD = 0x20;
61 1 TH1 = 0xf3; /* 24MHz晶振, 9600bps */
62 1 TR1 = 1;
63 1 TI = 1;
64 1 }
65
66 //复位CH375
67 void mRestCH375( )
68 {
69 1 XBYTE[CH375_CMD_PORT_ADDR] = 0x05;
70 1 delay1ms(50);
71 1 }
72
73 //校验CH375 工作是否正常
74 unsigned char mVarifyCH375(unsigned char temp)
75 {
76 1 XBYTE[CH375_CMD_PORT_ADDR] = 0x06;
77 1
78 1 XBYTE[CH375_DAT_PORT_ADDR] = temp;
79 1 delay5us();
80 1 temp = XBYTE[CH375_DAT_PORT_ADDR];
81 1 return(temp);
82 1
83 1 }
84 //设置CH375的工作模式6
85 void mSetmodeCH375( )
86 {
87 1 XBYTE[CH375_CMD_PORT_ADDR] = 0x15;
88 1 XBYTE[CH375_DAT_PORT_ADDR] = 0x06;
89 1 delay5us();
90 1 delay5us();
91 1 delay5us();
92 1 delay5us();
93 1 if ( XBYTE[CH375_DAT_PORT_ADDR] == 0x51 ) printf("Success Operation\n");
94 1 else printf("Error In Operation\n");
95 1 }
96 //
97 unsigned char mGet_Status_CH375()
98 {
99 1 unsigned char temp;
100 1 XBYTE[CH375_CMD_PORT_ADDR] = 0x22;//获取中断状态,并取消中断
101 1 delay2us();
102 1 temp = XBYTE[CH375_DAT_PORT_ADDR]; //获取中断内容
103 1 return(temp);
104 1
105 1 }
106
107 //获取CH375 的版本号
108 unsigned char mGET_CH375_VER()
109 {
110 1 unsigned char temp;
111 1 XBYTE[CH375_CMD_PORT_ADDR] = 0x01;
112 1 delay2us();
113 1 temp = XBYTE[CH375_DAT_PORT_ADDR];
114 1 return (temp);
115 1 }
116
117 //初始化USB
C51 COMPILER V8.02 CH375 05/29/2008 12:04:17 PAGE 3
118 void mDisk_Init()
119 {
120 1 XBYTE[CH375_CMD_PORT_ADDR] = 0x51; // USB_INIT
121 1 while(INT0);
122 1 if(mGet_Status_CH375()!=USB_INT_SUCCESS) {printf("Error:%x\n",(unsigned int)mGet_Status_CH375()); return;
-}
123 1 }
124 //获取U 盘的容量
125 void mGET_USB_Size()
126 {
127 1 unsigned char temp;
128 1 unsigned long usbsize;
129 1 unsigned long sectornum;//扇区总数
130 1 XBYTE[CH375_CMD_PORT_ADDR] = 0x53;//USB_SIZE
131 1 while(INT0); //CH375 请求中断
132 1 if(mGet_Status_CH375()!=USB_INT_SUCCESS) {printf("Error:%x\n",(unsigned int)mGet_Status_CH375()); return;
-}
133 1 XBYTE[CH375_CMD_PORT_ADDR] = 0x28;//READ_USB_DATA
134 1
135 1 for(i=0;i<4;i++){
136 2 sectornum<<=8;
137 2 sectornum = XBYTE[CH375_DAT_PORT_ADDR];
138 2
139 2 }
140 1 for(i=0;i<4;i++){
141 2 temp = XBYTE[CH375_DAT_PORT_ADDR];
142 2
143 2 }
144 1 usbsize = sectornum>>1;
145 1 printf("Sector Number:%ld,Size: %ld K\n",sectornum,usbsize);
146 1 }
147
148 //**********读数据从U盘***********************
149 unsigned char mReadSector( unsigned long iLbaStart, unsigned char iSectorCount )
150 /* iLbaStart 是准备读取的线性起始扇区号, iSectorCount 是准备读取的扇区数 */
151 {
152 1 unsigned char *mBufferPoint;
153 1 unsigned int mBlockCount;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -