请问有没有基于DSP的375+372或其它芯片的主机端例程?

你们提供的是基于51的主机端例程,请问有没有基于DSP的? 或者有哪位高手做过这个吗?

372或者375做设备的时候,只有51的例子程序,C语言是可以移植的,你只要在51例子程序的基础上修改就可以了,如果是DSP+375操作U盘的话,我们有例子程序。


我用的DSP芯片是TI的TMS3205416,我问了DSP的技术人员,他们说把51的程序移植到DSP上有些细节挺麻烦的。 你们能把DSP+375操作U盘的例子程序发给我一份吗,我参照这个看看能不能把51的主机端例程移植到DSP下,我的邮箱是个人信息保护,已隐藏,谢谢


你可以下载CH375LIB。ZIP的压缩包,里面有DSP的例子程序以及DSP的库文件


我把例子中的ch375hfe.h,ch375hft.c,ch375hfe.lib 加到我的DSP工程中,编译出错呀,请问这是怎么回事呢,出错信息如下: "c:\ti\c5400\cgtools\bin\cl500" -@"Debug.lkf" TMS320C54x COFF Linker Version 3.70 Copyright (c) 1996-2001 Texas Instruments Incorporated >> error: library c:\ti\myprojects\usbhostdsp375\CH375HFE.LIB, member CH375HFE.OBJ is of unknown type

还有几个问题,烦请指教,谢谢: 1、如果我只在在DSP中通过375作主机连接另一个非372的单片机,是不是不需要用你们提供的库文件ch375hfe.lib 呢? 2、我看375做主机连接372的例程中,当设备端是372时,就不用枚举了,那么是不是当我清楚地知道某个非372的设备端的输入输出端口号时,也就不需要枚举过程了呢,我不太明白,如果不用set_addr命令设置地址的话,双方怎么知道使用哪个地址呢,是不是不指定就会使用一个相同的默认地址呢? 3、set_usb_mode(5)和set_usb_mode(6)有多大区别,为什么当设备端是372时,这两个都可以,那么我怎么判断一个非372的设备端该使用哪个模式呢?


1,你如果是375操作372的话,那么就不需要用我们的库 2,375操作372的时候,也是需要枚举的啊,只不过在枚举的时候不需要分析372的描述符(获取端点号),你也可以用我们芯片的一个命令来自动的配置就可以了,你看下设置模式的子函数,先给设备设置地址,接着在给主机端设置地址,不指定的话,后面的操作是不会成功的,具体你可以参考USB协议 3,模式5是不产生SOP包,模式6是自动产生SOP包,建议使用模式6


谢谢hcn,不过你看下面是例程ch375link.c中的main函数和set_usb_mode函数,如果是375操作372的话 ,确实没有设置地址的,是不是例程中有错误呀。 另外,接收数据时,如果外部设备一次发送的数据长度超过64字节,375怎么处理呢,还是必须修改外部设备的程序,控制一次发送的数据不能超过64字节? unsigned char set_usb_mode( unsigned char mode ) { unsigned char i; CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); CH375_WR_DAT_PORT( mode ); endp6_mode=endp7_mode=0x80; for( i=0; i!=100; i++ ) { if ( CH375_RD_DAT_PORT()==CMD_RET_SUCCESS ) return( TRUE ); } return( FALSE ); }

main() { unsigned char xdata data_to_send[250], data_by_recv[250]; unsigned char i, len; set_usb_mode( 6 ); while ( wait_interrupt()!=USB_INT_CONNECT ); #ifdef DEVICE_NOT_CH37X #define USB_RESET_FIRST 1 #ifdef USB_RESET_FIRST set_usb_mode( 7 ); for ( i=0; i<250; i++ ) { delay2us(); delay2us(); delay2us(); delay2us(); } set_usb_mode( 6 ); while ( wait_interrupt()!=USB_INT_CONNECT ); for ( i=0; i<250; i++ ) delay2us(); #endif get_descr(1); set_addr(5); get_descr(2); set_config(1); #endif

for ( i=0; i<250; i+=64 ) host_send( 64, &data_to_send[i] ); host_send( 0, NULL ); for ( i=0; i<250; i+=len ) len=host_recv( &data_by_recv[i] ); while(1); }


set_addr(5);就是设置地址,set_usb_mode()是设置模式,设置模式的过程中,是按照USB协议里面的做法,先设置模式6检测到设备连接,接着在总线复位(模式7),延时一段时间之后在设置模式6,检测设备连接,接下来就是获取设备描述符设置地址,获取配置描述符,设置配置,接着之后就可以和372进行通讯了,,在例子程序中没有什么问题


不是说 #ifdef DEVICE_NOT_CH37X 后面的代码对372是可选的吗,如果不定义DEVICE_NOT_CH37X ,后面的语句 get_descr(1); set_addr(5); get_descr(2); set_config(1); 不是都不编译了吗


和372通信的话是可以不进行枚举的,如果375发现设备是37X的话,就可以直接进行通信了。


这个问题你还没有回答呢: 接收数据时,如果外部设备一次发送的数据长度超过64字节,375怎么处理呢,还是必须修改外部设备的程序,控制一次发送的数据不能超过64字节?


超过64字节的话,先发送64字节,当发送成功的话,在发送剩下来的数据就可以了


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