📄 testusb.lst
字号:
C51 COMPILER V8.05a TESTUSB 02/21/2008 09:56:10 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE TESTUSB
OBJECT MODULE PLACED IN TESTUSB.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE TESTUSB.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "C8051F340.h"
2 #include "intrins.h"
3 #include <PORTDEFINE.H>
4 #include <MCU.H>
5 #include <USB.H>
6 #include <CH375HF5.H>
7
8 unsigned int SecCount;
9 unsigned int NewSize;
10 unsigned char xdata USB_data_buff[512];
11
12 bit USB_connect;
13 bit USB_disconnect;
14
15 void xDelay100uS(void) //延时100uS
16 {
17 1 Delayus(100);
18 1 }
19
20 void xDelayAfterWrite(void) //写操作后延时
21 {
22 1 Delayus(200); //延时200uS左右
23 1 }
24
25 void xQueryInterrupt(void) //查询中断状态,等待硬件中断
26 {
27 1 while(CH375IntStatus==0);
28 1 //子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回
29 1 }
30
31 void INT0(void) interrupt INTERRUPT_INT0
32 {
33 1 xWriteCH375Cmd(CMD_GET_STATUS); //获取中断状态并取消中断请求
34 1 CH375IntStatus=xReadCH375Data(); //获取中断状态
35 1
36 1 if(CH375IntStatus==USB_INT_DISCONNECT)
37 1 CH375DiskStatus = DISK_DISCONNECT; //检测到USB设备断开事件
38 1 else if(CH375IntStatus==USB_INT_CONNECT)
39 1 {
40 2 CH375DiskStatus = DISK_CONNECT; //检测到USB设备连接事件
41 2 USB_connect=1;
42 2 }
43 1 }
44
45 //将程序空间的字符串复制到内部RAM中,返回字符串长度
46 unsigned char mCopyCodeStringToIRAM(UINT8 idata *iDestination, UINT8 code *iSource)
47 {
48 1 UINT8 i = 0;
49 1 while(*iDestination = *iSource)
50 1 {
51 2 iDestination ++;
52 2 iSource ++;
53 2 i ++;
54 2 }
55 1 return(i);
C51 COMPILER V8.05a TESTUSB 02/21/2008 09:56:10 PAGE 2
56 1 }
57
58 unsigned char SafeRemoveDisk(void)
59 {
60 1 unsigned char i;
61 1 for(i=0;i<10;i++) //有的U盘总是返回未准备好,不过可以被忽略
62 1 {
63 2 Delayms(100);
64 2 if(CH375DiskReady()==ERR_SUCCESS)
65 2 break; //查询磁盘是否准备好
66 2 }
67 1 Delayms(10);
68 1 xWriteCH375Cmd(CMD_SET_CONFIG); //设置USB配置
69 1 xWriteCH375Data(0); //取消配置,会导致很多U盘的LED灯灭
70 1 xQueryInterrupt(); //查询CH375中断并更新中断状态
71 1 Delayms(10);
72 1 if(i<5&&CH375IntStatus==USB_INT_SUCCESS)
73 1 return( USB_INT_SUCCESS ); //操作成功
74 1 else return(0xFF);
75 1 //以下取消SOF包会导致绝大多数U盘的LED灯灭
76 1 //如果此处取消SOF, 那么与此对应, 在检测到U盘插入后应该再恢复为模式6即恢复SOF包 */
77 1 // xWriteCH375Cmd( CMD_SET_USB_MODE ); /* 设置USB工作模式 */
78 1 // xWriteCH375Data( 5 ); /* 停止发出SOF包,检测到U盘插入后必须用模式6恢复SOF包发出 */
79 1 // mDelaymS( 1 );
80 1 }
81
82 void main(void)
83 {
84 1 unsigned char i;
85 1 unsigned char c;
86 1 unsigned int ui1,ui2;
87 1
88 1 CloseWDT();
89 1 Init_Device();
90 1 CloseWDT();
91 1 Clr_DOG();
92 1
93 1 EA=0;
94 1 Selectchip(0,2); //片选选择USB
95 1 for(ui1=0;ui1<512;ui1++)
96 1 {
97 2 USB_data_buff[ui1]=0;
98 2 }
99 1
100 1 //初始化USB,并测试USB---------------------------
101 1 USB_RESET();
102 1 i=CH375LibInit(); //初始化CH375程序库和CH375芯片,操作成功返回0
103 1 //----------------------------------------------
104 1 //设置USB工作模式-------------------------------
105 1 xWriteCH375Cmd(CMD_SET_USB_MODE);
106 1 xWriteCH375Data(0x06); //设置为已启用的主机方式并且自动产生SOF包
107 1 //当USB设备连接或者断开的时候会自动产生中断通知外部单片机
108 1 //等待操作成功,通常需要等待10uS-20uS
109 1 Delayus(20);
110 1 if(xReadCH375Data()==CMD_RET_SUCCESS)
111 1 _nop_();
112 1 //----------------------------------------------
113 1 //启动USB中断(外部中断)-------------------------
114 1 EA=1;
115 1 //----------------------------------------------
116 1 while(1)
117 1 {
C51 COMPILER V8.05a TESTUSB 02/21/2008 09:56:10 PAGE 3
118 2 //看是否有U盘插入,如果有U盘插入,只处理U盘的信息,其他操作停止
119 2 if(USB_connect==1)
120 2 {
121 3 USB_connect=0;
122 3 while(1)
123 3 {
124 4 // 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作
125 4 for(i=0;i<5;i++) //有的U盘总是返回未准备好,不过可以被忽略
126 4 {
127 5 Delayms(100);
128 5 if(CH375DiskReady()==ERR_SUCCESS)
129 5 break; //查询磁盘是否准备好
130 5 }
131 4 //操作U盘文件
132 4 i=CH375DiskConnect(); //正确返回0
133 4 //不考虑U盘的盘符
134 4 i=mCopyCodeStringToIRAM(mCmdParam.Open.mPathName, "\\S_DATA\\GDEMO.HEX");
135 4
136 4 i=CH375FileOpen(); //打开文件,正确返回0
137 4
138 4 if(i==ERR_MISS_DIR || i==ERR_MISS_FILE)
139 4 //没有找到文件,子目录名出错或者是文件名出错
140 4 {
141 5 _nop_();
142 5 }
143 4 else if(i==ERR_SUCCESS)
144 4 //恭喜,找到了
145 4 {
146 5 ui1=CH375vFileSize; //该文件的大小
147 5 ui2=CH375vSectorSize; //磁盘的扇区大小
148 5 while(1)
149 5 {
150 6 c=1; //每次读取1个扇区
151 6 mCmdParam.Read.mSectorCount=c; //指定读取的扇区数
152 6 i=CH375FileRead(); //读完后文件指针自动后移
153 6 //处理数据--------
154 6 for(ui1=0;ui1<FILE_DATA_BUF_LEN;ui1++)
155 6 {
156 7 USB_data_buff[ui1]=FILE_DATA_BUF[ui1];
157 7 }
158 6 //写FLASH
159 6 //----------------
160 6 if(mCmdParam.Read.mSectorCount<c)
161 6 break; //实际读出的扇区数较小则说明文件已经结束
162 6 }
163 5 i=CH375FileClose(); //关闭文件,正确返回0
164 5
165 5 if(SafeRemoveDisk()==USB_INT_SUCCESS)
166 5 break;
167 5 }
168 4 else
169 4 //不知道是什么问题的错误出现了
170 4 {
171 5 _nop_();
172 5 }
173 4 }
174 3 }
175 2 else
176 2 {
177 3 _nop_();
178 3 }
179 2 }
C51 COMPILER V8.05a TESTUSB 02/21/2008 09:56:10 PAGE 4
180 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 514 ----
CONSTANT SIZE = 18 ----
XDATA SIZE = 1536 ----
PDATA SIZE = ---- ----
DATA SIZE = 4 7
IDATA SIZE = 30 ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -