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 收发不能进中断

Other Parts Discussed in Thread: TMS470MF06607, HALCOGEN

最近用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才对响应中断。

    所以请查看您的设置,是否正确?

  • 谢谢这位老师的解答。此问题已经解决。

    另外能否讲解下,这个MESSAGE OBJECT的本质是什么。如何配置一个MESSAGE OBJECT?是不是一定要在初始化的时候配置?在发送的时候再重新配置行不行?之前一直用的是STM32,感觉TI的CAN收发器的用法很不一样。

  • 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上面也有遇到。

    您可以参考下面链接:

    e2e.ti.com/.../123384.aspx

    基本上是CCS v4的安装问题(软件问题),推荐的方法是:

    1. 备份代码路径

    2. 把CCS完整卸载(删除)

    3. 使用管理员身份重新安装。

    但是现在CCS已经升级到V5.1.1了,这个问题已经修复了,所以建议直接升级到v5.1.1.

  • HI  Renton :

        昨天把CCS升级到V5,把CCS4的工程导入,就解决问题了。非常感谢。

  •       另外,我还想问下关于CAN中断的问题。

         我发现TMSMF06607的CAN无论是发送或者接收到进的是同一个ISR,CAN1HIGHINTERRUPT.能不能分开处理呢?如果在接收中断中进行发送,会不会出问题?

  • Hi Wei,

    DCAN模块可以设置两个ISR,canxLowLevelInterrupt 和canxHighLevelInterrupt, 您可以根据使用方式不同来配置。比如所有发送中断触发canxLowLevelInterrupt,所有接收中断触发canxHighLevelInterrupt。

    选择ISR的设置是在IntMux寄存器中实现的。

    另,接收中断中进行发送没有问题,您担心会有什么样的问题呢?

  • HI  Renton :

         这个问题已经搞清楚了。再次感谢。

       另外,我的程序在调试过程中,进入了BUS_FAULT中断,请问这是怎么回事?哪些情况下会进入BUS_FAULT中断?

  • 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();对该外设进行使能。

       您看看程序中是不是设置正确了。

  • 对了,如果您有不同于帖子标题的问题,麻烦您新开个帖子吧,这样以后查找也方便。多谢多谢

  •          呵呵,要的。那我们把BUS_FAULT的问题说完就完,我如果还有其他问题就开新帖。

    刚才我发现出现BUS_FAULT中断的原因了,是因为我在程序中使用的一个数组的长度太长了,长度是1785字节,我把长度改成100就没事了。请问这是为什么?我之前用MDK和IAR都没有出现类似的问题。

  • 噢,那数组是什么类型的?全局的还是局部的? 如果是局部的话,那就是stack溢出了。把Stack_size改大一些就好了。

  • 全局的哦。

  • 这个恐怕需要综合考虑了,能不能把您的map文件提供一下?

  • 您可以上传附件,通过"使用高级文本编辑"就可以上传附件了。

    或者发送至我的邮箱 lebo-ma@ti.com 也可以。