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

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

总中断打开是因为有定时器等更高级的中断要响应,但在整个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

[求助] 版主 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
OK,我会按你们说的测试的,到时把测试结果告诉大家。

不过这个优先级真是令人费解,而且MOTO还没有参考程序。这个优先级不就应该是所有等待发送的缓冲区(已经正在发送的或空的缓冲区的不记,有几个就算几个),在发送前都按照优先级重新排序然后再选择哪一个发送吗。
无限风光在险峰
 这个世界上没有什么事情不能发生 
 我的信箱: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
我按你们说的测试过了,都没什么用,还是有错帧。不管我是将缓冲区发送顺序是正的,还是倒的。也不管我是在某个缓冲区置数后马上就将其发送请求标志置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
版主给我邮箱,我都没信心解决它了。
无限风光在险峰
 这个世界上没有什么事情不能发生 
 我的信箱:topchm@163.com 
 我的QQ :83317238
返回列表