救火。。。。。。ch375对cp2101

endp6_mode EQU 0F8H endp7_mode EQU 0F9H

SEND_ADDR EQU 070H RECV_ADDR EQU 030H

TOGGLE_FLAG EQU 0FAH ;数据缓冲区,用于保存接收到的下传数据,长度为0到64字节 VENDOR_CNT EQU 0FBH ;获得VENDOR的执行次数 ;************************************************************************* ORG 0000H LJMP MAIN ; 主程序入口 ;*************************************************************************

;********************************************************* ; 主程序 ;**********************************************************

设备已经插入。。。。。。

获得设备的设备描述符。。。。。。

设置USB设备端的USB地址。。。。。。。

获得设备的配置描述符。。。。。。

SET_CONFIG设置USB设备。。。。。。

DATA_TRANS: NOP ;************************ 数据传输打开

MOV R0,#endp7_mode MOV @R0,#080H MOV R0,#endp6_mode MOV @R0,#080H

MOV R1,#TOGGLE_FLAG MOV @R1,#01H

;*******************************

SET_INTF: MOV DPTR,#SET_INTERFACE ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#00DH LCALL SEND_DATA ; 发送1字节数据 NOP

MOV R1,#TOGGLE_FLAG MOV @R1,#00H

CALL TOGGLE_RECV CALL TOGGLE_RECV MOV R6,#009H LCALL RECV_DATA ; 由设备读入64字节的数据

MOV DPTR,#CLT_STRUT3 ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#00DH LCALL SEND_DATA ; 发送1字节数据 NOP

MOV DPTR,#CLT_DATA1 ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#001H LCALL SEND_DATA ; 发送1字节数据 NOP

MOV DPTR,#CLT_DATA2 ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#001H LCALL SEND_DATA ; 发送1字节数据 NOP

CALL TOGGLE_RECV CALL TOGGLE_RECV MOV R6,#009H LCALL RECV_DATA ; 由设备读入64字节的数据

MOV DPTR,#CLT_STRUT4 ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#00DH LCALL SEND_DATA ; 发送1字节数据 NOP

CALL TOGGLE_RECV CALL TOGGLE_RECV MOV R6,#009H LCALL RECV_DATA ; 由设备读入64字节的数据

MOV DPTR,#CLT_STRUT9 ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#00DH LCALL SEND_DATA ; 发送1字节数据 NOP

MOV DPTR,#CLT_DATA3 ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#001H LCALL SEND_DATA ; 发送1字节数据 NOP

CALL TOGGLE_RECV CALL TOGGLE_RECV MOV R6,#009H LCALL RECV_DATA ; 由设备读入64字节的数据

GET_VENDOR: MOV R1,#VENDOR_CNT MOV @R1,#0BH

GET_VENDOR0: MOV R1,#VENDOR_CNT DEC @R1 MOV A,@R1 JNZ GET_VENDOR0

;******************************* GET: MOV R1,#TOGGLE_FLAG MOV @R1,#00H

CALL CLR_SEND_STALL CALL CLR_RECV_STALL MOV DPTR,#SOURCE_PRI ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#031H CALL TOGGLE_SEND LCALL SEND_DATA ; 发送1字节数据

MOV DPTR,#SOURCE_PRI ; 发送缓存地址 CLR A MOVC A,@A+DPTR MOV R7,A INC DPTR MOV R6,#031H ;CALL TOGGLE_SEND LCALL SEND_DATA ; 发送1字节数据

ISSUE_REQ_SUCCESS: CALL TOGGLE_RECV CALL TOGGLE_RECV MOV R6,#039H LCALL RECV_DATA ; 由设备读入64字节的数据 NOP

SUCCESS_READ: MOV R1,#TOGGLE_FLAG MOV @R1,#00H

JMP GET_VENDOR ; 可以再次继续发送数据或者接收数据

;********************************************************* ; 子程序

;*********向从设备发送数据子程序*********

SEND_DATA: MOV DATAIN_OUT,#CMD_WR_USB_DATA7 CALL WRITEADDRESS ; 向从设备发送数据 MOV DATAIN_OUT,R7 ; 发送1个字节,要多发可以循还设置 CALL WRITEDATA MOV A,R7 JZ WR_NONE MOV R4,A WR_A_BYTE: CLR A MOVC A,@A+DPTR MOV DATAIN_OUT,A CALL WRITEDATA INC DPTR NOP DJNZ R4,WR_A_BYTE NOP

