社区导航

 

搜索
查看: 628|回复: 8

[分享] XMC4800 评测(五)简单制作CAN转USB

[复制链接]

900

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-1-6 15:08 | 显示全部楼层 |阅读模式
本帖最后由 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进行初始化时钟频率。我们推究到内部接口。故初始化只需要这样。 20190106172801.png
TIM截图20190106172515.png

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




此帖出自工控电子论坛


回复

使用道具 举报

900

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-1-6 15:09 | 显示全部楼层
本帖最后由 RCSN 于 2019-1-6 17:47 编辑

XMC4800的CAN模块有6个CAN节点,每个节点都是独立的。要使用它,我们得再初始化下节点的位时序、波特率、采样点前后时间段等相关配置。这些配置可以在每个节点的NBTR寄存器。 TIM截图20190106173220.png
   TIM截图20190106173525.png
  官方也提供了时序接口XMC_CAN_NODE_NominalBitTimeConfigure,传参结构体如下:
TIM截图20190106173710.png
   这里我们定义个实例变量,存在rom里面。依照上述的结构体进行赋值,再代入到XMC_CAN_NODE_NominalBitTimeConfigure中,这样就完成了节点的CAN相关配置。
   TIM截图20190106173927.png
    在板载的CAN中使用的是CAN_NODE1。同样在库上也定义了此寄存器的基地址。我们直接使用即可。最后使用 XMC_CAN_NODE_NominalBitTimeConfigure(CAN_NODE1, &baud);即可实现CAN节点的配置
TIM截图20190106174123.png
TIM截图20190106174314.png




回复

使用道具 举报

900

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 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位是配置的
TIM截图20190106180016.png
   那么我们需要配置的寄存器也就两个,一个是INIT,一个是CCE。INIT是节点初始化,复位INIT启用该CAN节点,置位终止该CAN节点的CAN通信。CCE是配置改变启用,复位的话,位时序寄存器、端口控制寄存器、错误计时器寄存器只能读不能写,而置位可以进行读写。那么在这里我们要配置端口,那么开始就得置位INIT、CCE,配置端口完成后,就复位INIT、CCE。
    TIM截图20190106180728.png
   TIM截图20190106180811.png
  明白了这个原理后,我们再看官方的demo(XMC4800这个并没有CAN的例子,但是可以参照XMC4500的),也就能清晰明白其思路。楼主为了快速开发肯定不可能用寄存器去操作,官方也有相对应的库接口,我们直接使用即可。操作CCE的是XMC_CAN_NODE_EnableConfigurationChange和XMC_CAN_NODE_DisableConfigurationChange;操作INIT的是XMC_CAN_NODE_SetInitBit和XMC_CAN_NODE_ResetInitBit。在操作端口以下截图:
TIM截图20190106181535.png




回复

使用道具 举报

900

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-1-6 18:50 | 显示全部楼层
知道套路之后,我们再此看下配置下CAN节点的端口,以便能正常收发报文。楼主在这里稍微弄得比较简单,CAN的发送使用非中断式发送,而接收使用了中断式接收。我们先来看下RX接收部分,首先看下端口的配置,RX的GPIO配置为输入接收模式,再配置下CAN_NODE1的接收输入线,这个可以通过节点端口控制器NPCR的RXSEL寄存器进行配置。从下图可知道CAN模块有8个接收输入线,那么CAN_NODE1的接收输入线该选择哪个呢,官方手册这里给了一张表,我们可以依次找到板子对应的输入线 TIM截图20190106183622.png
从下图可以看到,板载的CAN1的接收IO口为P1.13,对应的就是N1_RXDC.NPCR的RXSEL赋值为011B。这样就确定了CAN1的接收输入线了。
   TIM截图20190106183957.png
   那么官方库中也提供了相对应的接口以及枚举,我们就相对应赋值就行了。XMC_CAN_NODE_SetReceiveInput。
    TIM截图20190106184221.png
  我们还需要配置下发送TX,发送这块相对比较简单,直接IO复用为CAN_NODE1的TX接口即可。但是我们如何确定呢,我们可以查找到官方的用户手册的PORTS的IO功能这块,板子的CAN_TX使用的是P1_12.由图可以看到使用的是输出的ALT2复用
   TIM截图20190106184801.png
  那么我们相对应利用XMC_GPIO_SetMode这个设置IO模式的接口,把P1_12复用为ALT2即可。
   TIM截图20190106185034.png



回复

使用道具 举报

900

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-1-6 21:49 | 显示全部楼层
那么配置好上述相关参数后,我们还需要对报文进行存储。XMC4800的报文对象有256个。每个CAN节点和唯一的报文对象列表相关联。一个CAN节点仅传送分配给该节点列表的报文对象中的报文。也就是说,一个CAN节点接收到的帧也只能存储到属于该节点的报文对象中;而一个CAN节点要发送的帧也只能在分配给该节点的报文对象中选择。
对于报文对象这块,设计实在很丰富,可以设置网关,还带FIFO。太多功能可以需要摸清,楼主也只是实现了一点小功能。而且对报文的元素列表等还不太熟悉,主要是报文列表的链表关系,还需要后续再理解。
前面说了,不管是收发的报文,都需要分配一个报文对象存储。在这里我们新建两个报文对象,一个是收一个是发。
TIM截图20190106213212.png
  然后再把这两个报文列表交由控制面板寄存器分配。所使用的接口,也就是唯一的接口,分配方式如下:
TIM截图20190106213835.png
之后再使能报文接收对象的接收中断,在这里需要说明下CAN中断控制上,CAN模块一共有8条中断输出线,比如报文收发中断,错误帧中断等等,都可以自由分配到指定的中断输出线上,这样实现相对比较自由而且方便。而中断输出线的选择只需要INP寄存器进行切换即可。
TIM截图20190106214700.png
   综上可知,我们对其进行库函数编程对应的配置。
    TIM截图20190106214853.png



回复

使用道具 举报

900

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-1-6 22:03 | 显示全部楼层
配置完毕之后,我们需要对其进行业务逻辑编写。楼主在接收中断里面,进行接收报文,并且建立一个接收完毕标志。根据上贴的复合设备。HID的回调读写接口的写接口上判断这个接收完成标志,若成立则把此报文发送给HID,HID再发给PC。同样,HID的读接口收到了PC的数据,则把此信息发给CAN的发送报文,CAN再发给PC。
TIM截图20190106215415.png

  HID的写接口逻辑如下
   TIM截图20190106215520.png

HID的读接口逻辑如下;
TIM截图20190106215619.png
效果如下:
   TIM截图20190106220200.png

   TIM截图20190106220237.png


回复

使用道具 举报

900

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-1-6 22:11 | 显示全部楼层
连线图如下:
TIM截图20190106220734.png
  git效果:
    P90106-215924.gif
   工程附件如附件,
   下一贴:体验以太网+freertos+lwip移植。
P90106-215850.gif

EasyUsbToCan.zip

7.12 MB, 阅读权限: 10, 下载次数: 0



回复

使用道具 举报

880

TA的帖子

1

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2019-1-15 11:40 | 显示全部楼层
期待楼主的下一贴  很精彩,写的很详细,可以很好的跟着进行操作,赞!喜欢楼主的文


回复

使用道具 举报

1643

TA的帖子

1

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2019-1-15 14:20 | 显示全部楼层
可以的RC,写的很仔细,不出3个月一定赶超我了。
人已离开,无事别找,找也找不到。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-4-19 22:14 , Processed in 0.261234 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表