在设计中,eCAN模式下,使用了4个接收邮箱,15、14、13、12号邮箱
正常情况下,4个邮箱的消息都可以正常触发接收中断,响应也正常。
问题是如果在正常通信的情况下,模拟CAN线断线后在恢复通信(实际是用打开/关闭USBCAN接口卡来模拟的),
程序就只响应优先级最高的15号接收邮箱的消息了,
如果终止15号接收邮箱的消息发送,程序就可以响应次优先级14号接收邮箱的消息了
以此类推,这种现象有人遇到吗?
另外这种故障情况下,对eCAN模块有什么影响?
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.
在设计中,eCAN模式下,使用了4个接收邮箱,15、14、13、12号邮箱
正常情况下,4个邮箱的消息都可以正常触发接收中断,响应也正常。
问题是如果在正常通信的情况下,模拟CAN线断线后在恢复通信(实际是用打开/关闭USBCAN接口卡来模拟的),
程序就只响应优先级最高的15号接收邮箱的消息了,
如果终止15号接收邮箱的消息发送,程序就可以响应次优先级14号接收邮箱的消息了
以此类推,这种现象有人遇到吗?
另外这种故障情况下,对eCAN模块有什么影响?
四个邮箱的接收中断都在0线上,CANMIL寄存器为0
LAMn寄存器最高位为1,其余位为0
CAN线断线恢复后,同时发送15、14邮箱的消息时,程序只响应15邮箱的信息,而不响应14邮箱的消息中断,CANRMP寄存器的相应位为0,即使数据成功的由CAN卡发送到CAN线上,
不发送15邮箱的消息,程序即可以正常响应14邮箱的消息
你好。
如果CANRMP对应位是0的话,就表示没有收到报文,肯定是不会触发中断的。
所以需要查一下为什么没有收到报文。当发送完14号邮箱的消息时,你看一下状态寄存器的一些情况。
昨天时间紧张,回复有误,抱歉。谢谢提醒
刚才单步调试了下,对比了CAN总线断线前后CANRMP寄存器的值,应该找到了问题的原因。
同样是通过USBCAN卡以100ms间隔发送三条消息(对应15、14、13号邮箱消息)到目标板,
在断线前,CANRMP的值总是只有一个邮箱的中断标志位被置位,因而程序的响应是正常的
可是断线后,CANRMP的值总是三个邮箱的中断标志位被同时置位,
程序在处理15邮箱的消息后,就把CANRMP复位了,没有再处理其他两个邮箱的消息。
所以只是响应高优先级的邮箱消息。
如果CANRMP同时响应多个邮箱中断,有什么好的处理机制。
你好。
如果同时有多个中断的话,清CANRMP标志时,可以只清除已经处理的那一位,不要全清了。
还有,按照你说的问题,就算全清了,应该在清完后,如果继续有14号邮箱的报文进了,中断应该是可以响应的。请问你有试过吗?
您好,打扰您一下,我是初学者,导师让我写了一个简单的发送和接收的ecan程序(分别,见附件), A DSP发送,B DSP 接收。用的是CCS3.3
1.然后我是把发送的程序烧写进了A板。
但出了问题:(Flash.cmd)在烧写的过程中,出现了一个警告:对于.const那一行,no matching。(见附件)
2.B板:将程序load program进板子,用仿真器在电脑上,观察接收邮箱寄存器里的值(此板子没有把接收程序烧进板子,但Flash里已经有了以前固化的程序,具体是什么我不清楚,不知道这个对于此时的仿真有没有影响),然后load program到板子里,开始run,在接收邮箱前设置的有断点,然后我就分别把高、低16位装入观察窗口,发现里面已经有值了,而且很大(在附件)这也太奇怪了吧?!2个板子的can的双绞线还没有连接怎么会有值呢?而且一断开,并断电;再一连接仿真器,值还是那个值。 太奇怪了?
由于是初学者,不知道哪里出了问题,所以想请教您一下,耽误您的宝贵时间了。我怀疑是我的程序有问题,但就是不知道问题出在哪里?
请教您一下,帮忙看看,谢谢,不胜感激!
另外,您能否提供一些基于2812的发送、接收成功的例程,我想学习一下;ti的官方发送接收例程在哪可以下载得到?谢谢
导师催的很紧,所以想借助于成功例程,尽快编好。简单的程序就可以,一个dsp发送1,另一个dsp接收1,只要能实现这个功能就好。谢谢。
祝您,工作顺利!期待您的回信,再次感谢您。1083176055@qq.com
你好。
1.这个Warning是你的CMD文件没有写好。请从http://www.ti.com/lit/zip/sprc097下载2812的驱动代码和相关例程。
2.你看到的LL和HH以及寄存器中的值是不是在接收到报文之前的。如果是的话,那是可能的。因为上电后,RAM中的所有数据都是随机数,包括未赋值的变量。
基本上搞定了,
修改了程序结构,不按官方的例子做了,
对CANRMP进行逐位判断,有中断发生说明要对数据缓存,
增加个缓冲区,判断出是哪个邮箱发生了接收中断,就把相关数据放进缓冲区
问题是会增加些周转开销,接收邮箱最好是从一端开始按使用频率排列,可稍稍减少些判断上的开销
刚测了下,CAN断线前后现象一致,程序可以工作了
具体的性能测试要交给同事了
谢谢TI支持
基本搞定了 要改下接收方式,不能像官方例子那样处理了,虽然曾经工作的很好
修改下CAN接收函数,要对CANRMP寄存器进行逐位判断,以处理多个接收中断标志位同时存在的情况
需要增加个缓冲区,接收函数判断发生接收中断后,用循环逐位判断CANRMP寄存器,查出中断邮箱,将相应数据放入缓冲区,清相应标志位就行了
当CANRMP寄存器为0时,就退出循环。
实际上只用到四个接收邮箱,要在查找中断邮箱上曾加开销,可以从32个邮箱的一端开始,按邮箱的使用频率排列接收邮箱,以减少些判断上的开销
程序已经可以工作了,CAN断线前和恢复后的现象一致,具体的测试要交给同事了
谢谢TI支持
非常感谢您的回复。谢谢。
您说的没错,确实是这样的,can的双绞线还没连接呢,寄存器里就观察到有数据了。
1.我使用最普通的2跟杜邦线,将他们绞在一起制作而成的?见附件图片。不知道在发送和接收程序都没有任何问题时,这个双绞线管不管用?由于是初学者,我对硬件的连接也感到质疑。希望您能帮我看看,谢谢您。板子和原理图都在附件图片里。
2. 板子和仿真器都是上海三意公司的。F2812的。
1083176055@qq.com,期待您的回复,谢谢,工作顺利!
非常感谢您的回复。谢谢。
我刚刚又在实验,发现RMP位一直没有置位到1,仿真暂停时发现那个黄色指针一直停在 RMP那一行
1.我怀疑是我的程序有问题,可就是不知道问题出在哪里?
2.我感觉是有关帧设置的问题,这部分我不是很理解,还有就是为什么寄存器里不能用MSGID?而非得用GID,
3.Mboxes.这个寄存器书上压根没讲,所以也是很迷糊。
我将我的发送和接收例程上传到了附件,你能否帮我看看 ,帮我修改一下,感激不尽啊。 如果有机会的话,想当面谢谢你。
导师催得要命,请大哥帮帮我吧。
谢谢。
期待您的回复,谢谢。1083176055@qq.com
你好。
我看了你的代码,有以下几个问题:
1. 发送程序的ID用的是扩展的ID,而接收的程序所有邮箱都是标准的,而且ID号都对不上,这样接收的板子肯定接收不到任何报文
2.接收的RMP判断用问题。while(ECanaRegs.CANRMP.all != 0xFFFFFFFF ) {} //等待RMP为1
如果上面这个循环要退出,那么接收方的所有邮箱都要有报文收到后才会退出,可是你发送的只有一个ID的报文。所以,应该判断某个邮箱的RMP位。
对了,还有eCAN模块的User Guide见http://www.ti.com/lit/pdf/spru074
UG上有非常详细的寄存器描述。
非常感谢您。祝您工作顺利!
我对于ID的设置比较陌生,您能否举个例子怎么去设置ID号 ?
我想将发送程序烧写到A dsp 的0号邮箱,作为发送邮箱;(编译的时候有Flash警告,见附件,不知道影响不)
//设置接收邮箱的ID,扩展帧,IDE,
ECanaMboxes.MBOX0.MID.all = 0xA0C80000;
//向邮箱RAM区写数据
ECanaMboxes.MBOX0.MDRL.all = 0x01234567;
ECanaMboxes.MBOX0.MDRH.all = 0x89ABCDEF;
用B DSP 的1号邮箱接收并利用仿真器观察LL和HH 有没有收到预定的数据:
邮箱ID等的设置:ECanaMboxes.MBOX1.MID.all = 0xA0C80000;
并把接收到的邮箱数据存放在 Uint32 LL和HH中;
for(;;)
{
while(ECanaRegs.CANRMP.all!=0x00000002);
ECanaRegs.CANRMP.all=0x00000002;
LL=ECanaMboxes.MBOX1.MDRL.all;//低16位
HH=ECanaMboxes.MBOX1.MDRH.all;//高16位
I++; //在这里 设置断点进行观察。
}
看了您的指导后,我就又试着写了写,TA TRS RMP 的设置我也改正了一下,就是不知道对不。
我刚刚又测试了一下,RMP老是不置位,还是停在等待那条语句。我快急哭了都,请大哥帮帮忙吧。谢谢。
当然了,我给大哥您看到的只是程序的一小部分,2个工程在附件里,包括对于DBO ,MBNR,CCR,SCB,CDR,波特率等的设置,
但我感觉还有问题,就是不知道出在哪里?
请大哥您帮我指正、修改一下,感激不尽。
再次感谢您。
你好。
你的初始化有点问题。
你没有把CANA的对应GPIO引脚配置成CAN功能,如果不配置的话,就是GPIO功能,那样肯定发不出来数据来。
调试CAN的时候,请一步步来。
程序改完后,用示波器来看DSP1发送的数据的TX引脚(DSP引脚上)是否有波形输出,然后看收发器的CANH和CANL上是否有信号。如果这些没有问题,那么DSP1的发送应该没有问题。
再看DSP2的RX引脚是否有波形。如果有信号,那么DSP2的CAN模块初始化没有问题,再去看RMP有没有收到数据的标志。
接收标志的判断,建议用bit来判断,而不要用all。
您好,非常感谢您,您是说can的初始化有问题吧。
由于我是初学者,看不出来,请大哥您帮忙修改一下吧,感激不尽啊。
如果程序有问题的话,用示波器检查相关引脚也是没用的吧?
我实在是检查不出程序到底是哪里出现了问题。非常着急,恳求大哥帮我修改一下吧,我用到的是ccs3.3。
期待您的回复,再次感谢。
1083176055@qq.com。Thanks.
您好,再次感谢您的回复
以下就是配置功能引脚的程序,将引脚设置为相应的功能。
不知道哪里缺失了什么,请大哥帮我修改修改,Thanks.
//配置GPIO引脚工作在eCAN功能
EALLOW;
GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7=1;
GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6=1;
//配置eCAN的RX和TX分别为eCAN的接收和发送引脚
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
ECanaShadow.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC = 1;
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
EDIS;
期待您的回复,谢谢。
您好,非常感谢您。
这份来自TI的说明书里也是说28--0位是ID消息标识符位,我不明白的是,为什么这29位只有1或0值,上面的IDE,AME,AAM,都是一位的,可以赋值为0或者1;
可这是29位呀,怎么能同时全部赋值为0或者1呢?
只有2种取值吗?对于这全部的29位?
难道说是这样的意思吗:
1. 全为1,才是1;全为0,才是0?
2. 1和0 对应的解释 怎么理解呢?
3. 还得由IDE决定?但是1的话,对应于IDE=1;0的话对应于IDE=1;也说不通啊。怎么理解呢?赋值为0或者1,不管用?由IDE决定?
4. 这里的0或者1难道代表的是2种情况而已吗?
这该怎么理解呢?!
谢谢,等待您的回复。
你好。
看你你是没有理解ID是怎么一回事。
每个邮箱都有对应的MSGID寄存器,用来设置邮箱ID。只有发送邮箱的ID和接收邮箱的ID相同时,发送邮箱发出的报文才能被接收邮箱收到。
IDE位配置该邮箱使用标准ID(11位)还是扩展ID(29位)。
非常感谢您的回复
是不是可以这样理解?
就是最高位IDE决定,ID是标准的,还是扩展的?
如果IDE为1,则是扩展标识符;
如果IDE为0,则是标准标识符。
谢谢您。
您能说说,为什么RMP不会置位的原因吗?就是我做的那个程序, A DSP 发,B dsp 接收。但就是接不到,不知道哪里的原因
每个工程的文件只有这两个CAN_TEST.c和DSP28_ECan.c是参考其他例程写的,其他的文件我没动。可就是找不出为什么不成的原因
您能否帮我看看是 程序哪里的问题呢?
感激不尽。
谢谢。
您好,我用的是2812的eCAN。
以下是配置功能引脚的程序,将引脚设置为相应的收、发功能。
不知哪里缺失了什么,请您指出,谢谢.
//配置GPIO引脚工作在eCAN功能
EALLOW;
GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7=1;
GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6=1;
//配置eCAN的RX和TX分别为eCAN的接收和发送引脚
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
ECanaShadow.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC = 1;
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
EDIS;
期待您的回复,谢谢。
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读取邮箱中的数据
第五步:复位接收消息挂起标志
您好,我现在设计的是3块dsp之间的通信,但遇到了这样的问题:
A的一个发送邮箱的ID为8000FFFF;
B的一个发送邮箱的ID为80C8FFFF;
C的其中2个邮箱分别接收A、B发送过来的数据;
我通过观察寄存器发现,只能收到ID为8000FFFF的邮箱数据,而另一个好像不被响应;只有将A DSP的复位键按下不松手,才会看到邮箱接收到了来自于B板的数据,一松手复位键,又是只能收到A板的数据,好像是A板的优先级高,永远不让B发送数据一样。也不能不让B板接收数据吧,A永远在发送……不知道这是怎么回事,怎么做才能让C同时收到A、B发送过来的数据呢?谢谢。
期待您的回复……
我使用中断线0,接收数据:程序如下
Uint32 Rec_l;
Uint32 Rec_h;
interrupt void ECAN0INTA_ISR(void) // eCAN-A
{ struct ECAN_REGS ECanaShadow;
do
{
ECanaShadow.CANRMP.all=ECanaRegs.CANRMP.all;//检查接收成功标志位位值
}
while(ECanaShadow.CANRMP.bit.RMP12!=1&&ECanaShadow.CANRMP.bit.RMP1!=1);
//循环等待接收
GpioDataRegs.GPFCLEAR.bit.GPIOF14=1;//灯亮,证明已经接收信息
ECanaShadow.CANRMP.all = 0;
ECanaShadow.CANRMP.bit.RMP1 = 1;
ECanaShadow.CANRMP.bit.RMP12 = 1;
ECanaRegs.CANRMP.all = ECanaShadow.CANRMP.all;//目的是,复位GMIF0接收成功中断标志位
GpioDataRegs.GPFSET.bit.GPIOF14=1;//让指示灯灭,用来监测动态变化
Rec_l=ECanaMboxes.MBOX1.MDRL.all;//收到的数据低位保存在接收邮箱Mbox1的低32位
Rec_h=ECanaMboxes.MBOX1.MDRH.all;//收到的数据高位保存在接收邮箱Mbox1的高32位
PieCtrl.PIEACK.bit.ACK9 = 1;//使得同组其他中断能够得到响应
EINT;
}
您好,我用的是TMS320F28335,我最近做的项目中包含如下的一下can总线通信系统:
A -DSP中有2个邮箱,标识符分别为:0x8000FFFF (发送邮箱);0x8FFFFFFF(接收邮箱)。
B-DSP中与A对应的也有2个邮箱,0x8000FFFF (接收邮箱);0x8FFFFFFF(发送邮箱)。
然后我是把A中的AD采样数据结果寄存器中的数字量发给B,用仿真器和B连接,来观察B对应的邮箱里的数据,观察接收是否正常。
把B中的一个数值常量整型25发送给A,让A稳定输出一25V电压值。
【问题是】,
一、如果让2个DSP中的上述的4个邮箱都工作时,用示波器观测can总线上的波形:木有任何波形,就是数据没有被传送;
二、如果分别让2个DSP中的2个邮箱,就是一个发,另一个DSP接收数据,是能正常工作的。
【我是这么想的】好像是 仲裁机制的问题,优先级高的一直在占用总线,而不会退出,优先级低的始终获取不了传送数据权限。
也不知道我这样认为对不对?您是怎么处理 在2块或者多块DSP,之间进行若干个邮箱之间进行数据通信的,怎么做才能让每个邮箱都有权获取总线特权,都可以实时的进行数据传输呢?
我的qq,1083176055@qq.com期待您的回复,谢谢。
您好,我用的是TMS320F28335,我最近做的项目中包含如下的一下can总线通信系统:
A -DSP中有2个邮箱,标识符分别为:0x8000FFFF (发送邮箱);0x8FFFFFFF(接收邮箱)。
B-DSP中与A对应的也有2个邮箱,0x8000FFFF (接收邮箱);0x8FFFFFFF(发送邮箱)。
然后我是把A中的AD采样数据结果寄存器中的数字量发给B,用仿真器和B连接,来观察B对应的邮箱里的数据,观察接收是否正常。
把B中的一个数值常量整型25发送给A,让A稳定输出一25V电压值。
【问题是】,
一、如果让2个DSP中的上述的4个邮箱都工作时,用示波器观测can总线上的波形:木有任何波形,就是数据没有被传送;
二、如果分别让2个DSP中的2个邮箱,就是一个发,另一个DSP接收数据,是能正常工作的。
【我是这么想的】好像是 仲裁机制的问题,优先级高的一直在占用总线,而不会退出,优先级低的始终获取不了传送数据权限。
也不知道我这样认为对不对?您是怎么处理 在2块或者多块DSP,之间进行若干个邮箱之间进行数据通信的,怎么做才能让每个邮箱都有权获取总线特权,都可以实时的进行数据传输呢?
我的qq,1083176055@qq.com期待您的回复,谢谢。
不是太理解你的描述,我的理解是
CAN总线是串行总线,无论信息帧的优先级高低,只要有信息帧抢占了总线,要等该信息帧传输完毕,其他信息帧才能在竞争总线。
所以只要低优先级的信息在总线上传输过,应该一定能被接收的。
另外如果对信息帧的实时性要求不高的话,可以考虑在规定的时间片中传输信息帧。
简单的设计,如有10条周期100ms的信息要传输,可以将100ms划分为10个10ms,在每个10ms传输一个信息帧,每100ms为1个循环,以降低信息帧间竞争总线的概率。
复杂的设计应该参考TTCAN