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

📄 ch375.lst

📁 实现单片机上直接对U盘数据的读写
💻 LST
📖 第 1 页 / 共 2 页
字号:
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 + -