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

📄 ch375.lst

📁 STC51系列的源码
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   CH375                                                                 10/19/2008 17:05:12 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\CH375.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\CH375.lst) OBJECT(
                    -.\CH375.obj)

line level    source

   1          /********************************************************************************/
   2          /* filename : CH375.h                                                           */
   3          /* created  : xillinx                                                           */
   4          /* descript : 选择CPU的类型                                                     */
   5          /********************************************************************************/
   6          #include "../CPU/CPU.h"
   7          #include "../CFG/CFG.h"
   8          #include "../UART/UART.h"
   9          #include "../CH375/CH375.h"
  10          
  11          
  12          uint08t  ch375b_disk_buffer[512*32];    //* 外部RAM数据缓冲区的起始地址
  13          uint32t  logic_disk_begin;              //* 逻辑盘的起始绝对扇区号LBA
  14          uint08t  logic_section_per_cluster;     //* 逻辑盘的每簇扇区数
  15          uint08t  logic_rsvd_section_num;        //* 逻辑盘的保留扇区数
  16          uint16t  logic_fat_section_num;         //* FAT16逻辑盘的FAT表占用的扇区数
  17          uint32t  logic_lba_begin;
  18          
  19          /********************************************************************************/
  20          /* function : ch375b_write_cmd()                                                */
  21          /* recension: xillinx                                                           */
  22          /* descript : CH375写命令函数                                                   */
  23          /********************************************************************************/
  24          void ch375b_write_cmd(uint08t cmd)
  25          {   CH375_CMD_PORT=cmd;
  26   1      }
  27          
  28          /********************************************************************************/
  29          /* function : ch375b_write_dat()                                                */
  30          /* recension: xillinx                                                           */
  31          /* descript : CH375写数据函数                                                   */
  32          /********************************************************************************/
  33          void ch375b_write_dat(uint08t dat)
  34          {   CH375_DAT_PORT=dat;
  35   1      }
  36          
  37          /********************************************************************************/
  38          /* function : ch375b_read_data()                                                */
  39          /* recension: xillinx                                                           */
  40          /* descript : CH375写数据函数                                                   */
  41          /********************************************************************************/
  42          uint08t ch375b_read_data(void)
  43          {   return(CH375_DAT_PORT);
  44   1      }
  45          
  46          /********************************************************************************/
  47          /* function : ch375_delay_ms()                                                  */
  48          /* recension: xillinx                                                           */
  49          /* descript : CH375的延时函数                                                   */
  50          /********************************************************************************/
  51          void ch375_delay_ms(uint08t ms)
  52          {   uint08t i,j,c;
  53   1          for(i=0x0;i<ms;i--)
  54   1          {   for(j=0x0;j<200;j++)
C51 COMPILER V8.02   CH375                                                                 10/19/2008 17:05:12 PAGE 2   

  55   2              {   c+=0x3;
  56   3              }
  57   2              for(j=0x0;j<200;j++)
  58   2              {   c+=0x3;
  59   3              }
  60   2          }
  61   1      }
  62          
  63          
  64          /********************************************************************************/
  65          /* function : ch375b_wait_interrupt()                                           */
  66          /* recension: xillinx                                                           */
  67          /* descript : 等待CH375中断并获取状态,返回操作状态                              */
  68          /********************************************************************************/
  69          uint08t ch375b_wait_interrupt(void)
  70          {   uint16t time=0x2000;
  71   1          uint08t status=0x0;
  72   1          while((CH375_ISR_PIN)&&(time))
  73   1          {   //time--;
  74   2          }
  75   1          ch375b_write_cmd(CMD_GET_STATUS); //* 产生操作完成中断,获取中断状态
  76   1          status=ch375b_read_data();
  77   1          return      status;
  78   1      }
  79          
  80          /********************************************************************************/
  81          /* function : ch375b_disk_initialize()                                          */
  82          /* recension: xillinx                                                           */
  83          /* descript : BulkOnly传输协议层,被CH375内置了,无需编写单片机程序,RBC/SCSI命令  */
  84          /*   层,虽然被CH375内置了,但是要写程序发出命令及收发数据                        */
  85          /********************************************************************************/
  86          uint08t ch375b_disk_initialize( void )
  87          {   uint08t status;
  88   1          ch375b_write_cmd(CMD_GET_STATUS);  //* 产生操作完成中断,获取中断状态
  89   1          status=ch375b_read_data();
  90   1          if(status==USB_INT_DISCONNECT)
  91   1          {  return status;                   //* USB设备断开
  92   2          }
  93   1          ch375b_write_cmd(CMD_DISK_INIT);    //* 初始化USB存储器
  94   1          status=ch375b_wait_interrupt();     //* 等待中断并获取状态
  95   1          if(status!=USB_INT_SUCCESS)
  96   1          {  return status;
  97   2          }
  98   1          ch375b_write_cmd(CMD_DISK_SIZE);    //* 获取USB存储器的容量
  99   1          status=ch375b_wait_interrupt();
 100   1          if(status==USB_INT_SUCCESS)
 101   1          {   return 0x0;                     //* U盘已经成功初始化
 102   2          }
 103   1          ch375_delay_ms(250);
 104   1          ch375b_write_cmd(CMD_DISK_SIZE);    //* 获取USB存储器的容量
 105   1          status=ch375b_wait_interrupt();
 106   1          if(status==USB_INT_SUCCESS)
 107   1          {   return 0x0;                     //* U盘已经成功初始化
 108   2          }
 109   1          else
 110   1          {   return status;
 111   2          }
 112   1      }
 113          /********************************************************************************/
 114          /* NORMAL普通模式是最早的IDE方式,在硬盘访问时,BIOS和IDE控制器对参数不做任何转换 */
 115          /* 该模式支持的最大柱面数为1024, 最大磁头数为16, 最大扇区数为63, 每扇区字节数为 */
 116          /* 512,因此支持最大硬盘的容量为: 512x63x16x1024=528MB.                          */
