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

📄 ch375.lst

📁 使用ch375和stc 51写的usb鼠标的代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.06   CH375                                                                 04/07/2006 09:06:59 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE CH375
OBJECT MODULE PLACED IN E:\PROJECT\USB_MOUSE\CH375.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE E:\PROJECT\USB_MOUSE\CH375.C DB SB OE

stmt level    source

   1          #ifndef __CH375_C__
   2          #define __CH375_C__
   3          #endif
   4          
   5          #include "head.h"
   6          #include "ch375inc.h"
   7          #include "usbDef.h"
   8          #include "descriptor.h"
   9          #include "ch375.h"
  10          #include "mcuFun.h"
  11          #include "uart.h"
  12          
  13          #define CMD_PORT                XBYTE[0x7fff]
  14          #define DAT_PORT                XBYTE[0x3fff]
  15          
  16          
  17          extern uint8 eaCount, debug;
  18          extern uint16 tCount;
  19          extern uint8 idata ep1Buf[8];
  20          
  21          extern unsigned char RECV_LEN;                          // 刚接收到的数据的长度 
  22          extern unsigned char RECV_BUFFER[ CH375_MAX_DATA_LEN ];  /* 数据缓冲区,用于保存接收到的下传数据,长度为0到6
             -4字节 */
  23          extern unsigned char *cmd_buf;
  24          extern unsigned char *ret_buf;
  25          extern unsigned char mVarSetupRequest;                  // USB请求码
  26          extern unsigned char mVarSetupLength;                   // 后续数据长度
  27          extern unsigned char * VarSetupDescr;                   // 描述符偏移地址
  28          extern unsigned char VarUsbAddress ;                    //USB设备地址
  29          extern bit CH375FLAGERR;                                                                        //错误清0
  30          extern bit CH375CONFLAG;                                                                        //配置标志
  31          extern mREQUEST_PACKET  request;
  32          sbit led = P1^0;
  33          /* 与CH372/CH375有关的基本I/O操作 */
  34          /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */
  35          void CH375_WR_CMD_PORT( unsigned char cmd )
  36          {
  37   1                      _nop_();
  38   1                      CMD_PORT=cmd;
  39   1      }               
  40          
  41          //向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 
  42          void CH375_WR_DAT_PORT( unsigned char dat )
  43          {
  44   1                      _nop_();
  45   1                      DAT_PORT=dat;
  46   1      }               
  47          
  48          // 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时
  49          unsigned char CH375_RD_DAT_PORT(void)
  50          {
  51   1                      _nop_();
  52   1                      return(DAT_PORT);
  53   1      }               
  54          //----------------------------------------
