RCSN 发表于 2019-1-6 15:08

XMC4800 评测(五)简单制作CAN转USB

本帖最后由 RCSN 于 2019-1-6 17:29 编辑

额,继上贴的USB复合设备,楼主再调试了XMC4800的CAN的外设,以便整合简单的USB转CAN功能。在此贴中,楼主只单纯使用使用USB的HID类,HID速率不高,实际应用中还是使用winusb或者CDC。在这里楼主只是为了方便,以便验证此贴的功能性。 楼主在调试CAN的过程中,遇到不少一些小问题,在根据手册的说明中,验证XMC4800的CAN功能。楼主本来想使用周立功的CAN调试软件,但是由于系统问题,安装老是失败。所以改为所使用的CAN盒的调试工具。
此功能以一帧8个字节为准。HID发数据转发给CAN,CAN再发给PC;PC发给CAN,CAN再转发给HID,HID再发给PC。
那么先来说明先XMC4800的CAN的相关配置。我们需要先初始化下CAN模块的时钟以及波特率。对于CAN外设的时钟源,可以通过FDR寄存器和MCR寄存器进行步进分频。这里我们把CAN模块频率弄为12M,对于接口来说,只需要赋值CAN的时钟源和CAN频率即可,也就是通过XMC_CAN_Init进行初始化时钟频率。我们推究到内部接口。故初始化只需要这样。



此内容由EEWORLD论坛网友RCSN原创,如需转载或用于商业用途需征得作者同意并注明出处




RCSN 发表于 2019-1-6 15:09

本帖最后由 RCSN 于 2019-1-6 17:47 编辑

XMC4800的CAN模块有6个CAN节点,每个节点都是独立的。要使用它,我们得再初始化下节点的位时序、波特率、采样点前后时间段等相关配置。这些配置可以在每个节点的NBTR寄存器。

官方也提供了时序接口XMC_CAN_NODE_NominalBitTimeConfigure,传参结构体如下:

   这里我们定义个实例变量,存在rom里面。依照上述的结构体进行赋值,再代入到XMC_CAN_NODE_NominalBitTimeConfigure中,这样就完成了节点的CAN相关配置。

    在板载的CAN中使用的是CAN_NODE1。同样在库上也定义了此寄存器的基地址。我们直接使用即可。最后使用 XMC_CAN_NODE_NominalBitTimeConfigure(CAN_NODE1, &baud);即可实现CAN节点的配置




RCSN 发表于 2019-1-6 18:15

配置完上述之后,我们还需要对CAN的RX、TX的端口进行操作。在这里我们需要注意的是,需要对节点控制寄存器NCR进行相关操作,才可以去操作CAN的端口设置。也就是说,必须先关掉此CAN节点的CAN通信,再启用配置改变寄存器,才可以配置端口,配置完毕之后,再开启CAN节点的CAN通信,关闭配置改变寄存器。这个可以起到保护作用,防止端口被莫名改变。这 种类似与STM32的SPI配置,要改变传输位数,比如8位传输或者16位传输,比如先关闭SPI,才能配置,配置完毕开启SPI。这个是我遇到的第一个坑。不这样做,CAN的端口设置不能用,无法正常收发。
那么我们来分析下这些寄存器。CAN节点寄存器有个NCR寄存器,这个寄存器是决定CAN节点操作的基本设置,包括节点初始化INIT、传输中断启用TRIE、配置改变启用CCE等等。该寄存器也就前面8位是配置的

   那么我们需要配置的寄存器也就两个,一个是INIT,一个是CCE。INIT是节点初始化,复位INIT启用该CAN节点,置位终止该CAN节点的CAN通信。CCE是配置改变启用,复位的话,位时序寄存器、端口控制寄存器、错误计时器寄存器只能读不能写,而置位可以进行读写。那么在这里我们要配置端口,那么开始就得置位INIT、CCE,配置端口完成后,就复位INIT、CCE。
   

明白了这个原理后,我们再看官方的demo(XMC4800这个并没有CAN的例子,但是可以参照XMC4500的),也就能清晰明白其思路。楼主为了快速开发肯定不可能用寄存器去操作,官方也有相对应的库接口,我们直接使用即可。操作CCE的是XMC_CAN_NODE_EnableConfigurationChange和XMC_CAN_NODE_DisableConfigurationChange;操作INIT的是XMC_CAN_NODE_SetInitBit和XMC_CAN_NODE_ResetInitBit。在操作端口以下截图:



