374枚举不成功!

1.首先,我在串口的开发板上修改后调试贵公司的374的Device的C语言例子程序,枚举可以成功,最后可在设备管理器中发现“外部接口-375/372” 2.参考例子,我用汇编实现,有时就只产生复位和挂起的中断,而没有传输中断,初始化都跟贵公司一样,汇编中我是这样写寄存器的: MOV DPTR,#CH374_IDX_PORT MOV A,#USB_REG MOV @DPTR,A

MOV DPTR,#CH374_DAT_PORT MOV A,#DATA MOV @DPTR,A 而C语言中在执行这些指令前后会有其他一些指令 是不是需要延时呢,可是在我加了延时后也不会有什么效果

是有些特殊寄存器需要加延时吗?

谢谢!

374不需要加延时的,汇编代码应该是这样写的: MOV DPTR,#CH374_IDX_PORT MOV A,#USB_REG MOVX @DPTR,A

MOV DPTR,#CH374_DAT_PORT MOV A,#DATA MOVX @DPTR,A


下面是将HAL_PARA.C中子程序改成汇编的程序,你可以参考:

;向索引端口写入索引地址 ( 索引地址在R5中) Write374Index: MOV DPTR,#CH374_IDX_PORT MOV A,R5 MOVX @DPTR,A RET

;向数据端口写入数据,索引地址自动加1 ( 数据在R5中) Write374Data : MOV DPTR,#CH374_DAT_PORT MOV A,R5 MOVX @DPTR,A RET

;从数据端口读出数据,索引地址自动加1( 数据在R5中) Read374Data: MOV DPTR,#CH374_DAT_PORT MOVX A,@DPTR MOV R5,A RET

;从指定寄存器读取数据(寄存器地址在R5中,返回数据在R6中) Read374Byte: LCALL Write374Index LCALL Read374Data MOV A,R5 MOV R6,A RET

;向指定寄存器写入数据(寄存器地址在R5中,要写入数据在R6中) Write374Byte: LCALL Write374Index MOV A,R6 MOV R5,A LCALL Write374Data RET

;从指定起始地址读出数据块(起始地址在R5中,读取长度在R7中, 读出的数据存储在R0指向的缓冲区中) Read374Block: LCALL Write374Index Read_next: LCALL Read374Data MOV A,R5 ; LCALL PRINTF MOV @R0,A INC R0 DJNZ R7,Read_next RET

;向指定起始地址写入数据块(起始地址在R5中,写入长度在R7中, 写入的数据存储在R0指向的缓冲区中) Write374Block: LCALL Write374Index Write_next: MOV A, @R0 MOV R5,A LCALL Write374Data INC R0 DJNZ R7,Write_next RET


谢谢! 我在程序中并没有写错MOVX 我的单片机很快的速度,也不需要延时吗? 我还想知道,总是复位和挂起是怎么回事呢?


只需要满足读写低电平脉冲在40NS,读选通或写选通脉冲的间隔宽度在120NS以上的话,那么就可以实现和374的通信,不需要加任何的延时。对于出现总线复位是可能计算机检测到有设备插上来,之后就会给总线复位,然后在检测设备连接,在发送获取设备描述符的控制传输,至于出现总线挂起是在计算机发送几次获取设备描述符的控制传输之后,设备没有响应,那么计算机就会停止发送SOF包,这个时候374芯片就会检测到总线的挂起


120NS应该很小了,单片机应该不会有那么快的速度,我测试过了 将贵公司的读写的基本函数用嵌入汇编实现,也能成功枚举。应该不是时间的问题了。 这是我的总线复位处理代码,完全是按贵公司CH374EVT.ZIP:\PUB\MCS51\LIB6\EXAM0例子程序由C改成的汇编: Reset374:

MOV DPTR,#CH374_CMD_PORT_ADDR ;写设备地址 MOV A,#REG_USB_ADDR MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOV A,#0x00 MOVX @DPTR,A

MOV DPTR,#CH374_CMD_PORT_ADDR ;写端点0 MOV A,#REG_USB_ENDP0 MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOV A,#0x0E MOVX @DPTR,A

MOV DPTR,#CH374_CMD_PORT_ADDR ;写端点1 MOV A,#REG_USB_ENDP1 MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOV A,#0x0E MOVX @DPTR,A

MOV DPTR,#CH374_CMD_PORT_ADDR ;写端点2 MOV A,#REG_USB_ENDP2 MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOV A,#0x02 MOVX @DPTR,A

MOV DPTR,#CH374_CMD_PORT_ADDR ;清中断 MOV A,#REG_INTER_FLAG MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOV A,#0x12 MOVX @DPTR,A

CLR EX5 JMP _Wait_i_ 不知是否有误? 谢谢!


这是初始化和查询部分,帮忙看下,谢谢了! 问题还是:只是复位和挂起,没有传输。 或者是下载调试几次,才有一次传输! CH374_Init: SETB EA CLR EX5 CLR PX5 SETB CH374_INT_WIRE ;清引脚 MOV UsbConfig,#0X00 ;USB配置标志

MOV DPTR,#CH374_CMD_PORT_ADDR ;启动USB设备 MOV A,#REG_USB_SETUP MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOV A,#0x00 MOVX @DPTR,A

MOV DPTR,#CH374_CMD_PORT_ADDR MOV A,#REG_USB_ADDR MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOV A,#0x00 MOVX @DPTR,A

MOV DPTR,#CH374_CMD_PORT_ADDR MOV A,#REG_USB_ENDP0 MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOV A,#0x0E MOVX @DPTR,A

MOV DPTR,#CH374_CMD_PORT_ADDR MOV A,#REG_USB_ENDP1 MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOV A,#0x0E MOVX @DPTR,A

MOV DPTR,#CH374_CMD_PORT_ADDR MOV A,#REG_USB_ENDP2 MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOV A,#0x02 MOVX @DPTR,A

MOV DPTR,#CH374_CMD_PORT_ADDR MOV A,#REG_INTER_FLAG MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOV A,#0x1F MOVX @DPTR,A

MOV DPTR,#CH374_CMD_PORT_ADDR MOV A,#REG_INTER_EN MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOV A,#0x07 MOVX @DPTR,A

MOV DPTR,#CH374_CMD_PORT_ADDR MOV A,#REG_SYS_CTRL ;对于CH374T或者UEN引脚悬空的CH374S必须BIT_CTRL_OE_POLAR为1 MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOV A,#0x00 MOVX @DPTR,A

MOV DPTR,#CH374_CMD_PORT_ADDR MOV A,#REG_USB_SETUP MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR ;启动USB设备 MOV A,#0x03 MOVX @DPTR,A

SETB EA

;查询 ;======================================================= _Wait_i_: ;读写入口 NOP JB CH374_INT_WIRE,_Wait_i_

;====================处理USB数据包====================== WD_Sub:

MOV DPTR,#CH374_CMD_PORT_ADDR ;由中断标志寄存器得到中断类型 MOV A,#REG_INTER_FLAG MOVX @DPTR,A MOV DPTR,#CH374_DAT_PORT_ADDR MOVX A,@DPTR JB ACC^1,JmpReset374 ;复位

JB ACC^0,JmpTranse374 ;传输

JB ACC^2,JmpSuspend374 ;挂起

JB ACC^3,JmpWakeUp374 ;唤醒


现在已经调到设置地址了,PC机向374发包,设置地址后,又开始读取18个字节的描述符,但是 读取这18个字节之后,就只产生了一次挂起中断,就没有继续读取配置符了,请问问题出在哪里?


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