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

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

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

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

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

image.png

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


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


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

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

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


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


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


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


圖中對標準EVT代碼(CH372Device)做了一些修改,幫助理解。

image.png

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

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

===========================分割線(xiàn)====================================

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

image.png

=========================分割線(xiàn)=====================================

按照上面圖中代碼,就可以實(shí)現1號端點(diǎn)的:

下傳4096字節,上傳4096字節

下傳4096字節,上傳4096字節

下傳4096字節,上傳4096字節

下傳4096字節,上傳4096字節

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

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

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


下圖中的EP2_OUT_Callback(void)寫(xiě)法,能夠實(shí)現端點(diǎn)2的連續下傳,每次下傳4096字節。image.png

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

================================分割線(xiàn)=============================

下圖中的代碼將EP3_IN_Callback(void)寫(xiě)法可以實(shí)現端點(diǎn)3的連續上傳,每次上傳4096字節。

image.png

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


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


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

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

藍色框:端點(diǎn)響應狀態(tài)配置

image.png


為實(shí)現

????????①端點(diǎn)1的下傳、上傳、下傳、上傳.........

????????②端點(diǎn)2的下傳、下傳、下傳、下傳..........

????????③端點(diǎn)3的上傳、上傳、上傳、上傳...........

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


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


對應的代碼工程在此

icon_rar.gifEXAM.zip

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



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


貼中代碼支持且支持:

? ? ? ? ①端點(diǎn)1的下傳、上傳、下傳、上傳.........

????????②端點(diǎn)2的下傳、下傳、下傳、下傳..........

????????③端點(diǎn)3的上傳、上傳、上傳、上傳...........


上位機建議根據示例代碼自行開(kāi)發(fā)

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


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


USB3.0 BULK事務(wù),包長(cháng)度1024字節。

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

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

你截圖圈中的僅僅是緩沖區長(cháng)度定義,通常緩沖區長(cháng)度和最大突發(fā)長(cháng)度(最大端點(diǎn)長(cháng)度*最大突發(fā)級數)相等,以防RAM訪(fǎng)問(wèn)越界。


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

1658732874684613.jpg

1658732874515904.jpg



觀(guān)察函數注釋可知,參數nump代表端點(diǎn)能夠發(fā)送的包數量。如果要上傳非滿(mǎn)包(<1024),應當將nump改成1。

image.png

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


請問(wèn)下,EP0的SetupRequest OUT方向的data部分應該在哪里???是否為endp0RTbuff + sizeof(struct SetupRequest)后面的數據?還是說(shuō)endp0RTbuff有setup階段,還有data階段?麻煩解答下,如果有示例,麻煩給一個(gè)...


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

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

通過(guò)執行"USB30_OUT_Status( )"獲取到數據階段的數據長(cháng)度“l(fā)en”。數據存放在“endp0RTbuff”中。

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


image.png

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



只有登錄才能回復,可以選擇微信賬號登錄
97精品依人久久久大香线蕉97-亚洲欧美日韩一区二区三区-国产亚洲欧美精品久久久-久久99精品久久久大学生-亚洲成a人片在线不卡一二三区 97精品依人久久久大香线蕉97-亚洲欧美日韩一区二区三区-国产亚洲欧美精品久久久-久久99精品久久久大学生-亚洲成a人片在线不卡一二三区