CH375设备模式只能收,不能发数据,为何??

用CH375的设备模式做数据传输时,只能收数据,不能发数据。程序如下: if(InterruptStatus==USB_INT_EP1_OUT || InterruptStatus==USB_INT_EP2_OUT){ LED=~LED; CH375_WR_CMD_PORT(CMD_RD_USB_DATA); length=CH375_RD_DAT_PORT(); c1=0; while(length--){ Content[c1++]=CH375_RD_DAT_PORT(); } _nop_(); CH375_WR_CMD_PORT(CMD_WR_USB_DATA5); CH375_WR_DAT_PORT(0x04); for(c1=0;c1<4;c1++){ CH375_WR_DAT_PORT(0xaf); }

_nop_(); } else if(InterruptStatus==USB_INT_EP1_IN || InterruptStatus==USB_INT_EP2_IN){ CH375_WR_CMD_PORT(CMD_UNLOCK_USB); } else{} }

运行的时候,用bus hound监视数据,usb check发消息。每次发送消息后,LED是变化的,并且用仿真器设断点也能观察到数据接收正确。但就是无法收到CH375发送的数据。 请问为什么??程序流程有错吗??

else if(InterruptStatus==USB_INT_EP1_IN || InterruptStatus==USB_INT_EP2_IN){ CH375_WR_CMD_PORT(CMD_UNLOCK_USB); //这里应该加上发送的程序!! } else{} } 你现在还没有写入程序呢!怎么能发送? 还有,至少要能够触发In的事件阿! 你是怎么触发的?


建议你看看沁恒的例子程序是如何作的!!

看懂了再编程!


发送程序在这里啊: CH375_WR_CMD_PORT(CMD_WR_USB_DATA5); CH375_WR_DAT_PORT(0x04); for(c1=0;c1<4;c1++){ CH375_WR_DAT_PORT(0xaf); } 手册上写的是,读操作后,CH375自动释放缓冲;然后就可以写数据了。


In 和OUT是怎么触发的?


你看看例子就会明白了!


不好意思,例子看了以后还是没懂。 在CH372EVT\PUB\MCU_IF\C\CH372FRM.C或者CH372EVT\PUB\TEST\MCU\TEST.C里都是这种结构的: 在中断响应程序中,如果是OUT中断,则从缓冲中读取数据,然后立刻将发送数据写入缓冲;如果是IN中断,则执行UNLOCK操作。 即使是使用FLAG_SEND_WAIT标志符的时候,也是在需要发送数据的时候先查询该标志是否为0,然后就直接发送;在IN中断时执行UNLOCK操作。 至于IN和OUT的触发,OUT当然是在主机端发送数据时触发;而对于中断型的端点,主机会以几毫秒的间隔查询设备,此时收到IN中断。但是我在用仿真器调试时,设置在IN中断里的断点从来没有被触发过。所以觉得很难理解。 麻烦继续给予解答,谢谢!!


一般是通过端点2上传,wr_usb_data7,而你是通过端点1上传的,所以上位机要配套用readinter或者中断


谢谢你的回答! 但是还是有疑问: 你的意思是不是指,在上位机(PC)中,需要使用375的DLL进行读数据操作,然后才会单片机才会收到IN中断? 而我的理解是:CH375内置固件模式下,端点1是中断方式,端点2是批量方式。 根据USB协议中,中断方式下主机端以几毫秒的周期自动发出IN令牌的。因此对于端点2,可能需要调用DLL的读函数,而对于端点1,则是不需要的。 我在调试的时候,都是用BUS HOUND发送和读取数据的,所以电脑端在接收数据时,不会发送IN令牌,是不是这个原因? 但是以前用过PHILIPS的D12和ISP1581,单片机主动发送消息配合BUS HOUND接收都是可行的,不需要调用DLL的。 谢谢!!!


是的!!


已经调试成功!谢谢“小小何”和“店小二”两位的帮助! 不过在我看来,程序和原来的没有什么变化,比较疑惑。


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