Other Parts Discussed in Thread: HALCOGEN, TMS320F28069, CONTROLSUITE
程序却无法正确执行,会一直卡在没有消息接收到那里,不知道是什么原因,希望各位帮助一下。
谢谢,谢谢!!!
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.
Other Parts Discussed in Thread: HALCOGEN, TMS320F28069, CONTROLSUITE
程序却无法正确执行,会一直卡在没有消息接收到那里,不知道是什么原因,希望各位帮助一下。
谢谢,谢谢!!!
Hi Yichao,
在帮你找到问题之前,我有几个小问题需要你的帮忙确认一下,一个CAN总线调试不通无外乎也就是硬件方面和软件程序配合操作的不成功而已。
首先,麻烦先确定你的CAN总线在物理连接上面都多了,CaN高和CAN低没有接反,另外两块板之间最好共地链接。另外CAN总线节点终端的120欧的匹配电阻都有接。
其次,你在把工程从CCS换到IAR的过程中是怎么操作的,是通过我们的HALCOGEN重新建立一个IAR的工程,还是说是把CCS工程里面的原文件单独倒过来了。如果是前者的话,麻烦仔细比对二者在CAN总线界面的设置。注意波特律是否一样,是不是都是采用标准帧还是采用了默认的扩展帧。还有就是ID符是否正确,有没有设置过滤寄存器。
如果这些都确认没问题的话,那只能在确定一下主机端是否工作正常,用示波器抓一下CAN总线的波形。确认总线上发送出来了带正确ID符的报文信息。
希望上述的信息能够帮到你定位问题,如果还有什么疑问的地方,我们可以继续交流。
谢谢
ken
谢谢你的回复。
第一个问题,硬件方面应该没有任何问题,就是同一块板子,在ccs下调试可以通过,在IAR下调试会一直卡在等待接收消息那里,不知道原因在哪里。
第二个问题,我是直接将CCS下的内容直接复制到IAR下的,比如sys_main.c,can.c can.h,system.h等头文件都拷贝过来。这样才会出现上面的问题,在ccs下正常运行,在IAR下却始终收不到任何消息。
非常感谢你的回复。
Hi Yichao,
首先因为我现在电脑里没有装IAR,所以不能生成一个实例给你试试。
不过你可以先这样尝试一下,打开我们的HALCOGEN,重新建立一个和IAR相符的工程。具体操作就是在新建工程的时候,在tools那个选项框里选择IAR tools。然后参考你以前符合CCS的那个配置,完全同样的设置到新的工程中。
然后在copy sys_main.c文件到新的工程里面。在编译下载到板子上面看看运行状况。
另外还有一个问题想确认一下,你接收报文是用的中断接收还是查询接收。如果是终端接收的话,还要注意vim.c里面关于中断通道的配置。
谢谢
肯
谢谢,我现在HALCOGEN下试试。
接收的时候用的是查询接收。
谢谢你。
你好,我现在用HALCOGEN生成了IAR下的工程,但是还是无法通过,我可能没有设置正确,不知道你可否给我一个例子(IAR模式下CAN设置情况)
我在IAR下程序会一直卡在while(!canIsRxMessageArrived(canREG1, canMESSAGE_BOX1));这个地方。
现在想设置3137不屏蔽任何消息,不知道和设置CCS的有什么区别
这一个是你上次回答我的解决方案:你可以通过修改HALCOGEN里面的ID来修改你的程序。或者是说做如下的改变。这样CAN节点就不会屏蔽任何ID,所有的CAN 信息都会接收。
canREG1->IF1MSK = 0xC0000000U | (((uint32)0x00000000U & (uint32)0x000007FFU) << (uint32)18U);
谢谢了,真的非常感谢。
Hi Yichao,
谢谢你的回复,我们公司没有IAR的license,而且电脑上不能装破解版软件。所以关于能在IAR上调试工程,这个我暂时还给不了你。
不过我在HALCOGEN里面建立了一个机遇IAR的工程,里面使能和配置了CAN的基本要求,波特率是500bps,11位ID的标准帧, messagebox 接收CAN报文,同时屏蔽寄存器不做设置,允许接收总线上任何ID的报文。接收采用查询方式。

