📄 ch375.lst
字号:
159 2 { return 0x0; //* 操作成功
160 3 }
161 2 }
162 1 return mflag; //* 操作失败
163 1 }
164
165
166 /********************************************************************************/
167 /* function : ch375b_get_point() */
168 /* recension: xillinx */
169 /* descript : 获取字数据,因为MCS51是大端格式 */
170 /********************************************************************************/
171 uint16t ch375b_get_point(uint08t * addr)
172 { uint16t paddr=addr[0x0];
173 1 paddr+=addr[0x1]<<8;
174 1 return paddr;
175 1 }
176
177 /********************************************************************************/
178 /* function : ch375b_ident_disk() */
C51 COMPILER V8.02 CH375 10/19/2008 17:05:12 PAGE 4
179 /* recension: xillinx */
180 /* descript : 识别分析当前逻辑盘 */
181 /********************************************************************************/
182 uint08t ch375b_ident_disk(void)
183 { uint08t status;
184 1 logic_disk_begin=0x0; //* 以下是非常简单的FAT文件系统的分析
185 1 status=ch375b_read_sector(0x0,0x1,ch375b_disk_buffer); //* 读取逻辑盘引导信息
186 1 if(status!=0x0)
187 1 { return status;
188 2 }
189 1 if((ch375b_disk_buffer[0x0]!=0xEB)&&(ch375b_disk_buffer[0x0]!=0xE9)) //* 不是逻辑引导扇区
190 1 { logic_disk_begin =ch375b_disk_buffer[0x1C6]<<0x00;
191 2 logic_disk_begin+=ch375b_disk_buffer[0x1C7]<<0x08;
192 2 logic_disk_begin+=ch375b_disk_buffer[0x1C8]<<0x10;
193 2 logic_disk_begin+=ch375b_disk_buffer[0x1C9]<<0x18;
194 2 status=ch375b_read_sector(logic_disk_begin,0x1,ch375b_disk_buffer);
195 2 if(status!=0x0)
196 2 { return status;
197 3 }
198 2 }
199 1 logic_section_per_cluster= ch375b_disk_buffer[0x0D]; //* 每簇扇区数
200 1 logic_rsvd_section_num = ch375b_disk_buffer[0x0E]; //* 逻辑盘的保留扇区数
201 1 logic_fat_section_num = ch375b_get_point(&ch375b_disk_buffer[0x16]); //* FAT表占用扇区数
202 1 return 0x0;
203 1 }
204
205 /********************************************************************************/
206 /* function : ch375b_link_cluster() */
207 /* recension: xillinx */
208 /* descript : 获得指定簇号的链接簇 */
209 /* 输入cluster当前簇号,返回原链接簇号,如果为0x0则说明错误 */
210 /********************************************************************************/
211 uint16t ch375b_link_cluster(uint16t cluster)
212 { uint08t status;
213 1 status=ch375b_read_sector(logic_disk_begin+logic_rsvd_section_num+cluster/256,0x1,ch375b_disk_buffer);
214 1 if(status!=0x0)
215 1 { return 0x0;
216 2 }
217 1 return ch375b_get_point(&ch375b_disk_buffer[(cluster+cluster)&0x01FF]);
218 1 }
219
220 /********************************************************************************/
221 /* function : ch375b_cluster_2_lba() */
222 /* recension: xillinx */
223 /* descript : 将簇号转换为绝对LBA扇区地址 */
224 /********************************************************************************/
225 uint32t ch375b_cluster_2_lba(uint16t cluster)
226 { return logic_disk_begin+logic_rsvd_section_num+logic_fat_section_num*0x2+32+(cluster-0x2)*logic_sectio
-n_per_cluster;
227 1 }
228
229 /********************************************************************************/
230 /* function : ch375_display_error() */
231 /* recension: xillinx */
232 /* descript : 如果错误则停止运行并显示错误状态 */
233 /********************************************************************************/
234 void ch375_display_error(uint08t status)
235 { if(status==0x0)
236 1 { return;
237 2 }
238 1 UART_printf("error status: %bx.\r\n",status);
239 1 }
C51 COMPILER V8.02 CH375 10/19/2008 17:05:12 PAGE 5
240
241 /********************************************************************************/
242 /* function : ch375b_mode_initialize() */
243 /* recension: xillinx */
244 /* descript : 将簇号转换为绝对LBA扇区地址 */
245 /********************************************************************************/
246 void ch375b_mode_initialize(uint08t mode)
247 { ch375b_write_cmd(CMD_SET_USB_MODE);
248 1 ch375b_write_dat(mode);
249 1 }
250
251 /********************************************************************************/
252 /* function : ch375b_main() */
253 /* recension: xillinx */
254 /* descript : 将簇号转换为绝对LBA扇区地址 */
255 /********************************************************************************/
256 uint32t ch375b_main(void)
257 { uint08t * cur_dir;
258 1 uint16t cluster;
259 1 uint08t status;
260 1 ch375b_mode_initialize(0x6);
261 1 while(ch375b_wait_interrupt()!=USB_INT_CONNECT)
262 1 { ;
263 2 }
264 1 UART_printf("USB connect.\r\n");
265 1 ch375_delay_ms(250); //* 延时等待U盘进入正常工作状态
266 1
267 1 UART_printf("USB disk init.\r\n");
268 1 status=ch375b_disk_initialize(); //* 初始化U盘,实际是识别U盘的类型,必须进行此步骤
269 1 ch375_display_error(status);
270 1
271 1 UART_printf("USB read ident.\r\n");
272 1 status=ch375b_ident_disk( ); //* 识别分析U盘文件系统,必要操作
273 1 ch375_display_error(status);
274 1
275 1 UART_printf("USB read section.\r\n");
276 1 logic_lba_begin=logic_disk_begin+logic_rsvd_section_num+logic_fat_section_num*0x2;
277 1 status = ch375b_read_sector(logic_lba_begin,4,ch375b_disk_buffer);
278 1 ch375_display_error(status); //* 读取FAT16逻辑盘的根目录,通常根目录占用32个扇区
279 1
280 1 UART_printf("USB read dir.\r\n");
281 1 for(cur_dir=ch375b_disk_buffer; cur_dir[0x0]!=0x0; cur_dir+=0x20)//* 显示根目录下的所有文件名
282 1 { if((cur_dir[0x0B]&0x08)==0x0&&cur_dir[0x0]!=0xE5)
283 2 { cur_dir[0x0B]=0x0; //* 为了便于显示,设置文件名或者目录名的结束标志
284 3 UART_printf("name: %s.\r\n",cur_dir);
285 3 }
286 2 }
287 1 UART_printf("USB read file.\r\n");
288 1 if((ch375b_disk_buffer[0x0B]&0x08)==0x0&&ch375b_disk_buffer[0x0]!=0xE5 && ch375b_disk_buffer[0x8]=='C'
-)
289 1 { cluster=ch375b_get_point(&ch375b_disk_buffer[0x1A]); //* 文件的首簇
290 2 while(cluster<0xFFF8) //* 文件簇未结束
291 2 { if(cluster==0x0)
292 3 { ch375_display_error(0x8F); //* 对于首簇,可能是0长度文件
293 4 }
294 3 status=ch375b_read_sector(ch375b_cluster_2_lba(cluster),4,ch375b_disk_buffer);
295 3 ch375_display_error(status); //* 读取首簇到缓冲区 */
296 3 ch375b_disk_buffer[30]=0x0;
297 3 UART_printf( "Data: %s\n",ch375b_disk_buffer); //* 显示首行
298 3 cluster=ch375b_link_cluster(cluster); //* 获取链接簇,返回0说明错误
299 3 }
300 2 }
C51 COMPILER V8.02 CH375 10/19/2008 17:05:12 PAGE 6
301 1 UART_printf("USB wait disconnect.\r\n");
302 1 while(ch375b_wait_interrupt()!=USB_INT_DISCONNECT); //* 等待U盘拔出
303 1 ch375_delay_ms( 250 );
304 1
305 1 return 0x0;
306 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1518 ----
CONSTANT SIZE = 211 ----
XDATA SIZE = 16396 26
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -