CH573/CH573 USB IN端點(diǎn)發(fā)送數(shù)據(jù)給PC,怎么知道數(shù)據(jù)已經(jīng)發(fā)送完成?

CH573/CH573 USB IN端點(diǎn)發(fā)送數(shù)據(jù)給PC,怎么知道數(shù)據(jù)已經(jīng)發(fā)送完成?

由于項(xiàng)目中UART都使用了,于是USB CDC例程通過USB打印log,發(fā)現(xiàn)有些log打印不出來,判斷問題出在端點(diǎn)發(fā)送上,代碼沒有實(shí)現(xiàn)發(fā)送完成判斷,每次調(diào)用usb發(fā)送都是簡單機(jī)械的往端點(diǎn)2里面填充

void?USBSendData(uint8_t?*SendBuf,uint8_t?l)
{
????usb_sent_flag=0;
????memcpy(pEP2_IN_DataBuf,SendBuf,l);
????DevEP2_IN_Deal(l);
}

我想再每次填充、寫完發(fā)送長度后等待主機(jī)把緩沖區(qū)的數(shù)據(jù)取走后再跳出發(fā)送函數(shù),查看USB中斷處理代碼,發(fā)現(xiàn)在中斷處理代碼中會將端點(diǎn)2的發(fā)送狀態(tài)寫成NAK:


case?UIS_TOKEN_IN?|?2:
????R8_UEP2_CTRL?=?(?R8_UEP2_CTRL?&?~MASK_UEP_T_RES?)?|?UEP_T_RES_NAK;
break;


于是我想可不可以判斷這個值呢,有了以下代碼:

void?USBSendData(uint8_t?*SendBuf,?uint8_t?l)
{
????usb_sent_flag?=?0;
????memcpy(pEP2_IN_DataBuf,SendBuf,l);
????DevEP2_IN_Deal(l);

????//等待發(fā)送完成
????while((R8_UEP2_CTRL&MASK_UEP_T_RES)?==?UEP_T_RES_ACK)
????{
????????WWDG_SetCounter(0x0);
????}
}

但是發(fā)現(xiàn)不行,會一直等在這里,我這野路子估計不行,希望官方能給支個招,提前祝你國慶假期玩的開心?。。。?/p>

編輯原因,修改代碼樣式

編輯了好幾次,發(fā)現(xiàn)論壇會自動把空格轉(zhuǎn)成 "?",大家將就看下哈,感謝?。。?!


各位大佬幫幫看一下,我剛才找了USB的例程,關(guān)于USB的資料好少


可以參考:http://www.findthetime.net/bbs/thread-91615-1.html

image.png


①端點(diǎn)2支持且支持:下傳上傳下傳上傳下傳上傳下傳上傳

這個手冊中有說明嗎?這樣的特性是不是意味著設(shè)備不能連續(xù)2次進(jìn)行IN操作,進(jìn)行一次IN操作后要主機(jī)觸發(fā)一次OUT操作,才能進(jìn)行下一下IN操作? 我看cdc例程就是用的端點(diǎn)2,也就是設(shè)備端不能連續(xù)給PC發(fā)送報文是吧?

怎么改善呢,CDC例程中使用其他端點(diǎn)可行嗎? 我用的芯片是CH571/573,感謝答復(fù)?。。。?/span>



我按照您推薦的帖子,在IN操作前增加了Endp2Busy判斷,只有在Endp2Busy為0的時候才會進(jìn)行新的IN操作,但是還是不行,表現(xiàn)是while(Endp2Busy);死等到看門狗復(fù)位

void USBSendData( uint8_t *SendBuf, uint8_t l)

{

? ?uint8_t retry_times = 0;

? ?while(Endp2Busy);

? ?Endp2Busy = 1;

? ?memcpy(pEP2_IN_DataBuf,SendBuf,l);

? ?DevEP2_IN_Deal( l );

? ?mDelaymS(100);

}

中斷是這樣的

?case UIS_TOKEN_IN | 2 :

???????????//R8_UEP2_CTRL ^= RB_UEP_T_TOG;

? ? ? ? ? R8_UEP2_CTRL = ( R8_UEP2_CTRL & ~MASK_UEP_T_RES ) | UEP_T_RES_NAK;

? ? ? ? ? ?//usb_sent_flag = 1;

? ? ? ? ? Endp2Busy = 0;

? ? ? ? ? GPIOA_InverseBits(GPIO_Pin_12);

? ? ? ? ? break;

我需要的要求很簡單,就是UART用完了,需要用USB打印log


首先需要確保的是,實(shí)現(xiàn)的USB設(shè)備類型,主機(jī)解析后會向EP2發(fā)起IN事務(wù),這個是大前提。

其次要確認(rèn),是因?yàn)閁SB傳輸有些問題導(dǎo)致的看門狗超時,還是因?yàn)榭撮T狗超時導(dǎo)致的USB無法處理,先后順序需要理清楚。

僅看這部分代碼,應(yīng)該是沒什么問題的。


還有這個busy標(biāo)志別真的死等(這不可?。餮h(huán)中輪詢,需要發(fā)送的數(shù)據(jù)做隊列。


首先需要確保的是,實(shí)現(xiàn)的USB設(shè)備類型,主機(jī)解析后會向EP2發(fā)起IN事務(wù),這個是大前提

答:我用的是CDC類,可以實(shí)現(xiàn)部分?jǐn)?shù)據(jù)上傳,現(xiàn)象是有的USBSendData不成功,有的可以成功。

其次要確認(rèn),是因?yàn)閁SB傳輸有些問題導(dǎo)致的看門狗超時,還是因?yàn)榭撮T狗超時導(dǎo)致的USB無法處理,先后順序需要理清楚。

答: 確認(rèn)是usb死等導(dǎo)致的WDT超時,因?yàn)槲以谒赖葁hile循環(huán)里加上喂狗函數(shù)后就不重啟了。

?還有這個busy標(biāo)志別真的死等(這不可?。?,主循環(huán)中輪詢,需要發(fā)送的數(shù)據(jù)做隊列。

答:嗯嗯,是,我是想先這樣盡量簡單,跟官方一致,定位好問題之后再改輪詢隊列形式。

這個表述我還沒理解,可以回答下下面的疑問嗎?

①端點(diǎn)2支持且僅支持:下傳上傳下傳上傳下傳上傳下傳上傳

這個手冊中有說明嗎?這樣的特性是不是意味著設(shè)備不能連續(xù)2次進(jìn)行IN操作,進(jìn)行一次IN操作后要主機(jī)觸發(fā)一次OUT操作,才能進(jìn)行下一下IN操作? 我看cdc例程就是用的端點(diǎn)2,也就是設(shè)備端不能連續(xù)給PC發(fā)送報文是吧?

怎么改善呢,CDC例程中使用其他端點(diǎn)可行嗎? 我用的芯片是CH571/573,感謝答復(fù)?。。?!




代碼期望實(shí)現(xiàn)效果,并非芯片硬件特性

芯片的每個端點(diǎn)都具備雙向、隨時收發(fā)的能力。


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

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