CH32V203的USBD和CAN共存問題

按照WCH的文檔描述,CH32V203的USBD和CAN公用了512字節(jié)的收發(fā)緩沖區(qū),如果同時使用USBD和CAN,那么USBD使用的緩沖區(qū)不能超過384字節(jié),也就是需要分128字節(jié)給CAN使用。按照地址來區(qū)分:

  • USBD使用[0x40006000,0x40006300),地址空間768B,實際384B可用

  • CAN1使用[0x40006300, 0x40006400),地址空間256B,實際128B可用

我的項目為使用CH32V203C8T6實現(xiàn)USBCAN卡,代碼之前已經(jīng)在其它廠家的ARM芯片上實現(xiàn),運行一切正常。

USBCAN卡主要就是實現(xiàn)USB和CAN之間的數(shù)據(jù)轉(zhuǎn)發(fā),目前初步測試USB轉(zhuǎn)發(fā)到CAN運行一切正常,反過來,從CAN轉(zhuǎn)發(fā)到USB接口,轉(zhuǎn)發(fā)幾千幀以后,CAN接口就再也無法收到數(shù)據(jù)了。此時復(fù)位并重新初始化CAN接口可以重新收到數(shù)據(jù)。

CAN使用FIFO0接收,只要FIFO0有數(shù)據(jù)就觸發(fā)中斷,在中斷中讀取FIFO0中的全部數(shù)據(jù)。CAN接收與USBD公用一個ISR,CAN接收到的數(shù)據(jù)通過USB轉(zhuǎn)發(fā)到PC,查看CAN的寄存器完全正常,和之前正常接收時并沒有差異,USBD使用的緩沖區(qū)為336字節(jié)(0x150)小于384字節(jié)。CAN改為使用FIFO1接收,經(jīng)過測試現(xiàn)象一樣,也是幾千幀以后CAN再也無法接收到數(shù)據(jù)。

嘗試關(guān)閉USB接口的轉(zhuǎn)發(fā),即CAN接口收到數(shù)據(jù)以后,不再通過USB的IN端點轉(zhuǎn)發(fā)出去,實測一切正常了,可以收到全部CAN接口上的數(shù)據(jù)??雌饋磉€是USBD和CAN共享的緩沖區(qū)出了問題。

實際USB使用了3個端點,EP0,EP1,EP2,緩沖區(qū)描述表使用0x30個字節(jié),EP0的發(fā)送接收分別使用0x40字節(jié),EP1的發(fā)送接收分別使用0x10字節(jié),EP2的發(fā)送接收分別使用0x40字節(jié),總共使用的字節(jié)數(shù)為0x30+(0x40+0x10+0x40)*2=0x150字節(jié),全部內(nèi)容放在緩沖區(qū)的前面,后面地址留給CAN使用,地址0x40006000開始的緩沖區(qū)描述表內(nèi)容如下,

memrd?40006000
0x40006000?30?00?00?00?18?00?00?00?70?00?00?00?00?84?00?00?0.......p.......
0x40006010?B0?00?00?00?D4?AD?00?00?C0?00?00?00?00?20?00?00?.............?..
0x40006020?D0?00?00?00?E2?A9?00?00?10?01?00?00?FF?87?00?00?................
0x40006030?0A?89?00?00?40?D8?00?00?B1?8A?00?00?2E?AE?00?00?....@...........?

現(xiàn)在的感覺是USBD的IN端點數(shù)據(jù)發(fā)送破壞了CAN的數(shù)據(jù)接收,CH32V203的這個USBD外設(shè)從寄存器分布來看是和STM32F103兼容的,相比STM32F103增加和和CAN外設(shè)的兼容性,除了這一點還有沒有其它不同?和CAN兼容是否還有需要注意的點?

您好,因CAN1的FIFO0中斷與USBD的LP中斷共用同一個中斷服務(wù)函數(shù)入口(USB_LP_CAN1_RX0_IRQHandler)因此建議使用CAN1的FIFO1中斷進行數(shù)據(jù)收發(fā),參考代碼如下,實測CAN接收并未出現(xiàn)您描述的問題。您這邊可以測試一下,如有問題可通過微信聯(lián)系我:19951759326

icon_rar.gifCH32V203C8_CAN_Interrupt.zip




@沁恒張工

注意看原文,已經(jīng)測試過使用CAN的FIFO1接收了,和遇到的問題沒有關(guān)系,現(xiàn)象是一樣的。


您好,我這邊測試并沒有出現(xiàn)問題,您可以加我微信,我把測試代碼發(fā)您,并且把把測試環(huán)境同步一下。微信:19951759326


CH32V203這個兼容STM32的USBD外設(shè)實現(xiàn)并不是太好,CH32V203還有一個USBHD,考慮和其它產(chǎn)品的兼容性問題,用戶使用USB都會選用PA11和PA12兩個管腳??上н@個USBHD引腳為PB6和PB7,還不如和CH32V103那樣,把USBHD直接引出到PA11和PA12,保留一個USB IP就行了。

目前使用的代碼在GD32和AT32芯片上都已經(jīng)驗證過了,沒有問題,本來想移植到CH32V203上,現(xiàn)在問題就出在USBD和CAN上面了,CAN接收到大量數(shù)據(jù)以后,再也無法收到新數(shù)據(jù),測試過中斷方式和查詢方式讀取FIFO,都讀不到數(shù)據(jù),猜測和USBD的共享收發(fā)緩沖區(qū)有關(guān)系,不用USBD的時候是沒問題的。

CH32V203只有一個CAN接口,但是文檔中提到:

注:當(dāng)使用 CAN 時,CAN 過濾器表使用共享的 512 字節(jié)專用 SRAM 區(qū)域中的高 256 字節(jié),USB 使用低256 字節(jié)。

高256字節(jié)應(yīng)該是28個過濾器使用的,對應(yīng)兩路CAN,如果我只用一個過濾器,空閑的過濾器是否可以給USB使用?28個過濾器在高256字節(jié)中是如何分布的?是否有進一步的描述?


您好,通過上述程序測試結(jié)論如下:

CDC虛擬串口收發(fā)數(shù)據(jù):

image.png

CAN分析儀收發(fā)數(shù)據(jù):

image.png




我下載了最新的CH32V203的EVT v1.7版本,看到CAN_FilterInit函數(shù)中有如下代碼,相比早期版本,判斷了0x40022030地址處的數(shù)據(jù),這個地址數(shù)據(jù)沒有找到相關(guān)文檔描述,從地址來看像是FLASH相關(guān)寄存器

memrd?40022030
0x40022030?05?00?3E?C0?00?00?00?C0?00?00?08?06?81?31?15?38?..>..........1.8
0x40022040?00?00?00?00?02?00?00?00?00?00?00?00?00?00?00?00?................
0x40022050?00?00?00?00?00?00?00?00?00?00?00?00?00?00?00?00?................
0x40022060?00?00?00?00?00?00?00?00?00?00?00?00?00?00?00?00?................

我的芯片實際讀出來是0xC03E0005,符合邏輯判斷,要執(zhí)行下面的代碼,用0x40006300開始的256字節(jié)數(shù)據(jù)覆蓋0x40006200開始的256字節(jié)數(shù)據(jù),我的USB代碼使用了0x40006200開始的一些數(shù)據(jù)作為USBD包緩沖區(qū),而且CAN初始化在USB完成初始化以后進行,因此這段代碼是會覆蓋USB的包緩沖,請問這樣做的目的是什么?是不是芯片本身的局限性?

#if?defined?(CH32V20x_D6)
??if(((*(uint32_t?*)?0x40022030)?&?0x0F000000)?==?0)
??{
????uint32_t?i;

????for(i?=?0;?i?<?64;?i++){
????????*(__IO?uint16_t?*)(0x40006000?+?512?+?4?*?i)?=?*(__IO?uint16_t?*)(0x40006000?+?768?+?4?*?i);
????}
??}
#endif



從GPIO的源代碼中看到0x40022030判斷的是MCU的版本MCU_Version,如果版本號為1,那么GPIOC的定義有點問題,固件庫中做了補丁,看起來新版本芯片已經(jīng)修正這個bug了。

CAN的那段代碼應(yīng)該也是修復(fù)硬件CAN濾波器的bug的,是否可以詳細介紹一下這個問題,我評估一下是不是這個問題引起的CAN無法收到數(shù)據(jù)。按說這些問題都應(yīng)該寫到芯片的勘誤表errata中的。


順便提一個建議:CH32V203的EVT版本V1.7的ch32v20x_can.c這個文件,建議把縮進統(tǒng)一一下,要么全用空格,要么全用TAB,不要混用空格和TAB縮進。這個文件大部分地方是用2空格縮進,其中混雜這一些TAB,因為我的編輯器默認TAB是4空格,所以就全亂了。同一個EVT庫,其它的文件就是4空格縮進的。建議縮進統(tǒng)一用TAB,不存在幾個空格的歧義。

我這邊自己修改了一些固件庫的內(nèi)容,每次新的EVT發(fā)布,都是對比以后把修改合并到我的固件庫中,不規(guī)范的縮進會增加對比的工作量。


收到,感謝建議,后期EVT例程會同步更新。


問題也解決了:原因在于CH32V203C8T6這顆芯片雖然只有一個CAN1,但是由于硬件bug,它的CAN過濾器緩沖區(qū)使用的實際地址是0x40006200,所以代碼要將0x40006300開始的256字節(jié)復(fù)制到0x40006200地址,這樣留給USBD的可用包緩沖區(qū)只有256字節(jié)了。我的代碼中使用的是編號0的CAN過濾器,對應(yīng)地址0x40006200,而USBD的EP2_IN端點包緩沖區(qū)范圍在0x0x400061A0到0x0x40006220,剛好有重疊,USBD傳輸數(shù)據(jù)過程中將CAN的過濾器更改了,導(dǎo)致CAN接口無法收到數(shù)據(jù)。

USBD和雙CAN緩沖區(qū)沖突問題是STM32F10x系列留下的經(jīng)典坑,如果是雙CAN的28個過濾器,留給USBD的包緩沖區(qū)只有256字節(jié),這個顯然太少了,用戶使用會非常不便,解決方法建議你們參考雅特力AT32的方案,他們這個問題處理得比較好。以下是AT32F413的USBD和CAN緩沖區(qū)配置方案,默認情況下USBD的512字節(jié)緩沖區(qū)是專用的,CAN的過濾器在另外獨立的1280字節(jié)緩沖區(qū)中,USBD如果512字節(jié)不夠用,還可以擴展到768字節(jié),不用CAN的話可以擴展到1024字節(jié)和1280字節(jié)。

2023-01-11_125409.png


請教一下CH32F208 和CH32V208 系列是不是CAN和USB也存在共用問題


您好,相關(guān)問題該貼已回復(fù)你

http://m.findthetime.net/bbs/thread-112133-1.html

?


image.png


你的是413的手持吧,我用的是403也是無法共用不知道如何處理



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

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