这个文件需要用HALCOGEn打开,然后你在自动生成代码,然后再把你的main程序加进去。
由于我不能在线调试,所以这个文件也只是一个最基本的文件。
如果可以的话,你可以把你的工程发到我个人的邮箱里面,我帮你看看你的代码。
ken-wang@ti.com
希望能帮到你。
谢谢
肯
Hi Jiajun,
你用的我们的C2000的F28069,我这个帖子是介绍我们安全MCU的CAN通信的。不过两者的设置也差不多。
你的CAN总线发送和接收都卡在查询标志位的地方,造成这种现象有几种原因:
1. 硬件上面,你使用的是两块板子还是说是一块板子。如果是两块板子的话,你可以用示波器监测一下总线上的波形,或者如果你有类似于USB-CAN的设备可以挂在总线上监听一下总线报文,看通信线路是否正常。如果是单块板子的,你可以试试CAN模块的TEST模式,也就是自发自收模式,看看这个通不通,如果还有问题的话,那就是在CAN模块的初始化有问题了。
2. 软件方面,首先确认两个节点的CAN通信速率是一致的,接收端和发送端设置的报文ID相符的,不然是收不到报文,建立不了通信的。
如果你有装我们公司的Controlsuite的话,你可以在里面找到F28069关于CAN模块的一个例程代码。里面的设置可供你参考。
如果没有的话,可以下载下面我上传的工程代码。

