用CH375V做host能正常读写U盘,但接MP3或USB软驱无反应连接中断也没有,灯也不亮, 从上电到等待连接只进行过375初始化即设模式6且成功,理论上接上MP3即有中断且灯亮可现在没有,且D+与D-都为0V,设备端已测到有电压,请问CH375V是3.3V的与这个有关吗,还是375不能兼容别的USB接口,或是模式设得不对应怎样设置,在线等待谢谢!!
原因可能如下: Mp3或USB软驱耗电过大,USB口供电足,Mp3或软驱没能正常工作,设备端上拉电阻没能启用,因此375V无法检测到设备。USB口电最好大于4.7V
老大多谢了,就是CH375V是3.3V电压不够的原因,原来说375周围都必须3.3V,就一直没敢接5V,这次冒着375生命的危险接了5V到MP3现在能跑了,多谢SCM
请问SCM,刚你说好多USB软驱是CBI传输,能给点灵感吗,怎样把375传成CBI传输,
具体实例没有,只是看过一点协议。 如果你的软驱支持BulkOnly协议,那么CH375+子程序库就可实现操作软驱 如果你的软驱支持CBI协议,那么你得自己写固件程序。 CH375芯片内置BulkOnly协议固件,但没有CBI协议固件。 建议你先了解USB大容量存储类设备的传输协议。
CH375芯片内置BulkOnly协议固件,如果写CBI协议固件能在375上运行吗,或是得换别的芯片,现在USB软驱连描述符也读不出来就在那死等中断了,按这样说法它就真的是跑CBI协议了,回头这协议我会了解的,就是想知道375能不能接受CBI协议来读写,现项目的目的是读写USB软驱而不是U盘或MP3
CH375是USB通用接口芯片,与你用什么协议无关,可以实现你的要求。 读取描述符的过程还没涉及具体的传输协议,只与控制传输有关,没能读到描述符,可能是硬件或软件还有一些问题,CH375DS2.PDF中有参考流程。 至于USB软驱的具体协议,你可以用一个PC机软件bushound去抓一下它的描述符,其中接口描述符中的传输协议代码决定了传输协议类型,0x50表示BulkOnly,0x00与0x01表示CBI
我读USB软驱又出现问题了,下面是读取它的设备描述符,可是它本身定义的数据包大小只有8个字节,当再读后面的数据时就没有反应了,读得前8个数据为:12 01 00 02 00 00 00 08,帮我分析下就是DATA0与DATA1是怎样处理交换的,还有用CH375_WR_CMD_PORT( CMD_GET_DESCR ); /* 控制传输-获取描述符 */这个命令读取USB软驱没有反应(U盘和MP3能正常读取),所以就用了下面这个读描述符, Request.Req.bmRequestType=0x80;//获取设备描述符 Request.Req.bRequest=0x06; Request.Req.wValue=0x0001; Request.Req.wIndex=0x0000; Request.Req.wLength=0x1200;
unsigned char get_descr_ex() { unsigned char descr_len,i; unsigned char *p=buffer; unsigned char descr_cou_temp=0; endp7_mode=0x80; toggle_send(); wr_usb_data(8,Request.Req_buf); issue_token(( 0 << 4 ) | DEF_USB_PID_SETUP); status=mWaitInterrupt(); if(status==USB_INT_SUCCESS)/* SETUP阶段操作成功 */ { endp6_mode=0xc0; toggle_recv(); } else return(0); issue_token(( 0 << 4 ) | DEF_USB_PID_IN); status=mWaitInterrupt(); if(status==USB_INT_SUCCESS)/* DATA阶段操作成功 */ { descr_len=mReadCH375Data(buffer);//到这步得到前8个描述符 descr_cou+=8; descr_len=Request.Req_buf[6]-0x08;/*剩余描述符长度计算*/ while(descr_len>0) { toggle_recv(); p+=0x08; issue_token(( 0 << 4 ) | DEF_USB_PID_IN);//继续读剩下的描述符 status=mWaitInterrupt();//程序执行上步后就没有再收到中断,而就一直停在这里 if(status==USB_INT_SUCCESS) /* DATA阶段操作成功 */ { descr_cou_temp=mReadCH375Data(p); if(descr_cou_temp!=0x08){descr_cou+=descr_cou_temp;break;} else {descr_len-=0x08;descr_cou+=8;} } else return(0); } } else return(0); endp7_mode=0xc0; toggle_send(); wr_usb_data(0,Request.Req_buf); issue_token(( 0 << 4 ) | DEF_USB_PID_OUT); status=mWaitInterrupt(); if(status==USB_INT_SUCCESS)/* 状态阶段操作成功 */ return(1); else return(0); }
你第二次读取描述符时,没有切换接收同步标志。
while(descr_len>0) { // 此处应先切换同步标志,才能执行IN事务
toggle_recv(); p+=0x08; issue_token(( 0 << 4 ) | DEF_USB_PID_IN);//继续读剩下的描述符
应该切换了吧,下面函数: void toggle_recv() { /* 主机接收成功后,切换DATA0和DATA1实现数据同步 */ CH375_WR_CMD_PORT( CMD_SET_ENDP6 ); CH375_WR_DAT_PORT( endp6_mode ); endp6_mode^=0x40;//这个是切换同步标志 delay2us(); }
void toggle_send() { /* 主机发送成功后,切换DATA0和DATA1实现数据同步 */ CH375_WR_CMD_PORT( CMD_SET_ENDP7 ); CH375_WR_DAT_PORT( endp7_mode ); endp7_mode^=0x40;//这个是切换同步标志 delay2us(); }
是不是不管BULK ONLY还是CBI协议,在读取描述符时都是一样的,我看了CBI与BULKONLY的英文协议可还是不太明白怎能么用,感觉就算是BULKONLY的模式也和你们给的程序编写模式不一样,是不是CH375内置的原因而隐了好多该有的东西
实际你在获取设备描述符和配置描述符的时候,完全不需要用外置固件来写,可以直接发送获取描述符的命令来读取描述符。
是不是说控制传输那几个标准请求不管BULKONLY或CBI用你们的简化命令都是能跑的,而CH375DS1.PDF上的命令只有BULKONLY上能跑,是这样吗? 写CBI的读写函数好困难呀,现在也没有想明白USB怎么运行的,虽然程序是跑起来了,可内在的这些东西好像都在你们手上拿着一样,能不能再帮个忙弄一小段CBI协议的外置固件,只一小个举例函数也行,理论是看了不少可真写还弄不出来
如果你想看CBI或者UFI的例子的话,你可以去下载CH374LIB。ZIP,里面有一个EXAM的文件夹下面例子程序