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

📄 testusb.lst

📁 keil c 开发的USB芯片CH375的程序CPU 为c8051f340
💻 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 + -