CH32V203的USBD和CAN共存问题

按照WCH的文档描述,CH32V203的USBD和CAN公用了512字节的收发缓冲区,如果同时使用USBD和CAN,那么USBD使用的缓冲区不能超过384字节,也就是需要分128字节给CAN使用。按照地址来区分:

  • USBD使用[0x40006000,0x40006300),地址空间768B,实际384B可用

  • CAN1使用[0x40006300, 0x40006400),地址空间256B,实际128B可用

我的项目为使用CH32V203C8T6实现USBCAN卡,代码之前已经在其它厂家的ARM芯片上实现,运行一切正常。

USBCAN卡主要就是实现USB和CAN之间的数据转发,目前初步测试USB转发到CAN运行一切正常,反过来,从CAN转发到USB接口,转发几千帧以后,CAN接口就再也无法收到数据了。此时复位并重新初始化CAN接口可以重新收到数据。

CAN使用FIFO0接收,只要FIFO0有数据就触发中断,在中断中读取FIFO0中的全部数据。CAN接收与USBD公用一个ISR,CAN接收到的数据通过USB转发到PC,查看CAN的寄存器完全正常,和之前正常接收时并没有差异,USBD使用的缓冲区为336字节(0x150)小于384字节。CAN改为使用FIFO1接收,经过测试现象一样,也是几千帧以后CAN再也无法接收到数据。

尝试关闭USB接口的转发,即CAN接口收到数据以后,不再通过USB的IN端点转发出去,实测一切正常了,可以收到全部CAN接口上的数据。看起来还是USBD和CAN共享的缓冲区出了问题。

实际USB使用了3个端点,EP0,EP1,EP2,缓冲区描述表使用0x30个字节,EP0的发送接收分别使用0x40字节,EP1的发送接收分别使用0x10字节,EP2的发送接收分别使用0x40字节,总共使用的字节数为0x30+(0x40+0x10+0x40)*2=0x150字节,全部内容放在缓冲区的前面,后面地址留给CAN使用,地址0x40006000开始的缓冲区描述表内容如下,

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 ....@...........?

现在的感觉是USBD的IN端点数据发送破坏了CAN的数据接收,CH32V203的这个USBD外设从寄存器分布来看是和STM32F103兼容的,相比STM32F103增加和和CAN外设的兼容性,除了这一点还有没有其它不同?和CAN兼容是否还有需要注意的点?

您好,因CAN1的FIFO0中断与USBD的LP中断共用同一个中断服务函数入口(USB_LP_CAN1_RX0_IRQHandler)因此建议使用CAN1的FIFO1中断进行数据收发,参考代码如下,实测CAN接收并未出现您描述的问题。您这边可以测试一下,如有问题可通过微信联系我:19951759326

icon_rar.gifCH32V203C8_CAN_Interrupt.zip




@沁恒张工

注意看原文,已经测试过使用CAN的FIFO1接收了,和遇到的问题没有关系,现象是一样的。


您好,我这边测试并没有出现问题,您可以加我微信,我把测试代码发您,并且把把测试环境同步一下。微信:19951759326


CH32V203这个兼容STM32的USBD外设实现并不是太好,CH32V203还有一个USBHD,考虑和其它产品的兼容性问题,用户使用USB都会选用PA11和PA12两个管脚。可惜这个USBHD引脚为PB6和PB7,还不如和CH32V103那样,把USBHD直接引出到PA11和PA12,保留一个USB IP就行了。

目前使用的代码在GD32和AT32芯片上都已经验证过了,没有问题,本来想移植到CH32V203上,现在问题就出在USBD和CAN上面了,CAN接收到大量数据以后,再也无法收到新数据,测试过中断方式和查询方式读取FIFO,都读不到数据,猜测和USBD的共享收发缓冲区有关系,不用USBD的时候是没问题的。

CH32V203只有一个CAN接口,但是文档中提到:

注:当使用 CAN 时,CAN 过滤器表使用共享的 512 字节专用 SRAM 区域中的高 256 字节,USB 使用低256 字节。

高256字节应该是28个过滤器使用的,对应两路CAN,如果我只用一个过滤器,空闲的过滤器是否可以给USB使用?28个过滤器在高256字节中是如何分布的?是否有进一步的描述?


您好,通过上述程序测试结论如下:

CDC虚拟串口收发数据:

image.png

CAN分析仪收发数据:

image.png




我下载了最新的CH32V203的EVT v1.7版本,看到CAN_FilterInit函数中有如下代码,相比早期版本,判断了0x40022030地址处的数据,这个地址数据没有找到相关文档描述,从地址来看像是FLASH相关寄存器

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,符合逻辑判断,要执行下面的代码,用0x40006300开始的256字节数据覆盖0x40006200开始的256字节数据,我的USB代码使用了0x40006200开始的一些数据作为USBD包缓冲区,而且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的定义有点问题,固件库中做了补丁,看起来新版本芯片已经修正这个bug了。

CAN的那段代码应该也是修复硬件CAN滤波器的bug的,是否可以详细介绍一下这个问题,我评估一下是不是这个问题引起的CAN无法收到数据。按说这些问题都应该写到芯片的勘误表errata中的。


顺便提一个建议:CH32V203的EVT版本V1.7的ch32v20x_can.c这个文件,建议把缩进统一一下,要么全用空格,要么全用TAB,不要混用空格和TAB缩进。这个文件大部分地方是用2空格缩进,其中混杂这一些TAB,因为我的编辑器默认TAB是4空格,所以就全乱了。同一个EVT库,其它的文件就是4空格缩进的。建议缩进统一用TAB,不存在几个空格的歧义。

我这边自己修改了一些固件库的内容,每次新的EVT发布,都是对比以后把修改合并到我的固件库中,不规范的缩进会增加对比的工作量。


收到,感谢建议,后期EVT例程会同步更新。


问题也解决了:原因在于CH32V203C8T6这颗芯片虽然只有一个CAN1,但是由于硬件bug,它的CAN过滤器缓冲区使用的实际地址是0x40006200,所以代码要将0x40006300开始的256字节复制到0x40006200地址,这样留给USBD的可用包缓冲区只有256字节了。我的代码中使用的是编号0的CAN过滤器,对应地址0x40006200,而USBD的EP2_IN端点包缓冲区范围在0x0x400061A0到0x0x40006220,刚好有重叠,USBD传输数据过程中将CAN的过滤器更改了,导致CAN接口无法收到数据。

USBD和双CAN缓冲区冲突问题是STM32F10x系列留下的经典坑,如果是双CAN的28个过滤器,留给USBD的包缓冲区只有256字节,这个显然太少了,用户使用会非常不便,解决方法建议你们参考雅特力AT32的方案,他们这个问题处理得比较好。以下是AT32F413的USBD和CAN缓冲区配置方案,默认情况下USBD的512字节缓冲区是专用的,CAN的过滤器在另外独立的1280字节缓冲区中,USBD如果512字节不够用,还可以扩展到768字节,不用CAN的话可以扩展到1024字节和1280字节。

2023-01-11_125409.png


请教一下CH32F208 和CH32V208 系列是不是CAN和USB也存在共用问题


您好,相关问题该贴已回复你

/bbs/thread-112133-1.html

 


image.png


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



只有登录才能回复,可以选择微信账号登录