哈哈,前阵子画了板CH374的评估版,焊了块CH372做USB设备试验.<br />CH372在外置固件下枚举成U盘,C语言版本很早就搞定了.<br />网上遇一网友,说只会汇编,打赌说我无法搞出个汇编版的.<br />俺就不信这个邪,苦战半夜,终于搞定<br /><br />源程序如下:<br /><br />;古老牌U盘汇编版<br />;CH372+STC89C54单片机<br />;作者邮箱:xg_2004_sy@126.com<br /><br />$INCLUDE (CH375INC.ASM)<br /><br />STACK EQU 80H ;堆栈区栈顶(向上延伸)<br />;<br />; 需要主程序定义的参数<br />CH375_CMD_PORT EQU 0xB100 ;CH375命令口的地址,地址译码后自动片选<br />CH375_DAT_PORT EQU 0xB000 ;CH375命令口的地址,地址译码后自动片选<br />;<br /><br />CH375_CON_ACT BIT P1.2<br /><br />VAR_NeedTransBlockCount Data 30h<br />VAR_TransCompleteBlockCount Data 31H<br />VAR_MainRXDataPackCount Data 32h<br />VAR_ucTransFinishPageCount DATA 33H<br />VAR_ucNeedTransPageCount DATA 34<br /><br />VAR_ExtSRAMDataLocationPoint_L Data 35H<br />VAR_ExtSRAMDataLocationPoint_H Data 36H<br /><br />VAR_CSW_BYTE_4 DATA 37H<br />VAR_CSW_BYTE_5 DATA 38H<br />VAR_CSW_BYTE_6 DATA 39H<br />VAR_CSW_BYTE_7 DATA 3AH<br /><br />var_EP2_UP_STATUS DATA 3BH ;上传数据状态切换变量<br /><br /><br />CMD_BUFFER DATA 3FH ;命令包缓冲区,本程序约定命令包长度为CONST_CMD_LEN<br />CBW_Buffer DATA 10H ;cbW占用数据长度为12<br /><br />VAR_SETUP_REQUEST EQU 72H ;USB请求码<br />VAR_SETUP_LENGTH EQU 73H ;后续数据长度<br />VAR_SETUP_DESCR EQU 74H ;描述符偏移地址<br />VAR_SN_STRING EQU 75H ;产品序列号字符串缓冲区,ANSI字符串<br />VAR_USB_ADDRESS EQU 76H<br /><br />Reload_Count EQU 0F3H<br /><br />c_Char_0 EQU 30H<br />c_Char_1 EQU 31H<br />c_Char_2 EQU 32H<br />c_Char_3 EQU 33H<br />c_Char_4 EQU 34H<br />c_Char_5 EQU 35H<br />c_Char_6 EQU 36H<br />c_Char_7 EQU 37H<br />c_Char_8 EQU 38H<br />c_Char_9 EQU 39H<br /><br /><br /><br /><br /> <br />; 定义位标志<br />CH375_CON_FLAG BIT 2FH.0 ;375芯片配置完成标志<br />VAR_MainRXDataStatusMac Bit 2FH.1 ;主端点数据接收状态机标志<br />;<br />;****************************************************************************<br />;主程序<br /> ORG 0000H ;复位后单片机入口<br /> LJMP START<br /> ORG 0013H ;CH375中断<br /> LJMP CH375_INTER<br /><br />ORG 0100H<br />;---------------------------------------------------------------------------------<br /><br />Initial_UART:<br /> Mov SCON,#50h<br /> Mov TMOD,#21h<br /> Mov TH1,#Reload_Count<br /> Mov TL1,#Reload_Count<br /> ORL PCON,#80h<br /> SETB TR1 ;启动定时器<br /> Ret<br /><br />UART_Send_Char: ;通过串口发送字符,待发送的字符在ACC中<br /> CLR TI<br /> Mov SBUF,A<br /> Uart_Wait_Send_Finish:<br /> JNB TI,UART_Wait_Send_Finish<br /> CLR TI<br /> Ret<br />;---------------------------------------------------------------------------------<br />START:<br />; 以下初始化指令不是必要的,将单片机恢复为默认状态<br /> CLR EA ;关中断<br /> MOV SP,#STACK ;置堆栈初值<br /> MOV A,#0FFH<br /> MOV P0,A<br /> MOV P1,A ;清端口状态<br /> MOV P2,A<br /> MOV P3,A<br /> CLR A<br /> MOV IE,A ;清中断允许控制寄存器<br /> MOV IP,A ;清中断优先级控制寄存器<br /> MOV PSW,A ;清程序状态字<br /> MOV TCON,A ;清定时器/计数器控制寄存器<br /> MOV TMOD,A ;清定时器/计数器工作方式寄存器<br /> MOV PCON,A ;清电源控制寄存器<br /> MOV R7,#0FFH<br /> CALL DELAY_MS ;延时等待CH375初始化完成<br />; 初始化<br /> Call Initial_UART<br /> UART_SendTestChar:<br /> Mov a,#c_Char_0<br /> call UART_Send_Char<br /> Mov a,#0DH<br /> call UART_Send_Char<br /> Mov a,#0AH<br /> call UART_Send_Char<br /><br /> Mov a,#c_Char_8<br /> call UART_Send_Char<br /> Mov a,#0DH<br /> call UART_Send_Char<br /> Mov a,#0AH<br /> call UART_Send_Char<br /><br /> ; AJMP UART_SendTestChar<br /> MOV R6,#0;<br /> MOV R7,#0;<br /> MOV DPTR,#0<br /> ACALL READ_FLASH_SECTOR<br /><br /> MOV DPTR,#0<br /> MOV R4,#4<br /> TEST_SEND_FLASHSECTOR_PAGE_LOOP:<br /> MOV R5,#128<br /> TEST_SEND_FLASHSECTOR_BYTE_LOOP:<br /> MOVX A,@DPTR<br /> call UART_Send_Char<br /> INC DPTR<br /> DJNZ R5,TEST_SEND_FLASHSECTOR_BYTE_LOOP<br /> DJNZ R4,TEST_SEND_FLASHSECTOR_PAGE_LOOP<br /><br /> CALL CH375_DisConnect ;配置为断开USB连接的状态<br /> CALL CH375_INIT ;初始化<br /> call Init_EP2_FUNC_VAlRegister<br /> setb EA<br /> ljmp $ ;主程序<br />;<br /><br />;-------------------------------------------------------------------<br />;------ STC MCU Flash PGM --------------------------------<br />ISP_DATA DATA 0E2H<br />ISP_ADDRH DATA 0E3H<br />ISP_ADDRL DATA 0E4H<br />ISP_CMD DATA 0E5H<br />ISP_TRIG DATA 0E6H<br />ISP_CONTR DATA 0E7H<br />;定义Flash操作等待时间性<br />ENABLE_ISP EQU 80H<br /><br />MCU_FLASH_START_ADDRESS_HIGH EQU 80H<br /><br />;读一字节<br />;调用前需打开IAP功能<br />;入口:DPTR = 字节地址<br />;返回:A = 读出字节<br />MCU_FLASH_READ_BYTE:<br /> MOV ISP_CONTR,#ENABLE_ISP<br /> MOV ISP_CMD,#01<br /> MOV ISP_ADDRH,DPH<br /> MOV ISP_ADDRL,DPL<br /> CLR EA<br /> MOV ISP_TRIG,#46H<br /> MOV ISP_TRIG,#0B9H<br /> NOP<br /> MOV A,ISP_DATA<br /> SETB EA<br /> ;Now in processing(CPU will hart here before completing)<br />; ACALL IAP_Disable<br /> RET<br /><br />;字节编程<br />;调用前需打开IAP功能<br />;入口:DPTR = 字节地址,A= 须编程字节的数据<br />MCU_FLASH_WRITE_BYTE:<br /> MOV ISP_CONTR,#ENABLE_ISP<br /> MOV ISP_CMD,#02<br /> MOV ISP_ADDRH,DPH<br /> MOV ISP_ADDRL,DPL<br /> MOV ISP_DATA,A<br /> CLR EA<br /> MOV ISP_TRIG,#46H<br /> MOV ISP_TRIG,#0B9H<br /> NOP<br /> SETB EA<br /> ;Now in processing(CPU will hart here before completing)<br /> ACALL IAP_Disable<br /> RET<br /> <br />;擦除扇区<br />;入口:DPTR = 扇区地址<br />MCU_FLASH_ERASE_SECTOR:<br /> MOV ISP_CONTR,#ENABLE_ISP<br /> MOV ISP_CMD,#03<br /> MOV ISP_ADDRH,DPH<br /> MOV ISP_ADDRL,DPL<br /> CLR EA<br /> MOV ISP_TRIG,#46H<br /> MOV ISP_TRIG,#0B9H<br /> NOP<br /> SETB EA<br /> ;Now in processing(CPU will hart here before completing)<br />; ACALL IAP_Disable<br /> RET<br />IAP_Disable:<br /> MOV ISP_CONTR,#0<br /> MOV ISP_CMD,#0<br /> MOV ISP_TRIG,#0<br /> RET<br /><br /><br />;写数据到扇区<br />;入口地址 (R6R7)扇区号<br />;DPTR指向数据缓冲区,数据长度恒定为512字节<br />WRITE_FLASH_SECTOR:<br /> PUSH DPH ;数据缓冲区指针入栈保护<br /> PUSH DPL<br /><br /> MOV A,R7<br /> ADD A,0E0H ;A =A*2<br /> ADD A,#MCU_FLASH_START_ADDRESS_HIGH<br /> MOV R6,A<br /> MOV R7,#00 ;完成起始地址的计算 数据在R6,R7中<br /><br /> MOV DPH,R6<br /> MOV DPL,R7<br /> ACALL MCU_FLASH_ERASE_SECTOR<br /><br /> MOV R3,#4<br /> WRITE_SECTOR_LOOP_WRITE_PAGE:<br /> MOV R4,#128;<br /> WRITE_SECTOR_LOOP_Write_Byte:<br /> POP DPL<br /> POP DPH<br /> MOVX A,@DPTR;<br /> INC DPTR<br /> PUSH DPH<br /> PUSH DPL<br /><br /> MOV DPH,R6<br /> MOV DPL,R7<br /> ACALL MCU_FLASH_WRITE_BYTE<br /> INC DPTR<br /> MOV R7,DPL<br /> MOV R6,DPH<br /><br /> DJNZ R4,WRITE_SECTOR_LOOP_Write_Byte<br /> DJNZ R3,WRITE_SECTOR_LOOP_Write_Page<br /><br /> POP DPL<br /> POP DPH<br /> <br /> RET<br /><br /> <br />;从扇区读数据到缓冲区<br />;入口地址 (R6R7)扇区号<br />;DPTR指向数据缓冲区,数据长度恒定为512字节<br />READ_FLASH_SECTOR:<br /> PUSH DPH ;数据缓冲区指针入栈保护<br /> PUSH DPL<br /><br /> MOV A,R7<br /> ADD A,0E0H ;A =A*2<br /> ADD A,#MCU_FLASH_START_ADDRESS_HIGH<br /> MOV R6,A<br /> MOV R7,#00 ;完成起始地址的计算 数据在R6,R7中<br /><br /> MOV DPH,R6<br /> MOV DPL,R7<br /><br /> MOV R3,#4<br /> READ_SECTOR_LOOP_READ_PAGE:<br /> MOV R4,#128;<br /> READ_SECTOR_LOOP_READ_Byte:<br /> MOV DPH,R6<br /> MOV DPL,R7<br /> LCALL MCU_FLASH_READ_BYTE<br /> INC DPTR<br /> MOV R7,DPL<br /> MOV R6,DPH<br /><br /><br /> POP DPL<br /> POP DPH<br /> MOVX @DPTR,A;<br /> INC DPTR<br /> PUSH DPH<br /> PUSH DPL<br /><br /> DJNZ R4,READ_SECTOR_LOOP_READ_Byte<br /> DJNZ R3,READ_SECTOR_LOOP_READ_PAGE<br /><br /> POP DPL<br /> POP DPH<br /> <br /> RET<br /><br />;------------------Flash PGM END----------------------------------------<br /><br /><br /><br />; 输出命令码给CH375<br />; 输入: ACC 为命令码<br />; 输出: DPTR 为数据口<br />; USE: ACC, DPTR<br />WR_CMD_TO_375: <br /> MOV DPTR,#CH375_CMD_PORT ;命令口地址<br /> MOVX @DPTR,A ;设置USB工作模式<br /> NOP ;如果时钟频率低于20MHz则无需该指令延时,高于30MHz要多加2条指令<br /> MOV DPTR,#CH375_DAT_PORT ;数据口地址<br /> RET<br />;<br />; 初始化子程序<br />; USE: ACC, R7, DPTR<br />CH375_INIT: <br /> MOV A,#CMD_SET_USB_MODE ;设置USB工作模式<br /> CALL WR_CMD_TO_375 ;输出命令码<br />; MOV A,#02H ;设置为内置固件模式<br /> MOV A,#01H ;设置为外置固件模式<br /> MOVX @DPTR,A ;设置为使用内置固件的USB设备方式<br /> NOP ;如果时钟频率低于16MHz则无需该指令延时<br /> NOP<br />CH375_INIT_WT: <br /> MOVX A,@DPTR ;返回操作状态,也可以等待20uS<br /> XRL A,#CMD_RET_SUCCESS<br /> JNZ CH375_INIT_WT ;等待操作成功,通常需要等待10uS-20uS<br />; 下述三条指令用于启用中断<br /> CLR IT1 ;置外部信号为低电平触发<br /> SETB PX1 ;置高优先级<br /> CLR IE1 ;清中断标志<br /> SETB EX1 ;允许CH375中断<br /> RET<br />;**************************************************************************************<br />CH375_DisConnect:<br /> MOV A,#CMD_SET_USB_MODE ;设置USB工作模式<br /> CALL WR_CMD_TO_375 ;输出命令码<br /> MOV A,#00H ;设置为未配置模式<br /> MOVX @DPTR,A ;设置为使用内置固件的USB设备方式<br /> NOP ;如果时钟频率低于16MHz则无需该指令延时<br /> NOP<br />CH375_DisConnect_WT: <br /> MOVX A,@DPTR ;返回操作状态,也可以等待20uS<br /> XRL A,#CMD_RET_SUCCESS<br /> JNZ CH375_DisConnect_WT ;等待操作成功,通常需要等待10uS-20uS<br />; 下述三条指令用于启用中断<br /> CLR IT1 ;置外部信号为低电平触发<br /> SETB PX1 ;置高优先级<br /> CLR IE1 ;清中断标志<br /> SETB EX1 ;允许CH375中断<br /> RET<br /><br />;写代码定间的数据到EP2的端点<br />;数据长度在R4中,数据缓冲区指针在DPTR中,采用MOVC取数<br />CH375_EP2_WRITE_CODEDATA:<br /> MOV R6,DPL<br /> MOV R7,DPH ; SAVE DATA POINT<br /><br /> MOV A,#CMD_WR_USB_DATA7 ;发出写上传端点命令<br /> CALL WR_CMD_TO_375<br /> MOV A,R4<br /> MOVX @DPTR,A ;写数据长度<br /><br /> JZ CH375_EP2_WRITE_CODE_FINISH ;长度为0<br /><br /> EP2_WRITE_CODE_LOOP1:<br /> MOV DPL,R6 ;Get Data Point from backup DPTR Image<br /> MOV DPH,R7<br /><br /> CLR A<br /> MOVC A,@A+DPTR<br /><br /> INC DPTR<br /> MOV R6,DPL<br /> MOV R7,DPH ; SAVE DATA POINT<br /> <br /> MOV DPTR,#CH375_DAT_PORT<br /> MOVX @DPTR,A<br /> DJNZ R4,EP2_WRITE_CODE_LOOP1<br /> CH375_EP2_WRITE_CODE_FINISH: <br /> <br /> RET<br /> ;---------------------------------------------------------------------------------------<br />;写数据空间的内容到CH372的EP端点<br />;数据长度在R4中,数据缓冲区指针在DPTR中,采用MOVX取数<br /><br />CH375_EP2_WRITE_XDATA:<br /> MOV R6,DPL<br /> MOV R7,DPH ; SAVE DATA POINT<br /><br /> MOV A,#CMD_WR_USB_DATA7 ;发出写上传端点命令<br /> CALL WR_CMD_TO_375<br /> MOV A,R4<br /> MOVX @DPTR,A ;写数据长度<br /><br /> JZ CH375_EP2_WRITE_CODE_FINISH ;长度为0<br /><br /> EP2_WRITE_XDATA_LOOP1:<br /> MOV DPL,R6 ;Get Data Point from backup DPTR Image<br /> MOV DPH,R7<br /><br /> MOVX A,@DPTR<br /><br /> INC DPTR<br /> MOV R6,DPL<br /> MOV R7,DPH ; SAVE DATA POINT<br /> <br /> MOV DPTR,#CH375_DAT_PORT<br /> MOVX @DPTR,A<br /> DJNZ R4,EP2_WRITE_XDATA_LOOP1<br /> CH375_EP2_WRITE_XDATA_FINISH: <br /> <br /> RET<br /><br /><br /><br />;----------------------------------------------------------------------------------------<br /><br /><br />c_EP2_UPSTATUS_TRANSMIT_IDLE EQU 00H<br />c_EP2_UPSTATUS_TRANSMIT_CSW EQU 01H<br />c_EP2_UPSTATUS_TRANSMIT_STANDPAGE EQU 02H<br />c_EP2_UPSTATUS_TRANSMIT_SHORTPAGE EQU 03H<br /><br /><br /><br /><br />;CMD_INQUIRY_FUNCTION<br />FUNC_SCSI_CMD10_INQUIRY:<br /> MOV DPTR,#USB_InquiryData_TAB<br /> MOV R4,#36<br /> CALL CH375_EP2_WRITE_CODEDATA<br /> MOV var_EP2_UP_STATUS,#c_EP2_UPSTATUS_TRANSMIT_CSW ;发送完数据发状态<br /> RET<br />;CMD_READ_CAPACITY<br /><br />FUNC_SCSI_CMD25_READ_CAPACITY:<br /> MOV DPTR,#USB_UDISK_Capacity<br /> MOV R4,#8<br /> CALL CH375_EP2_WRITE_CODEDATA<br /> MOV var_EP2_UP_STATUS,#c_EP2_UPSTATUS_TRANSMIT_CSW ;发送完数据发状态<br /> RET<br />;CMD_READ_FORMAT_CAPACITIES <br />FUNC_SCSI_CMD23_READ_FORMAT_CAPACITYIES:<br /> MOV DPTR,#USB_UDISK_FORMAT_Capaities<br /> MOV R4,#20<br /> CALL CH375_EP2_WRITE_CODEDATA<br /> MOV var_EP2_UP_STATUS,#c_EP2_UPSTATUS_TRANSMIT_CSW ;发送完数据发状态<br /> RET<br /><br />;MCD00_TEST_UNITE_READY<br />FUNC_SCSI_CMD00_TEST_UNITE_READY:<br /> ACALL TransitCSW<br /> RET<br />;CMD_MODE_SENSE<br />FUNC_SCSI_CMD1A_MODE_SENSE:<br /> MOV A,CBW_Buffer+2 ;CBW[2] Value send to ACC<br /> CJNE A,#1CH,MODE_SENSE_NEXT1<br /> MOV DPTR,#USB_UDISK_MODE_SENSE_TPP<br /> MOV R4,#18<br /> CALL CH375_EP2_WRITE_CODEDATA<br /><br /> AJMP MODE_SENSE_END<br /> MODE_SENSE_NEXT1: <br /> CJNE A,#3FH,MODE_SENSE_NEXT2<br /> MOV DPTR,#USB_UDISK_MODE_SENSE_ALL<br /> MOV R4,#12<br /> CALL CH375_EP2_WRITE_CODEDATA<br /> <br /> AJMP MODE_SENSE_END<br /> MODE_SENSE_NEXT2:<br /> MOV DPTR,#USB_UDISK_MODE_SENSE_ZERO<br /> MOV R4,#8<br /> CALL CH375_EP2_WRITE_CODEDATA<br /><br /> AJMP MODE_SENSE_END<br /> <br /> MODE_SENSE_END: <br /> MOV var_EP2_UP_STATUS,#c_EP2_UPSTATUS_TRANSMIT_CSW ;发送完数据发状态<br /> RET<br /> <br />;CMD28_READ10 <br />FUNC_SCSI_CMD28_READ10:<br /> MOV A, CBW_Buffer+8<br /> JNZ CMD28_Need_Trans_Data_Package<br /> ACALL TransitCSW<br /> AJMP CMD28_READ10_END<br /> CMD28_Need_Trans_Data_Package:<br /> MOV VAR_NeedTransBlockCount,A<br /> MOV VAR_TransCompleteBlockCount,#0<br /> MOV R7, CBW_Buffer+5<br /> MOV R6, CBW_Buffer+4<br /> MOV VAR_ucTransFinishPageCount,#0<br /> MOV VAR_ucNeedTransPageCount,#8<br /> MOV DPTR,#0<br /> ACALL READ_FLASH_SECTOR<br /> MOV var_EP2_UP_STATUS,#c_EP2_UPSTATUS_TRANSMIT_STANDPAGE ;发送完数据发状态<br /> MOV DPTR,#0<br /> MOV R4,#64<br /> CALL CH375_EP2_WRITE_XDATA<br /> INC VAR_ucTransFinishPageCount<br /> CMD28_READ10_END: <br /> RET<br /><br />;CMD2A_WRITE10:<br />FUNC_SCSI_CMD2A_WRITE10:<br /> SETB VAR_MainRXDataStatusMac<br /><br /> MOV A, CBW_Buffer+8<br /> MOV VAR_NeedTransBlockCount,A<br /><br /> MOV VAR_MainRXDataPackCount,#0<br /> MOV VAR_TransCompleteBlockCount,#0<br /> <br /> JNZ CMD2A_WRITE10_FINISH<br /> CLR VAR_MainRXDataStatusMac<br /> CMD2A_WRITE10_FINISH:<br /> RET<br />;---------------------------------------------------------------------------------------------<br />CMD12_INQUIRY EQU 12H<br />CMD1A_MODE_SENSE EQU 1AH<br />CMD28_READ10 EQU 28H<br />CMD25_READ_CAPACITY EQU 25H<br />CMD23_READ_FORMAT_CAPACITIES EQU 23H<br />CMD00_TEST_UNIT_READY EQU 00H<br />CMD2F_VERIRY EQU 2FH<br />CMD2A_WRITE10 EQU 2AH<br />CMD1E_MEDIUM_REMOVAL EQU 1EH<br /><br />;对EP2接收到的CBW进行解析和处理<br />;R4为数据长度<br />;数据内容在公共缓冲区中<br />EP2CMDProcess:<br /> MOV R0,#CMD_BUFFER+4 ;拷贝CSW内容<br /> MOV A,@R0<br /> MOV VAR_CSW_BYTE_4,A<br /> iNC R0<br /> MOV A,@R0<br /> MOV VAR_CSW_BYTE_5,A<br /> iNC R0<br /> MOV A,@R0<br /> MOV VAR_CSW_BYTE_6,A<br /> iNC R0<br /> MOV A,@R0<br /> MOV VAR_CSW_BYTE_7,A<br /><br /> MOv R4,#12<br /> MOV R0,#CMD_BUFFER+15 ;拷贝UFI内容<br /> MOV R1,#CBW_Buffer<br /> COPY_CBW_LOOP_1:<br /> MOV A,@R0<br /> MOV @R1,A<br /> INC R0<br /> INC R1<br /> DJNZ R4,COPY_CBW_LOOP_1<br /> <br /> Mov a,#c_Char_1<br /> call UART_Send_Char<br /> Mov a,#c_Char_1<br /> call UART_Send_Char<br /> MOV A,CBW_Buffer<br /> call UART_Send_Char<br /><br /> Mov a,#0DH<br /> call UART_Send_Char<br /> Mov a,#0AH<br /> call UART_Send_Char<br /><br /> MOV A,CBW_Buffer<br /><br /> CJNE A,#CMD12_INQUIRY,NO_CMD10_SEGMENT<br /> CALL FUNC_SCSI_CMD10_INQUIRY<br /> AJMP EP2_CMD_END<br /> NO_CMD10_SEGMENT: CJNE A,#CMD25_READ_CAPACITY,NO_CMD25_SEGMENT<br /> CALL FUNC_SCSI_CMD25_READ_CAPACITY<br /> AJMP EP2_CMD_END<br /> NO_CMD25_SEGMENT: CJNE A,#CMD23_READ_FORMAT_CAPACITIES,NO_CMD23_SEGMENT<br /> CALL FUNC_SCSI_CMD23_READ_FORMAT_CAPACITYIES<br /> AJMP EP2_CMD_END<br /> NO_CMD23_SEGMENT: CJNE A,#CMD1A_MODE_SENSE,NO_CMD1A_SEGMENT<br /> CALL FUNC_SCSI_CMD1A_MODE_SENSE<br /> AJMP EP2_CMD_END<br /> NO_CMD1A_SEGMENT: CJNE A,#CMD28_READ10,NO_CMD28_READ10<br /> CALL FUNC_SCSI_CMD28_READ10<br /> AJMP EP2_CMD_END<br /> NO_CMD28_READ10: CJNE A,#CMD00_TEST_UNIT_READY,NO_CMD00_TESTUNITREADY<br /> CALL FUNC_SCSI_CMD00_TEST_UNITE_READY<br /> AJMP EP2_CMD_END<br /> NO_CMD00_TESTUNITREADY: CJNE A,#CMD2A_WRITE10,NO_CMD2A_WRITE10<br /> CALL FUNC_SCSI_CMD2A_WRITE10<br /> AJMP EP2_CMD_END<br /> NO_CMD2A_WRITE10:<br /> EP2_CMD_END: <br /> RET <br /><br />; Mov a,#c_Char_1<br />; call UART_Send_Char<br />; Mov a,#c_Char_0<br />; call UART_Send_Char<br />; Mov a,#0DH<br />; call UART_Send_Char<br />; Mov a,#0AH<br />; call UART_Send_Char<br />; <br />; Ret<br /><br />DataFlash_WriteSector:<br />; Mov a,#c_Char_1<br />; call UART_Send_Char<br />; Mov a,#c_Char_1<br />; call UART_Send_Char<br />; Mov a,#0DH<br />; call UART_Send_Char<br />; Mov a,#0AH<br />; call UART_Send_Char<br /> MOV R7, CBW_Buffer+5<br /> MOV R6, CBW_Buffer+4<br /><br /> MOV A,R7<br /> ADD A,VAR_TransCompleteBlockCount<br /> MOV R7,A<br /><br /> CLR A<br /> ADDC A,R6<br /> MOV R6,A<br /><br /> MOV DPTR,#0<br /> ACALL WRITE_FLASH_SECTOR<br /> <br /> Ret<br /><br />;-------------------------------------------------------------------------------------------------<br />TransitCSW:<br />; Mov a,#c_Char_1<br />; call UART_Send_Char<br />; Mov a,#c_Char_2<br />; call UART_Send_Char<br />; Mov a,#0DH<br />; call UART_Send_Char<br />; Mov a,#0AH<br />; call UART_Send_Char<br />; MOV R6,DPL<br />; MOV R7,DPH ; SAVE DATA POINT<br /><br /> MOV A,#CMD_WR_USB_DATA7 ;发出写上传端点命令<br /> CALL WR_CMD_TO_375<br /> MOV A,#13<br /> MOVX @DPTR,A ;写数据长度<br /><br /> MOV A,#0x55<br /> MOVX @DPTR,A ;写数据长度<br /> MOV A,#0x53<br /> MOVX @DPTR,A ;写数据长度<br /> MOV A,#0x42<br /> MOVX @DPTR,A ;写数据长度<br /> MOV A,#0x53<br /> MOVX @DPTR,A ;写数据长度<br /> <br /> MOV A,VAR_CSW_BYTE_4<br /> MOVX @DPTR,A<br /> MOV A,VAR_CSW_BYTE_5<br /> MOVX @DPTR,A<br /> MOV A,VAR_CSW_BYTE_6<br /> MOVX @DPTR,A<br /> |
|