關(guān)于CH565W單片機(jī)中USB3.0的開發(fā)

我最近想用CH565W的spi采集芯片數(shù)據(jù),然后再通過USB3.0將數(shù)據(jù)發(fā)送出來,但是官方例程看不懂,不知道該如何發(fā)送數(shù)據(jù)。請問各位大神有沒有例程和上位機(jī)的例程,小弟感激不盡。

該貼用于說明函數(shù)庫使用相關(guān),將不定期刪除無效、無關(guān)、不具有價值的回復(fù)信息

===================================分隔符=====================================

CH569EVT中已經(jīng)包含了USB3.0廠商類型設(shè)備和電腦收發(fā)數(shù)據(jù)的程序,包含電腦端程序(USB3.0TestDemo.zip)和單片機(jī)程序(CH372Device)。

image.png

其次,芯片的SPI接口速度和USB3.0速度不在一個數(shù)量級,如果只是轉(zhuǎn)發(fā)SPI接口速度,USB2.0也可滿足。


捕獲.JPG意思是我是用USB30_IN_ClearIT();和USB30_OUT_Set();和USB30_Send_ERDY();這三個函數(shù)就可以實現(xiàn)單純發(fā)送功能了嗎?


USB30_IN_ClearIT();清除的是IN事務(wù)完成中斷標(biāo)志

USB30_OUT_Set();配置芯片對OUT事務(wù)的響應(yīng)狀態(tài)

USB30_Send_ERDY();發(fā)送ERDY包通知電腦


結(jié)合USB3.0協(xié)議中數(shù)據(jù)收發(fā)的應(yīng)答狀態(tài)流轉(zhuǎn),結(jié)合主機(jī)的事務(wù)請求,才能實現(xiàn)收發(fā)。


我們示例程序雖然注重演示效果,效率不高,但是傳輸速度也在百兆字節(jié)每秒級別,如果不明白USB底層,可以直接在示例程序交互流程上(一發(fā)一收),只對緩沖區(qū)數(shù)據(jù)修改,實現(xiàn)上層協(xié)議的疊加。


捕獲.JPG是對這里進(jìn)行修改嗎?


圖中對標(biāo)準(zhǔn)EVT代碼(CH372Device)做了一些修改,幫助理解。

image.png

在EP?_OUT_Callback(void)回調(diào)函數(shù)的?if(nump == 0)條件中,即紅框中就是對收到(PC->MCU)數(shù)據(jù)(OUT)處理的部分。

如果不關(guān)心底層邏輯,那就記住一點:只修改藍(lán)色框中部分代碼,記住收到的數(shù)據(jù)在endp1RTbuff[4096]中,數(shù)據(jù)處理完,回傳數(shù)據(jù)還是放在endp1RTbuff[4096]中。

===========================分割線====================================

在EP?_IN_Callback(void)回調(diào)函數(shù)的?if(nump == 0)條件中,即指示上傳(MCU->PC)數(shù)據(jù)(IN)完成,通常不需處理,保持默認(rèn)代碼,數(shù)據(jù)主要處理在OUT_CALLBACK中處理。

image.png

=========================分割線=====================================

按照上面圖中代碼,就可以實現(xiàn)1號端點的:

下傳4096字節(jié),上傳4096字節(jié)

下傳4096字節(jié),上傳4096字節(jié)

下傳4096字節(jié),上傳4096字節(jié)

下傳4096字節(jié),上傳4096字節(jié)

。。。。。。。。。。。循環(huán)

在這個4096字節(jié)中去疊加自定義的交互協(xié)議

當(dāng)然,需要電腦端在一個線程中,等到下傳(PC->MCU)的4096字節(jié)完成,才能啟動上傳(MCU->PC)4096字節(jié),等到上傳4096字節(jié)完成,才能啟動下一次下傳。這樣才能上下位機(jī)實現(xiàn)同步,保持傳輸。


下圖中的EP2_OUT_Callback(void)寫法,能夠?qū)崿F(xiàn)端點2的連續(xù)下傳,每次下傳4096字節(jié)。image.png

同樣,在藍(lán)色框的范圍內(nèi)對收到的數(shù)據(jù)進(jìn)行處理。

================================分割線=============================

下圖中的代碼將EP3_IN_Callback(void)寫法可以實現(xiàn)端點3的連續(xù)上傳,每次上傳4096字節(jié)。

image.png

????????但是片面的說,上傳(其實下傳也是)是個被動的過程,進(jìn)到IN_Callback的時候傳輸已經(jīng)結(jié)束了,所以單向端點3在第一次上傳需要提前準(zhǔn)備好buff中的數(shù)據(jù)(端點1因為是雙向的,且人為約定了第一包是下傳,處理上邏輯會通一點),因為是單向端點,數(shù)據(jù)的發(fā)送比較難從交互邏輯上和電腦同步,也就是不知道什么電腦會來取走數(shù)據(jù)。所以需要提前在初始化的時候?qū)⒍它c響應(yīng)配置好,當(dāng)然初始化包括前面的端點1、端點2的響應(yīng)狀態(tài)。在USB30D_init( )函數(shù)中,我們需要對端點響應(yīng)進(jìn)行配置,以及端點緩沖區(qū)的配置。


????????對于上面說的這個“被動”,不必要要在看這部分文字的時候徹底搞明白,有機(jī)會就多試試,收發(fā)幾次找到數(shù)據(jù)交互的規(guī)律就自然而然明白了。光說不練是不行的。


綠色框:端點的收、發(fā)使能

紅色框:端點收、發(fā)DMA地址配置

