最近用TMS470MF06607进行开发,可以用轮询模式进行CAN收发,但是用中断模式的话,就始终进不了中断,请问应该如何设置?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
最近用TMS470MF06607进行开发,可以用轮询模式进行CAN收发,但是用中断模式的话,就始终进不了中断,请问应该如何设置?
Hi Wei,
您好。
TMS470MF06607中,CAN总线控制器中断总体上有3层控制:
1. 第一层: ARM-Cortex M3 CPU中断控制(NVIC)
这是CPU对所有中断是否进行响应的总开关,NVIC基地址0xE000E000。控制寄存器NVIC Interrupt Set-Enable registers 的偏移量是0x100。
您可以自行设置。
如果使用HALCoGen驱动代码生成工具的话,可以直接调用 NVIC_enable() 这个函数来打开全局控制。
2. DCAN1或2模块的中断控制开关
对于整个DCAN1或2模块来说,也有一个中断总开关,这个开关在寄存器DCAN CTL 的IE0和IE1 bit。
需要设置至少其中之一来打开DCAN模块总体的发送/接收中断。 (另有EIE,SIE位来控制错误和状态中断)
3. Message Object中断控制
以上两层之后,就是最后一层的中断控制,针对每个msg obj,都有相应的中断控制bit,这个bit在每个msg obj的MCTL中,TxIE和RxIE。
分别控制发送中断和接收中断。需要通过DCAN模块的IFxMCTL寄存器来对这些msg obj的MCTL进行设置。
以上三层都打开的前提下,CPU才对响应中断。
所以请查看您的设置,是否正确?
Hi Wei,
您好。STM32中使用的是ST的bxCAN模块吧?
如果是这样的话,bxCAN是个比较基础的控制器,它规定了3个发送buffer和2个接收FIFO。
但是TI的DCAN是相对高级的控制器,提供32个和16个buffer,您可以选择每个buffer是发送还是接收。
也就是说,bxCAN有5个buffer,但不能选择发送还是接收。
DCAN有32(16)个。
在这种相对复杂的结构下,配置每个message buffer(message object)是比较繁琐的过程,尤其对IC硬件本身来说。因此,TMS470MF系列中,提供了3组CAN Interface寄存器,就是手册上看到的 DCAN IF1CMD, IF1MSK, IF1ARB等等。
32 个message object没有给用户提供直接的接口进行访问,用户只能通过Interface寄存器来操作这些object. 但是object还是映射在内存空间中的,也就是说,调试的时候,你也可以直接到object的地址来查看他们的内容,具体信息在Datasheet中可以找到。
用IF寄存器组操作Msg obj时,最后一步一般是IFxCMD的Message Number位,就是将目标Msg obj的编号写入IFxCMD寄存器。这个动作之后,IF寄存器组中的所有配置就开始向真正的msg obj进行传递了,这个过程需要几个时钟周期来完成。
因此,一般不连续操作一个IF寄存器组,用完了IF1就用IF2,切换使用。
建议您下载TI的HALCoGen驱动代码生成工具,用它生成一个CAN的代码,就一目了然了。
谢谢老师的耐心解答,TI的CAN控制器功能确实要强大些,但是配置也要复杂些。
不知道老师能不能解答一下我在CCS调试中遇到的问题,非常感谢。
问题如下:我的开发环境是CCS4.2,在代码编译无误之后,点击DEBUG,也就是那个绿色虫子图标,出现以下错误提示:
exception occurred during launch
reason: an internal error occurred during "creating debug server"
然后我点开detail选项卡,显示的信息是:
contract ID "ti.com@/debug server1;1" is not registered with xpcom runtime.(0x80004005)
这个问题E2E上面也有遇到。
您可以参考下面链接:
基本上是CCS v4的安装问题(软件问题),推荐的方法是:
1. 备份代码路径
2. 把CCS完整卸载(删除)
3. 使用管理员身份重新安装。
但是现在CCS已经升级到V5.1.1了,这个问题已经修复了,所以建议直接升级到v5.1.1.
Hi Wei,
ARM Cortex M3 中对bus fault的定义如下:
Pre-fetch fault, memory access fault, and other address/memory related. This is synchronous when precise and asynchronous when imprecise.
所以一般情况下,出现这个问题,可能是没有对要操作的外设模块进行使能。
如果使用HALCoGen,需要在操作外设前用SysCtlPeripheralEnable();对该外设进行使能。
您看看程序中是不是设置正确了。