你們提供的是基于51的主機端例程,請問有沒有基于DSP的? 或者有哪位高手做過這個嗎?
372或者375做設(shè)備的時候,只有51的例子程序,C語言是可以移植的,你只要在51例子程序的基礎(chǔ)上修改就可以了,如果是DSP+375操作U盤的話,我們有例子程序。
我用的DSP芯片是TI的TMS3205416,我問了DSP的技術(shù)人員,他們說把51的程序移植到DSP上有些細節(jié)挺麻煩的。 你們能把DSP+375操作U盤的例子程序發(fā)給我一份嗎,我參照這個看看能不能把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的例程中,當(dāng)設(shè)備端是372時,就不用枚舉了,那么是不是當(dāng)我清楚地知道某個非372的設(shè)備端的輸入輸出端口號時,也就不需要枚舉過程了呢,我不太明白,如果不用set_addr命令設(shè)置地址的話,雙方怎么知道使用哪個地址呢,是不是不指定就會使用一個相同的默認地址呢? 3、set_usb_mode(5)和set_usb_mode(6)有多大區(qū)別,為什么當(dāng)設(shè)備端是372時,這兩個都可以,那么我怎么判斷一個非372的設(shè)備端該使用哪個模式呢?
1,你如果是375操作372的話,那么就不需要用我們的庫 2,375操作372的時候,也是需要枚舉的啊,只不過在枚舉的時候不需要分析372的描述符(獲取端點號),你也可以用我們芯片的一個命令來自動的配置就可以了,你看下設(shè)置模式的子函數(shù),先給設(shè)備設(shè)置地址,接著在給主機端設(shè)置地址,不指定的話,后面的操作是不會成功的,具體你可以參考USB協(xié)議 3,模式5是不產(chǎn)生SOP包,模式6是自動產(chǎn)生SOP包,建議使用模式6
謝謝hcn,不過你看下面是例程ch375link.c中的main函數(shù)和set_usb_mode函數(shù),如果是375操作372的話 ,確實沒有設(shè)置地址的,是不是例程中有錯誤呀。 另外,接收數(shù)據(jù)時,如果外部設(shè)備一次發(fā)送的數(shù)據(jù)長度超過64字節(jié),375怎么處理呢,還是必須修改外部設(shè)備的程序,控制一次發(fā)送的數(shù)據(jù)不能超過64字節(jié)? 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);就是設(shè)置地址,set_usb_mode()是設(shè)置模式,設(shè)置模式的過程中,是按照USB協(xié)議里面的做法,先設(shè)置模式6檢測到設(shè)備連接,接著在總線復(fù)位(模式7),延時一段時間之后在設(shè)置模式6,檢測設(shè)備連接,接下來就是獲取設(shè)備描述符設(shè)置地址,獲取配置描述符,設(shè)置配置,接著之后就可以和372進行通訊了,,在例子程序中沒有什么問題
不是說 #ifdef DEVICE_NOT_CH37X 后面的代碼對372是可選的嗎,如果不定義DEVICE_NOT_CH37X ,后面的語句 get_descr(1); set_addr(5); get_descr(2); set_config(1); 不是都不編譯了嗎
和372通信的話是可以不進行枚舉的,如果375發(fā)現(xiàn)設(shè)備是37X的話,就可以直接進行通信了。
這個問題你還沒有回答呢: 接收數(shù)據(jù)時,如果外部設(shè)備一次發(fā)送的數(shù)據(jù)長度超過64字節(jié),375怎么處理呢,還是必須修改外部設(shè)備的程序,控制一次發(fā)送的數(shù)據(jù)不能超過64字節(jié)?
超過64字節(jié)的話,先發(fā)送64字節(jié),當(dāng)發(fā)送成功的話,在發(fā)送剩下來的數(shù)據(jù)就可以了