首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助] 版主 strongchen 请进!!!

我这几天实在太忙,没有及时来看这里的帖子,回答迟了,请见谅!

我大致看了一下你附的程序,由于无法调试,只能先和你讨论一下。

你这是CAN0发送的中断服务程序吗?如果是发送中断产生后进入你这个中断服务程序,会不会有这个问题:当3个缓冲区都空时,你将BUFFER0置数,然后发送;等发送中断产生后,你再去读CAN0TFLG,这时因为BUFFER0中的数据已发送,自然还是3个缓冲区都空,这是又还是用BUFFER0发送。如此循环,永远都只能用BUFFER0一个缓冲区。

你认为呢?
海纳百川  有容乃大
我认为你在中断服务程序中将总中断打开是有问题的。
海纳百川  有容乃大
总中断打开是因为有定时器等更高级的中断要响应,但在整个CAN0发送程序中,我的CAN0中断都是关闭的,因此不会产生自身中断嵌套等问题。

我上面的程序就是我现在用的,通信没有问题也没有错帧的情况。思路是每次要发送数据时必须等到3个发送缓冲区都为空时,才进入发送下面的数据。但这样做不是一个最佳的方案,有点浪费CPU的处理时间。


我最初的方案是:假如用0,1,2来代表3个发送缓冲区,发送一个长帧时,第一次进入中断响应 一次就用3个发送缓冲0,1,2来发送数据(如果他们都为空的话),然后退出中断,再次有中断时进入,应该是发送缓冲0为空,就用它来发送数据,当然也有可能是缓冲0,1都为空了,反正有几个为空就用几个发送,通过优先来控制发送的顺序。这样整个发送顺序应该是这样的: 0,1,2,0,1,2,0,1,2,0,1,…… 。

但现在优先级没法控制发送顺序,我不得以采用上面的折中的方案,牺牲CPU的处理时间来换取不错帧。
无限风光在险峰
 这个世界上没有什么事情不能发生 
 我的信箱:topchm@163.com 
 我的QQ :83317238
我仔细看了一下你现在的程序。你现在应该是在3个缓冲区都空时才重新装载3个缓冲区的数据,然后将其级别分别设置为0、1、2,然后开中断,是吧?
现在的现象,3个缓冲区应该可以按顺序发送吧。如果在这个程序的基础上,按你自己的思路编程,程序是怎样的,现象又怎样?
我的建议,至少在开CAN发送中断之前,先将总中断关掉,然后再开CAN发送中断。当退出中断服务程序时,CPU会自动将总中断打开。
海纳百川  有容乃大

[求助] 版主 strongchen 请进!!!

我上次的贴子: [求助]关于MOTO芯片的CAN通讯问题 原贴地址: http://bbs.eccn.com/dispbbs.asp?boardID=3&RootID=29760&ID=29760 我根据你回复测试过了,结果还是不行。CAN发送优先级设为定值,我按你所讲的进一次发送中断,只用一个空发送缓冲区发送。在发送数据量大时还是会有错帧。 我本意是想能够有效地利用MC9S12DG128内部的CAN通信控制器的3个发送缓冲区。即当我进一次发送中断,发送数据量大时,如果有几个空发送缓冲区就用几个,一次完成而不用多次进中断(减少中断次数),发送的顺序用发送优先级来控制。但一直都没成功。 下面是我的一段发送程序。为了不发生错帧,我现在用的是在所有发送缓冲区都为空时,才再次往发送缓冲区中放数据。我的程序是可用的,但没有达到我预期的目标。你能帮我解决吗。求教了!! interrupt void CAN0_Tx_ISR(void) // CAN0发送中断 { byte m,n,i,tmp,k; CAN0TIER=0x00; // 屏蔽CAN0发送中断 EnableInterrupts; // 开总中断I-bit; tmp=CAN0TFLG; if(tmp==0x07) TxPrior=0x00; // 复位发送优先级,连续发送256帧过程中必须有一次复位TxPrior else //if(TxPrior>250) // 本想只有优先大于250时,才关中断复位优先级的,但现在不行 { CAN0TIER=0x00; // 关中断,过一段时间外部会重新开中断,以等待3个发送缓冲区都为空 return; } for(i=0; i<3; i++) { if(!TxFlag) // 判断是否有数据需发送 { CAN0TIER=0x00; // 关中断 return; } m=tmp&(0x01<>2)|0xf8); // 数据移位到对应的标识位 CAN0TXIDR2=((*(++RdTxBufPtr)>>2)&0x3f)|(n<<6); n=*RdTxBufPtr; n=(n<<6)|((TxBuf[1]<<2)&0x3c); CAN0TXDSR0=*(++RdTxBufPtr); CAN0TXDSR1=*(++RdTxBufPtr); CAN0TXDSR2=*(++RdTxBufPtr); CAN0TXDSR3=*(++RdTxBufPtr); CAN0TXDSR4=*(++RdTxBufPtr); CAN0TXDSR5=*(++RdTxBufPtr); CAN0TXDSR6=*(++RdTxBufPtr); CAN0TXDSR7=*(++RdTxBufPtr); CAN0TXDLR=8; CAN0TXTBPR=TxPrior++; if(k<=10) { CAN0TXIDR3=n; // 为结束帧,置目的地址 TxFlag=FALSE; // 复位标志 TxBuf[0]=0x00; RdTxBufPtr=TxBuf; } else CAN0TXIDR3=n|0x02; // 不是结束帧,置目的地址 CAN0TFLG=m; } } CAN0TIER=0x07; // 开CAN0中断 } [em27][em27]
无限风光在险峰
 这个世界上没有什么事情不能发生 
 我的信箱:topchm@163.com 
 我的QQ :83317238