谢谢
ken
你好,Ken Wang
我硬件是相同的两块板,芯片换了一下一块28069,和28062.CAN自测模式下能通信的,初始化是下面这段
/* 使能eCAN模块接收发送功能*/
ECanaRegs.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANRIOC.bit.RXFUNC = 1;
/* 配置eCAN模块功能 */
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.ABO = 1; // AutoBusOpening =1 enable =0 diaable
ECanaShadow.CANMC.bit.STM = 0; // =0 normal,=1 selftesting
//ECanaShadow.CANMC.bit.SCB = 1; // =1 eCAN =0 SCC
ECanaShadow.CANMC.bit.SCB = 0; // =1 eCAN =0 SCC
ECanaShadow.CANMC.bit.DBO = 0; // =0:MSB ; =1:LSB
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
/* 初始化先将所有邮箱控制位清0*/
ECanaMboxes.MBOX0.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX1.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX2.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX3.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX4.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX5.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX6.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX7.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX8.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX9.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX10.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX11.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX12.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX13.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX14.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX15.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX16.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX17.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX18.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX19.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX20.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX21.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX22.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX23.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX24.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX25.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX26.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX27.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX28.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX29.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX30.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX31.MSGCTRL.all = 0x00000000;
// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
// as a matter of precaution.
ECanaRegs.CANTA.all = 0xFFFFFFFF; /* Clear all TAn bits */
ECanaRegs.CANRMP.all = 0xFFFFFFFF; /* Clear all RMPn bits */
ECanaRegs.CANGIF0.all = 0xFFFFFFFF; /* Clear all interrupt flag bits */
ECanaRegs.CANGIF1.all = 0xFFFFFFFF;
/* CCR置,等待CCE置位,使eCANA进入配置模式*/
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 1 ; // Set CCR = 1
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
while(ECanaRegs.CANES.bit.CCE != 1 ) {} // Wait for CCE bit to be set..
ECanaShadow.CANBTC.all = 0;
/* The following block is for 80 MHz SYSCLKOUT. (40 MHz CAN module clock Bit rate = 1 Mbps
See Note at end of file. */
ECanaShadow.CANBTC.bit.BRPREG = 1;
ECanaShadow.CANBTC.bit.TSEG2REG = 4;
ECanaShadow.CANBTC.bit.TSEG1REG = 13;
ECanaShadow.CANBTC.bit.SAM = 1;
ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
ECanaShadow.CANGAM.all = ECanaRegs.CANGAM.all;
ECanaShadow.CANGAM.bit.AMI = 1;
ECanaRegs.CANGAM.all = ECanaShadow.CANGAM.all;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 0 ; // Set CCR = 0
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
// Wait until the CPU no longer has permission to change the configuration registers
while(ECanaShadow.CANES.bit.CCE != 0 ){} // Wait for CCE bit to be cleared..
/* Disable all Mailboxes */
ECanaRegs.CANME.all = 0; // Required before writing the MSGIDs
发送的配置
/* 写消息标识符 MSGID */
ECanaMboxes.MBOX5.MSGID.all = 0x10000000;
ECanaMboxes.MBOX5.MSGID.bit.IDE = 1; // 扩展标识符
/* 配置 Mailbox 5 作为发送邮箱 */
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD5 = 0;
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
/* 使能邮箱 */
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME5 = 1;
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
/* 在消息控制寄存器中写 DLC 区 */
ECanaMboxes.MBOX5.MSGCTRL.bit.DLC = 1;
CpuTimer0Regs.TCR.bit.TSS = 0;
主函数
ECanaMboxes.MBOX5.MDL.byte.BYTE0 = 0x55;
ECanaShadow.CANTRS.all = 0;
ECanaShadow.CANTRS.bit.TRS5 = 1; // 设置 TRS for mailbox under test
ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
while(ECanaRegs.CANTA.bit.TA5 == 0 ) {} // 等待 TA5 bit 置位..
TXcounter++;
ECanaShadow.CANTA.all = 0;
ECanaShadow.CANTA.bit.TA5 = 1; // 清除 TA5
ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
接收的邮箱配置
/* 写消息标识符 MSGID 区 */
ECanaMboxes.MBOX1.MSGID.all = 0x10000000; // 扩展标识符
// ECanaMboxes.MBOX1.MSGID.all = 0x9555AAA1;
ECanaMboxes.MBOX1.MSGID.bit.IDE = 1;
/* 配置邮箱1作为接收器邮箱 */
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD1 = 1;
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
/* 使能邮箱mailbox 1 */
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME1 = 1;
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
接收的主函数
do
{
ECanaShadow.CANRMP.all = ECanaRegs.CANRMP.all;
}
while(ECanaShadow.CANRMP.bit.RMP1 != 1 ); // 等待 RMP1置位..
RXcounter++;
ECanaShadow.CANRMP.bit.RMP1 = 1;
w[0]= ECanaMboxes.MBOX1.MDL.byte.BYTE0;
w[1]= ECanaMboxes.MBOX1.MDL.byte.BYTE1;
w[2]= ECanaMboxes.MBOX1.MDL.byte.BYTE2;
w[3]= ECanaMboxes.MBOX1.MDL.byte.BYTE3;
w[4]= ECanaMboxes.MBOX1.MDH.byte.BYTE4;
w[5]= ECanaMboxes.MBOX1.MDH.byte.BYTE5;
w[6]= ECanaMboxes.MBOX1.MDH.byte.BYTE6;
w[7]= ECanaMboxes.MBOX1.MDH.byte.BYTE7;
ECanaRegs.CANRMP.all = ECanaShadow.CANRMP.all; // 清除 RMP1 位并重新启动接收
请帮忙看一下那里有问题了,发送的CANH有波形输出的,CAN收发器总线也有波形,接收端的引脚也有波形输入。
Hi jiajun,
关于c2000的产品,我用得不多,CAN通信模块不是特别的清楚,我需要先查看一下我们相关的文档,再分析一下你的代码。
我会尽快回复你。
谢谢
ken
1)邮箱初始化配置:首先应确定从32个邮箱中选择要配置的目标邮箱,比如配置成发送邮箱或接收邮箱,一般是成对出现的。然后是对靠近的邮箱进行ID号(标识符)的配置,数据长度,优先级的设置,是远程帧还是普通扩展数据帧等。
具体步骤总结如下:第一步在写标识符前必须将所有邮箱屏蔽掉,ECanaRegs.CANME.all=0。(第五步,最后将要用到的邮箱配置好后,使能需要用到的邮箱,比如邮箱0和邮箱16,ECanaRegs.CANME.bit.ME0=1;ECanaRegs.CANME.bit.ME16=1;)第二步:通过向寄存器CANMC的CDR位请求改变数据区,该位允许快速更新数据消息。再第五步的时候,需要将该位写0,CPU请求正常操作。第三步,设置邮箱的ID(标识符,发送邮箱对应的接收邮箱的标识符是一致的,这个需注意),数据方向寄存器配置了发送邮箱还是接收邮箱。数据长度,发送优先级的设置,以及是否有远方应答帧的请求,向邮箱RAM区写数据(这个注意:ECanaboxes.MBOXO.MDRL.all=?ECanaboxes.MBOXO.MDRH.all=?)
2)邮箱初始化之后,就可以对其进行发送或者接收操作啦!前面第一步主要是前奏,现在进入主题。
消息的发送操作,分为五步:
第一步:清除CANTRS发送请求置位寄存器---当邮箱n准备发送时,CPU将TRSn置1,启动发送。就相当于一个开关一样,当数据要被发送时,将开关TRSn闭合,则数据发送出去。上电复位,各位都被清0。接着配置发送响应寄存器CANTA,如果邮箱n中的消息已经发送成功,则相应的TAn将置位。CPU通过向TANTA中的位写1,使其复位。如果已经产生中断,向CANTA寄存器写1,则可以清除中断,向CANTA寄存器写0没有影响。上电后,寄存器所有的位都被清除。
第二步:初始化邮箱,见第一部分。
第三步:设置TRS请求发送标志,请求发送消息
第四步:等待传输响应位置位,邮箱完成发送。(由0置1才能跳出循环等待,这点是关键!!!)
第五步:复位TA和传输标志,需要向相应的寄存器位写1才能清零(这点相当重要,向该位写1才能清零,等待下一次发送!!!)。
3)消息的接收操作,分五步操作
第一步:设置局部接收屏蔽寄存器LAMn,它可以指明哪些标识符位
第二步:初始化邮箱
第三步:等待接收响应标志置位
第四步:CPU读取邮箱中的数据
第五步:复位接收消息挂起标志