- UID
- 104724
- 性别
- 男
|
我上次的贴子:
[求助]关于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
|
|