我参考了usb做host连接打印机的例子以及两片单片机相连的例子,我的另外一个单片机是cypress的cy7c68013a,host这边发送的数据,slave那边能接收到,因为我那边取了几个数据对比是正确的。现在问题是在host这边,我用超级终端调试的时候数据发送会死在一个地方,看下面的程序: for ( i=0; i<250; i+=64 ) host_send( 64, &data_to_send[i] ); /* 发送256字节的数据给设备端 */ 按道理这里应该是发送了4次数据,现在问题来了,我每一次调用host_send这个函数都打印信息,结果前面4次都正常地退出了,但第5次就停在 unsigned char wait_interrupt() { /* 主机端等待操作完成, 返回操作状态 */ printf("enter wait_interrupt!\n"); while( CH375_INT_WIRE ); /* 查询等待CH375操作完成中断(INT#低电平) */ CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ printf("leave wait_interrupt!\n"); return( CH375_RD_DAT_PORT() ); } 这里面的while循环了。 想问一下,如果我数据发送完了是不是要给个中断还是什么的呢?我上面为什么还会进行第5次传输呢?谢谢。
数据发送完成给一个中断,中断状态是0X14,表示数据传输完成。按照你的程序这么会有第5次传输。肯定你的软件有问题,建议你查下你的软件。
我就是按照link工程来改的,加上了枚举部分,结果跟踪,发现 for ( i=0; i<250; i+=64 ) host_send( 64, &data_to_send ); /* 发送256字节的数据给设备端 */ 前四次传输完了,第五次又从i=0开始,然后就停在这里面的那个等中断函数了,这个是怎么回事呢,另外我的超级终端里面的数据显示总是会多加上两位16进制62,比如,我打印的数据为40,他就显示4062,这个是怎么回事呢?
你i定义的什么类型的变量?打印显示四位是因为你的变量是short型,你可以在打印输出里定义位数%02X
i 是unsigned char的,没有超过吧。
另外我在host端数据完成以后发一次中断,slave端该如何操作呢,也要产生中断吧,这个先后次序是怎样的呢。
第5次的时候应该跳出for循环了在等待传输完成中断,主机端发送数据流程:主机端主动发送数据给设备端,如果设备端尚未取走前一次接收到的数据,则在主机端执行下一次ISSUE_TOKEN时一直等待,主机端不产生操作完成中断,直到设备端准备好接收下一次数据或者通讯错误。
是不是设备端每次收到数据都要产生中断,这个中断是硬件完成还是软件完成,我现在发送数据是进行了4次,在接收的时候就有问题,第1次接收就产生错误。我的功能是想发送256个byte数据,设备端在端点2接收,然后设备将这些数据传送到端点6,再由host读回,然后验证数据的正确性。主机端的代码: for ( i=0; i<250; i+=64 ) host_send( 64, &data_to_send[i],i ); /* 发送256字节的数据给设备端 */ host_send( 0, NULL ); /* 假定, 发送空数据给设备端就能通知设备端发送数据 */ printf("init success!\n");
for ( i=0; i<250; i+=len ) len=host_recv( &data_by_recv[i] ); /* 从设备端接收256字节的数据 */ 中间那句host_send( 0, NULL ); 是指发送空数据之后,设备接收后就开始发送数据给主机吗?
是的 设备每次收到数据都会产生中断,程序上会读取这个中断并作处理,接收产生错误你的意思是没等到接收中断吗?这样的话要么你发送的端点地址不对要么设备没有数据发过来