C51 COMPILER V8.02   CH375                                                                 10/19/2008 17:05:12 PAGE 3   

 117          /* LBA(Logical Block Addressing)逻辑块寻址模式,设置的柱面、磁头、扇区等参数并不 */
 118          /* 是实际硬盘的物理参数. 在访问硬盘时,由IDE控制器把由柱面、磁头、扇区等参数确定 */
 119          /* 的逻辑地址转换为实际硬盘的物理地址, 在LBA模式下,可设置的最大磁头数为255,其余 */
 120          /* 参数与普通模式相同,由此可以计算出可访问的硬盘容量为:512x63x255x1025=8.4GB.   */
 121          /* 现在新主板的BIOS对INT13进行了扩展,使得LBA能支持100GB以上的硬盘。             */
 122          /* LARGE大硬盘模式,在硬盘的柱面超过1024而又不为LBA支持时采用,LARGE模式采用的方  */
 123          /* 法是把柱面数除以2,把磁头数乘以2                                             */
 124          /********************************************************************************/
 125          
 126          /********************************************************************************/
 127          /* function : ch375b_read_sector()                                              */
 128          /* recension: xillinx                                                           */
 129          /* descript : CH375读取扇区数据                                                 */
 130          /********************************************************************************/
 131          uint08t ch375b_read_sector(uint32t lba_begin, uint08t section_num, uint08t *out_buffer )
 132          {   uint16t  block_num,all_num=section_num<<0x3;
 133   1          uint08t  mflag;
 134   1          uint16t  i=0x0;
 135   1          ch375b_write_cmd(CMD_DISK_READ);                //* 从USB存储器读数据块
 136   1          ch375b_write_dat((uint08t)(lba_begin>>0x00));   //* LBA的最低8位
 137   1          ch375b_write_dat((uint08t)(lba_begin>>0x08));
 138   1          ch375b_write_dat((uint08t)(lba_begin>>0x10));
 139   1          ch375b_write_dat((uint08t)(lba_begin>>0x18));   //* LBA的最高8位
 140   1          ch375b_write_dat(section_num);                  //* 扇区数
 141   1          UART_printf("read 1.\r\n");
 142   1          for(block_num=0x0;block_num<all_num; block_num++)
 143   1          {   mflag=ch375b_wait_interrupt();              //* 等待中断并获取状态
 144   2              if(mflag!=USB_INT_DISK_READ)                //* 等待中断并获取状态,请求数据读出
 145   2              {  break;                                   //* 返回错误状态
 146   3              }
 147   2              ch375b_write_cmd(CMD_RD_USB_DATA);          //* 从CH375缓冲区读取数据块
 148   2              mflag=ch375b_read_data();                   //* 后续数据的长度
 149   2              UART_printf("block %d-count %bd.\r\n",block_num,mflag);
 150   2              while(mflag--)
 151   2              {  out_buffer[i++]=ch375b_read_data();
 152   3              }
 153   2              ch375b_write_cmd(CMD_DISK_RD_GO);           //* 继续执行USB存储器的读操作
 154   2          }
 155   1          UART_printf("read 2.\r\n");
 156   1          if( block_num>=all_num)
 157   1          {   mflag=ch375b_wait_interrupt();              //* 等待中断并获取状态
 158   2              if(mflag==USB_INT_SUCCESS)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -