按照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兼容是否還有需要注意的點?