藍(lán)色框:端點響應(yīng)狀態(tài)配置

image.png


為實現(xiàn)

????????①端點1的下傳、上傳、下傳、上傳.........

????????②端點2的下傳、下傳、下傳、下傳..........

????????③端點3的上傳、上傳、上傳、上傳...........

????????我們就只要在EP1_IN_Callback(void)、EP3_IN_Callback(void)、EP1_OUT_Callback(void)、EP2_OUT_Callback(void)總計4個回調(diào)函數(shù)中對數(shù)據(jù)進(jìn)行處理就行了。


這個代碼模板應(yīng)該可以應(yīng)付很多場景下的自定義數(shù)據(jù)傳輸了,這樣也就不需要關(guān)心USB底層了,其實整個USBSS也就這么幾個函數(shù)。


對應(yīng)的代碼工程在此

icon_rar.gifEXAM.zip

前文的描述旨在幫助使用CH569/565的USBSS庫函數(shù),目的是明白函數(shù)都是什么作用,該怎么調(diào)用。細(xì)節(jié)優(yōu)化有涉及到端點描述符等USB協(xié)議內(nèi)容,這里不展開且不針對進(jìn)行修改,用戶自行研究USB協(xié)議部分內(nèi)容。



那我現(xiàn)在按照你提供的方法更改程序了,我現(xiàn)在是否可以使用貴司提供的CH372DBG軟件進(jìn)行驗證?我試過使用該軟件,可以端點2下傳,點擊4次下傳后串口有數(shù)據(jù)打印,但端點2上傳沒有顯示數(shù)據(jù)。是否我操作失誤,或是需要使用其他軟件?


貼中代碼支持且支持:

? ? ? ? ①端點1的下傳、上傳、下傳、上傳.........

????????②端點2的下傳、下傳、下傳、下傳..........

????????③端點3的上傳、上傳、上傳、上傳...........


上位機(jī)建議根據(jù)示例代碼自行開發(fā)

如有難度,可以借助BUS HOUND等第三方軟件學(xué)習(xí)探究。第三方軟件使用方式請自行解決。


捕獲.JPG請問每個數(shù)據(jù)包的大小是必須固定為4096嗎?我嘗試過修改貴司官方demo,使其處于一直接收狀態(tài),然后單片機(jī)程序單方面將4096改成1024,用USB監(jiān)控軟件發(fā)現(xiàn)這樣會接收不了數(shù)據(jù),改回4096之后又能接收到數(shù)據(jù)。是否可以通過同時通過修改軟件中接收數(shù)據(jù)包的大小進(jìn)行更改?例如我程序與電腦接收程序同時改成1024,這樣是否能正常通訊?


USB3.0 BULK事務(wù),包長度1024字節(jié)。

4096長度概念的產(chǎn)生,是因為芯片支持USB3.0中的BURST,BURST級數(shù)為4,簡單理解就是一次連續(xù)發(fā)送4包,4*1024=4096.

CH372示例程序中有突發(fā)級數(shù)的宏定義。

你截圖圈中的僅僅是緩沖區(qū)長度定義,通常緩沖區(qū)長度和最大突發(fā)長度(最大端點長度*最大突發(fā)級數(shù))相等,以防RAM訪問越界。


我MCU程序中有關(guān)緩沖區(qū)的大小從貴司例程中的4096改成了200,然后在貴司提供的上位機(jī)程序的基礎(chǔ)上想修改接收的數(shù)據(jù)包大小。但是無法修改成只接收200個包,且也只能是使用上位機(jī)歷程中的“?#define? TEST_DATA_LEN? 0x400000”這個值才能接收正常數(shù)據(jù)。在此我想請問如果我上位機(jī)想設(shè)置成只接受200個數(shù)據(jù)我應(yīng)該怎么修改程序?

1658732874684613.jpg

1658732874515904.jpg



觀察函數(shù)注釋可知,參數(shù)nump代表端點能夠發(fā)送的包數(shù)量。如果要上傳非滿包(<1024),應(yīng)當(dāng)將nump改成1。

image.png

額外要注意的,參數(shù)lpf在任何時候都應(yīng)該為1。這已經(jīng)在1.2版本庫中刪除了這個參數(shù)。


請問下,EP0的SetupRequest OUT方向的data部分應(yīng)該在哪里取?是否為endp0RTbuff + sizeof(struct SetupRequest)后面的數(shù)據(jù)?還是說endp0RTbuff有setup階段,還有data階段?麻煩解答下,如果有示例,麻煩給一個...


發(fā)生控制傳輸時,SETUP令牌到達(dá)DEVICE后,程序會跳入“USB30_StandardReq()”或者“USB30_NonStandardReq()”中由用戶處理USB請求。

如果控制傳輸存在數(shù)據(jù)階段,函數(shù)庫會自動處理數(shù)據(jù)階段的應(yīng)答,在請求處理函數(shù)返回之后,OUT事務(wù)發(fā)生,程序會自動跳入EP0_OUT_Callback()函數(shù)。

通過執(zhí)行"USB30_OUT_Status( )"獲取到數(shù)據(jù)階段的數(shù)據(jù)長度“l(fā)en”。數(shù)據(jù)存放在“endp0RTbuff”中。

該函數(shù)返回值? 0代表數(shù)據(jù)階段已經(jīng)沒有后續(xù)數(shù)據(jù)了,非0代表數(shù)據(jù)階段沒有結(jié)束,還有后續(xù)數(shù)據(jù)。


image.png

測試程序:icon_rar.gifsetup-out.zip



只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频