现在的方案是: 单片机+ch376作为主机,与我们公司的仪器(USB设备)通讯。
问题: 1.ch376的同步码需要定义几个全局变量?是收发共用一个还是各自要定义一个?
我见ch375操作键盘的例程里用了两个,可是在出376的例程里是用了一个,通过一个结构_Device_Atti->_Device->tog;。
2.ch376的同步码的值是什么?0x80和0xC0 还是 0x80和0x00?初始值映射为多少?
先谢谢了!
现在的方案是: 单片机+ch376作为主机,与我们公司的仪器(USB设备)通讯。
问题: 1.ch376的同步码需要定义几个全局变量?是收发共用一个还是各自要定义一个?
我见ch375操作键盘的例程里用了两个,可是在出376的例程里是用了一个,通过一个结构_Device_Atti->_Device->tog;。
2.ch376的同步码的值是什么?0x80和0xC0 还是 0x80和0x00?初始值映射为多少?
先谢谢了!
你可以参考一下我们的CH376DS2.PDF (1)需要两个全局变量,收和发各用一组同步标志。CH376也是两组,只是操作鼠标键盘只用到收所以结构体之定义了一个tog。 (2)同步标志的位7为主机端点IN的同步触发位, 位6为主机端点OUT的同步触发位。即发的同步码是40,收的同步码80.
谢谢, 1.改成了发的同步码是和0x40异或,收的同步码是和0x80异或,收发都通了,这里有个问题,初始值应该设成多少? 我现在是初始值都为0x00.
2.现在手头有ch376,所以就用它先调试了。据说ch375也能实现上述功能,且价格便宜,所以后边做板子是还是想用ch375的。 问题:a。ch375可以用CMD_ISSUE_TKN_X这个命令吗?到时是不是还得改程序? b。ch376和ch375的价格分别大概是多少?
3.请教个调试问题: a。我不知道我的设备什么时候向主机发送数据,所以主机应该定时的向设备查询有没有数据,这种思路对吗? b。我现在用接收数据的函数unsigned char host_recv( unsigned char *buf ),查询,也就是从我们的设备接收数据,但是在设备没有发送数据的时候,程序走到这个函数的issue_token()中,一直等待中断,就是说在设备没有发送数据的情况下,执行函数issue_token()的里命令CMD2H_ISSUE_TKN_X,没有返回中断状态吗? 我理解,如果没有数据,也应该有返回中断状态,说是接收缓冲器为空啊,求讲解啊。
(1)初始值都为0 (2)CH375也有CMD_ISSUE_TKN_X这个命令,也能实现你的功能。 价格的话联系我们销售:025-52638377/388/389 (3)USB传输都是主机发起的,如果设备发数据,主机可以每隔一段时间来查询。 没有数据也会产生中断,只是中断状态不是成功的状态值。
那种情况下还是没有产生中断。
我是连续执行host_recv()5次,如果设备是只发送了2次数据,主机接收第3次的时候,执行CMD2H_ISSUE_TKN_X命令后就没有中断了。这个时候,拔掉USB设备,会产生中断,值为0x16。
请问:什么情况下,执行CMD2H_ISSUE_TKN_X命令不会产生中断???
我是这样证明的, 在发送完指令后,我让程序延时几秒种,这个时间内我用示波器观察中断引脚信号,没有看到低电平:
unsigned char issue_token(unsigned char * endptog, unsigned char endp_and_pid ) // 执行USB事务 { // 执行完成后, 将产生中断通知单片机, 如果是USB_INT_SUCCESS就说明操作成功 unsigned char status; kkk++; xWriteCH376Cmd( CMD2H_ISSUE_TKN_X);//CMD_ISSUE_TOKEN ); xWriteCH376Data( *endptog ); //// Delay_ms(2); xWriteCH376Data( endp_and_pid ); // 高4位目的端点号, 低4位令牌PID
if(kkk==3) { COM_DEBUG_SendStr("kkk == 3..."); ////停止1 Delay_ms(3000); COM_DEBUG_SendStr("kkk == 3 out"); ////停止2 }
do{ status = Query376Interrupt(); //等待CH375操作完成 }while(0 == status); ....... }
你这种情况是因为没有数据时你的设备一直给CH376发送NAK。这样CH376执行host_recv()会一直重试(不修改的话无限次)。你可以设置重试次数让CH376重试一定次数后结束,结束后接收会产生中断。