airwill 发表于 2014-12-10 10:26 
是的, eCAN 里的各个时间寄存器都是以位时间为单位计数的.
用中断实现的数据收发,目的是想增加超时功能,判断发送是否超时,若超时,返回TRANSMIT_OVERTIME,现在我在TRS置位前配置了寄存器
struct ECAN_REGS ECanaShadow;
//设置接收邮箱超时寄存器:读CANTSC的值,设置MOTO;
//MOTO:消息对象超时寄存器,用于真正地接收消息的定时邮递计数器的限制值
EALLOW;
BeginTscTime = ECanaRegs.CANTSC;
ECanaMOTORegs.MOTO16 = BeginTscTime + 2;
EDIS;
//设置接收邮箱超时寄存器:设置CANTOC;
//CANTOC:超时控制寄存器位 1:使能邮箱超时功能 0:禁止邮箱超时功能
//在设置TOC[n]位之前,MOTO寄存器应该加载与TSC相关的超时值
ECanaShadow.CANTOC.all = ECanaRegs.CANTOC.all;
ECanaShadow.CANTOC.bit.TOC16 = 1;
ECanaRegs.CANTOC.all = ECanaShadow.CANTOC.all;
那么在什么地方判断
if ((ECanaRegs.CANTOS.all & 0xFFFF0000) != 0)
{
return TRANSMIT_OVERTIME;//返回指示发送超时
}
|