你的理解都是对的,按我现在的程序,3个缓冲区是可以按顺序发送的也不会产生错帧,但那只是物理上的顺序,优先级没有作用。

按我最初的思路现在还没法成功,因为优先级不能起作用,如0,1,2三个缓冲区对应的优先级分别为12,10,11时,它还是会按0,1,2三个缓冲区的顺序发送,而不是按1,2,0的顺序发送,所以会产生错帧,我没法解决。
无限风光在险峰
 这个世界上没有什么事情不能发生 
 我的信箱:topchm@163.com 
 我的QQ :83317238
我想这可能是因为你对3个缓冲区的操作顺序导致的。你可以试试将3个缓冲区的操作顺序倒过来,再看看结果如何?
海纳百川  有容乃大

[建议]

這是因為你的程式是每一个缓冲区剛填滿就立即発送出去,所从优先级就不工作,如要測試,應把三个缓冲区也填滿,後再発送出去,事情可解决!
na
OK,我会按你们说的测试的,到时把测试结果告诉大家。

不过这个优先级真是令人费解,而且MOTO还没有参考程序。这个优先级不就应该是所有等待发送的缓冲区(已经正在发送的或空的缓冲区的不记,有几个就算几个),在发送前都按照优先级重新排序然后再选择哪一个发送吗。
无限风光在险峰
 这个世界上没有什么事情不能发生 
 我的信箱:topchm@163.com 
 我的QQ :83317238
问题是在你的程序中,将某个缓冲区置数后马上就将其发送请求标志置1了,这时CAN模块自然会将这个缓冲区立即发送出去,因为这时只有这个缓冲区在等待发送!这样,优先级的设置也就没什么作用了。
海纳百川  有容乃大
我按你们说的测试过了,都没什么用,还是有错帧。不管我是将缓冲区发送顺序是正的,还是倒的。也不管我是在某个缓冲区置数后马上就将其发送请求标志置1,还是在所有缓冲区置数后再将发送请求标志置1。

一个缓冲区只有将发送请求标志置1后才算是等待发送的缓冲区,否则就算空缓冲区,即使你将缓冲区填满数据,发送请求标志不置1的话也还是空缓冲区。所以只有在发送标志置1后才能谈优先级的问题。如果通信任务比较重时,缓冲区1,2在等待发送,假设它们对应的优先级是24,25。那么这时缓冲区0填满,优先级为26,并置发送标志为1的话,按理也要等到缓冲区1,2发送完,才能发送缓冲区0。

不管我用哪种方法做,我的测试结果都一样,结果如下:

缓冲区号:0,1,2,0,1,0,1,0,1,0,1,  0, 1, 0,  1, 0

缓冲区对应的
优先级号:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

明显可以看到缓冲区2的数据发送不出去,接收到的数据也是那一帧丢掉了。
无限风光在险峰
 这个世界上没有什么事情不能发生 
 我的信箱:topchm@163.com 
 我的QQ :83317238
我按你们说的测试过了,都没什么用,还是有错帧。不管我是将缓冲区发送顺序是正的,还是倒的。也不管我是在某个缓冲区置数后马上就将其发送请求标志置1,还是在所有缓冲区置数后再将发送请求标志置1。

一个缓冲区只有将发送请求标志置1后才算是等待发送的缓冲区,否则就算空缓冲区,即使你将缓冲区填满数据,发送请求标志不置1的话也还是空缓冲区。所以只有在发送标志置1后才能谈优先级的问题。如果通信任务比较重时,缓冲区1,2在等待发送,假设它们对应的优先级是24,25。那么这时缓冲区0填满,优先级为26,并置发送标志为1的话,按理也要等到缓冲区1,2发送完,才能发送缓冲区0。

不管我用哪种方法做,我的测试结果都一样,结果如下:

缓冲区号:0,1,2,0,1,0,1,0,1,0,1,  0, 1, 0,  1, 0

缓冲区对应的
优先级号:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

明显可以看到缓冲区2的数据发送不出去,接收到的数据也是那一帧丢掉了。
无限风光在险峰
 这个世界上没有什么事情不能发生 
 我的信箱:topchm@163.com 
 我的QQ :83317238
能把你现在的程序(最好是整个project)发给我看看吗?
海纳百川  有容乃大

[建议][分享]

答案很準確.[em02][em02]
na
版主给我邮箱,我都没信心解决它了。
无限风光在险峰
 这个世界上没有什么事情不能发生 
 我的信箱:topchm@163.com 
 我的QQ :83317238
返回列表