MOV R1,#TOGGLE_FLAG MOV A,@R1 JZ ISSUE_TOKEN_OUT WR_NONE: CALL TOGGLE_SEND NOP ISSUE_TOKEN_OUT: MOV DATAIN_OUT,#CMD_ISSUE_TOKEN CALL WRITEADDRESS MOV DATAIN_OUT,R6 ; 高4位目的端点号, 低4位令牌PID: DEF_USB_PID_OUT CALL WRITEDATA JB CH375_INT_WIRE,$

USB转串口芯片没有USB规范,所以各家芯片采用各自定义的行为, 我认为,CP2101的83H端点平时是无数据可读的,除非你确定其串口已经收到数据,那么该端点才能被读出数据,否则一直等待(返回NAK引起CH375等待,可以ABORT-NAK取消)


CH375的CMD_ISSUE_TOKEN 向03口发送成功后,就应当表示CP2101成功接收了吧。它一旦收到就应一定有返回的。在电脑上测试成功。


请问,对于CH375来说,对端点0和端点2的控制方式一样吗? 都用下面这两个子程序可以吗?

*********向从设备发送数据子程序*********

SEND_DATA: MOV DATAIN_OUT,#CMD_WR_USB_DATA7 CALL WRITEADDRESS 向从设备发送数据 MOV DATAIN_OUT,R7 发送1个字节,要多发可以循还设置 CALL WRITEDATA MOV A,R7 JZ WR_NONE MOV R4,A WR_A_BYTE: CLR A MOVC A,@A+DPTR MOV DATAIN_OUT,A CALL WRITEDATA INC DPTR NOP DJNZ R4,WR_A_BYTE NOP

MOV R1,#TOGGLE_FLAG MOV A,@R1 JZ ISSUE_TOKEN_OUT WR_NONE: CALL TOGGLE_SEND NOP ISSUE_TOKEN_OUT: MOV DATAIN_OUT,#CMD_ISSUE_TOKEN CALL WRITEADDRESS MOV DATAIN_OUT,R6 高4位目的端点号, 低4位令牌PID: DEF_USB_PID_OUT CALL WRITEDATA JB CH375_INT_WIRE,$ 等待CH375操作完成 MOV DATAIN_OUT,#CMD_GET_STATUS CALL WRITEADDRESS 查询CH375中断并更新中断状态 NOP NOP 用于至少延时2uS MOV USBDATA,#0FFH CALL READDATA ; 返回操作状态 MOV A,DATAIN_OUT XRL A,#USB_INT_SUCCESS JZ ISSUE_OUT_SUCCESS 成功,可以继续进行数据传输了。 LCALL CLR_SEND_STALL JMP $ 不成功 ISSUE_OUT_SUCCESS: RET

*********由从设备读取数据子程序*********

RECV_DATA: MOV R1,#TOGGLE_FLAG MOV A,@R1 JZ ISSUE_TOKEN_IN CALL TOGGLE_RECV ISSUE_TOKEN_IN: MOV DATAIN_OUT,#CMD_ISSUE_TOKEN CALL WRITEADDRESS NOP MOV DATAIN_OUT,R6 高4位目的端点号, 低4位令牌PID: DEF_USB_PID_IN CALL WRITEDATA JB CH375_INT_WIRE,$ 等待CH375操作完成 MOV DATAIN_OUT,#CMD_GET_STATUS CALL WRITEADDRESS 查询CH375中断并更新中断状态 NOP NOP 用于至少延时2uS MOV USBDATA,#0FFH CALL READDATA ; 返回操作状态 MOV A,DATAIN_OUT XRL A,#USB_INT_SUCCESS JZ ISSUE_IN_SUCCESS 成功,可以继续进行数据传输了。 LCALL CLR_RECV_STALL JMP $ 不成功 ISSUE_IN_SUCCESS: NOP MOV DATAIN_OUT,#CMD_RD_USB_DATA CALL WRITEADDRESS 读取U盘中的64个字节 NOP MOV USBDATA,#0FFH CALL READDATA ; 返回 MOV R4,DATAIN_OUT MOV A,R4 JZ EXIT_RECV MOV R0,#RECV_ADDR 接收缓存地址 SAVE_RECV_CONTENT: MOV USBDATA,#0FFH CALL READDATA ; 返回 MOV @R0,DATAIN_OUT INC R0 DJNZ R4,SAVE_RECV_CONTENT NOP EXIT_RECV: RET


只有登录才能回复,可以选择微信账号登录