RCSN 发表于 2019-1-6 18:50

知道套路之后,我们再此看下配置下CAN节点的端口,以便能正常收发报文。楼主在这里稍微弄得比较简单,CAN的发送使用非中断式发送,而接收使用了中断式接收。我们先来看下RX接收部分,首先看下端口的配置,RX的GPIO配置为输入接收模式,再配置下CAN_NODE1的接收输入线,这个可以通过节点端口控制器NPCR的RXSEL寄存器进行配置。从下图可知道CAN模块有8个接收输入线,那么CAN_NODE1的接收输入线该选择哪个呢,官方手册这里给了一张表,我们可以依次找到板子对应的输入线
从下图可以看到,板载的CAN1的接收IO口为P1.13,对应的就是N1_RXDC.NPCR的RXSEL赋值为011B。这样就确定了CAN1的接收输入线了。

   那么官方库中也提供了相对应的接口以及枚举,我们就相对应赋值就行了。XMC_CAN_NODE_SetReceiveInput。
   
我们还需要配置下发送TX,发送这块相对比较简单,直接IO复用为CAN_NODE1的TX接口即可。但是我们如何确定呢,我们可以查找到官方的用户手册的PORTS的IO功能这块,板子的CAN_TX使用的是P1_12.由图可以看到使用的是输出的ALT2复用

那么我们相对应利用XMC_GPIO_SetMode这个设置IO模式的接口,把P1_12复用为ALT2即可。


RCSN 发表于 2019-1-6 21:49

那么配置好上述相关参数后,我们还需要对报文进行存储。XMC4800的报文对象有256个。每个CAN节点和唯一的报文对象列表相关联。一个CAN节点仅传送分配给该节点列表的报文对象中的报文。也就是说,一个CAN节点接收到的帧也只能存储到属于该节点的报文对象中;而一个CAN节点要发送的帧也只能在分配给该节点的报文对象中选择。
对于报文对象这块,设计实在很丰富,可以设置网关,还带FIFO。太多功能可以需要摸清,楼主也只是实现了一点小功能。而且对报文的元素列表等还不太熟悉,主要是报文列表的链表关系,还需要后续再理解。
前面说了,不管是收发的报文,都需要分配一个报文对象存储。在这里我们新建两个报文对象,一个是收一个是发。

然后再把这两个报文列表交由控制面板寄存器分配。所使用的接口,也就是唯一的接口,分配方式如下:

之后再使能报文接收对象的接收中断,在这里需要说明下CAN中断控制上,CAN模块一共有8条中断输出线,比如报文收发中断,错误帧中断等等,都可以自由分配到指定的中断输出线上,这样实现相对比较自由而且方便。而中断输出线的选择只需要INP寄存器进行切换即可。

   综上可知,我们对其进行库函数编程对应的配置。
   

RCSN 发表于 2019-1-6 22:03

配置完毕之后,我们需要对其进行业务逻辑编写。楼主在接收中断里面,进行接收报文,并且建立一个接收完毕标志。根据上贴的复合设备。HID的回调读写接口的写接口上判断这个接收完成标志,若成立则把此报文发送给HID,HID再发给PC。同样,HID的读接口收到了PC的数据,则把此信息发给CAN的发送报文,CAN再发给PC。


HID的写接口逻辑如下


HID的读接口逻辑如下;

效果如下:



RCSN 发表于 2019-1-6 22:11

连线图如下:

git效果:
   
   工程附件如附件,
   下一贴:体验以太网+freertos+lwip移植。

木犯001号 发表于 2019-1-15 11:40

期待楼主的下一贴:victory:很精彩,写的很详细,可以很好的跟着进行操作,赞!喜欢楼主的文

freebsder 发表于 2019-1-15 14:20

可以的RC,写的很仔细,不出3个月一定赶超我了。

ljfbuaa 发表于 2019-6-17 14:35

<p>不能下载吗</p>

nbmbnn 发表于 2020-4-21 12:11

<p>这方面资料很少,学习一下。</p>
页: [1]
查看完整版本: XMC4800 评测(五)简单制作CAN转USB