C51 COMPILER V7.06   CH375                                                                 04/07/2006 09:06:59 PAGE 2   

  55          //设置CH37X的工作模式
  56          //如果设置不成功的话, 指示灯会闪烁
  57          //----------------------------------------
  58          void set_usb_mode( unsigned char mode )
  59          {
  60   1              unsigned char i;
  61   1              unsigned char RD_Data;
  62   1              
  63   1              CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
  64   1              CH375_WR_DAT_PORT( mode );
  65   1              
  66   1              for( i=100; i!=0; i-- )         // 等待设置模式操作完成,不超过30uS 
  67   1              {
  68   2                      RD_Data=CH375_RD_DAT_PORT();
  69   2                      if( RD_Data == CMD_RET_SUCCESS )
  70   2                      {
  71   3                              if(debug) uartPrint("set usb mode % ok\n\r", &mode, 1);
  72   3                              return;         // 成功 
  73   3                      }       
  74   2              }
  75   1      
  76   1              while(1)
  77   1              {
  78   2                      flash_led();    // CH375出错 
  79   2              }
  80   1      }
  81          
  82          //ch375硬复位   
  83          void disConnect()
  84          {
  85   1              CH375_WR_CMD_PORT( CMD_RESET_ALL );                     //似乎是他模拟了一次插拔
  86   1              delay1s();
  87   1      }       
  88                  
  89          //-----------------------------------
  90          //CH375初始化子程序
  91          //先检查CH375工作是否正常
  92          //然后设置工作模式
  93          //-----------------------------------
  94          void CH375_Init( void )
  95          {
  96   1              unsigned char i, k;
  97   1              unsigned char RD_Data;
  98   1              
  99   1              // 测试CH375是否正常工作
 100   1              for( k=100; k!=0; k-- )
 101   1              {
 102   2                      CH375_WR_CMD_PORT( CMD_CHECK_EXIST );  // 测试CH375是否正常工作 
 103   2                      i = 0x5A;
 104   2                      CH375_WR_DAT_PORT( i ); // 写入测试数据 
 105   2                      i = ~i;                                                                 // 返回数据应该是测试数据取反 
 106   2                      RD_Data = CH375_RD_DAT_PORT();
 107   2                      if ( RD_Data != i )     // CH375不正常 
 108   2                      {
 109   3                              for ( i=5; i!=0; i-- )
 110   3                              {
 111   4                                              CH375_WR_CMD_PORT( CMD_RESET_ALL );  // 多次重复发命令,执行硬件复位 
 112   4                              }
 113   3                              delay50ms();                            // 延时50ms 
 114   3                      }
 115   2                      else
 116   2                      {
C51 COMPILER V7.06   CH375                                                                 04/07/2006 09:06:59 PAGE 3   

 117   3                              break;
 118   3                      }
 119   2              }
 120   1              if( k==0 )
 121   1              {
 122   2                      while(1)
 123   2                      {
 124   3                              flash_led();  // CH375出错 
 125   3                      }
 126   2              }
 127   1              /*
 128   1              #ifdef MY_USB_VENDOR_ID
 129   1              #ifdef MY_USB_DEVICE_ID
 130   1              // 设置外部自定义的USB设备VID和PID,可选操作,不执行该命令则使用默认的VID和PID,
 131   1              //   如果设置使用自定义的ID,那么计算机端驱动程序INF安装文件中的"USB\VID_4348&PID_5537"需要进行类似修改
 132   1              CH375_WR_CMD_PORT( CMD_SET_USB_ID );  // 设置外部自定义的USB设备VID和PID,可选操作
 133   1              CH375_WR_DAT_PORT( (unsigned char)MY_USB_VENDOR_ID );  // 写入厂商ID的低字节
 134   1              CH375_WR_DAT_PORT( (unsigned char)(MY_USB_VENDOR_ID>>8) );  // 写入厂商ID的高字节
 135   1              CH375_WR_DAT_PORT( (unsigned char)MY_USB_DEVICE_ID );  // 写入设备ID的低字节
 136   1              CH375_WR_DAT_PORT( (unsigned char)(MY_USB_DEVICE_ID>>8) );  // 写入设备ID的高字节
 137   1              #endif
 138   1              #endif
 139   1              */
 140   1              /* 设置USB工作模式, 必要操作 */
 141   1              set_usb_mode( 1 );                      //外部固件模式
 142   1              //set_usb_mode( 2 );            //内部固件模式
 143   1      }
 144          
 145          //---------------------------------
 146          //函数说明: 端点0数据上传
 147          //上传的数据的长度放在变量
 148          //mVarSetupLength中, 数据放在
 149          //结构request中
 150          //---------------------------------
 151          void mCh375Ep0Up(void)
 152          {
 153   1              unsigned char i,len;
 154   1      
 155   1              if( mVarSetupLength )   //长度不为0传输具体长度的数据
 156   1              {
 157   2                      if( mVarSetupLength<=8 )
 158   2                      {
 159   3                              len=mVarSetupLength;
 160   3                              mVarSetupLength=0;
 161   3                      } //长度小于8则传输要求的长度
 162   2                      else
 163   2                      {
 164   3                              len=8;
 165   3                              mVarSetupLength-=8;
 166   3                      } //长度大于8则传输8个,切总长度减8
 167   2                      CH375_WR_CMD_PORT( CMD_WR_USB_DATA3 );  //发出写端点0的命令
 168   2                      CH375_WR_DAT_PORT( len );                                                       //写入长度
 169   2                      for( i=0; i!=len; i++ )
 170   2                      {
 171   3                              CH375_WR_DAT_PORT( request.buffer[i] );  //循环写入数据
 172   3                      }  
 173   2                      if(debug) uartPrint("EP0_UP dat: %\n\r", request.buffer, len); 
 174   2              }
 175   1              else
 176   1              {
 177   2                      CH375_WR_CMD_PORT( CMD_WR_USB_DATA3 );                  //发出写端点0的命令
 178   2                      CH375_WR_DAT_PORT( 0 );                     //上传0长度数据,这是一个状态阶段
C51 COMPILER V7.06   CH375                                                                 04/07/2006 09:06:59 PAGE 4   

 179   2                      if(debug) uartPutStr("NO data left!\n\r");
 180   2              }
 181   1      }
 182          //-------------------------------------
 183          //函数名:       ep1Up
 184          //作用:         端点1上传数据, 把数
 185          //                      据写入缓冲区一般在调用它后, 
 186          //                      要把缓冲区释放
 187          //参数:         要发送的数据长度
 188          //-------------------------------------
 189          void ep1Up(uint8 len)
 190          {
 191   1              uint8 i;

⌨️ 快捷键说明

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