F28075查询式收发CAN的问题

        F28075的CAN每个邮箱有没有单独的发送完成标志位,像28069的寄存器ECanaRegs.CANTA.bit.TA1表示邮箱2的发送完成标志。

        我想采用查询式发送CAN数据,将5~32号邮箱都配置成发送邮箱,CAN发送数据时,从低往高查询邮箱发送完成标志位,那个邮箱有空就将数据填充进去,然后用邮箱硬件发送机制发送CAN数据,最大程度的提高发送数据的速率。但是在28075的数据手册中只看到寄存器CAN_ES的bit3表示TXOK,但不特指哪个邮箱。

       目前我是用中断方式收发CAN数据。软件给5~32号发送邮箱配置标志位,填充了数据后,标志位置1,在对应邮箱中断ISR中将对应的邮箱软件标志位清零。在CAN配置位1Mbps后,频繁的发送邮箱中断不停的打断CAN任务的数据填充到邮箱的执行。导致实际发送数据的时间更长。

#pragma CODE_SECTION(CAN1INTA_ISR, "ramfuncs");//
interrupt void CAN1INTA_ISR (void)
{
Uint32 Status = 0;
Uint32 ObjectNum = 0;
int16 iChx;

Status = CANIntStatus(CANA_BASE,CAN_INT_STS_CAUSE);

if(Status == CAN_INT_INT0ID_STATUS)
{
Status = GetCanStatus(CAN_ID_A,CAN_STS_CONTROL);

//故障发生
if(((Status & ~(CAN_ES_TXOK | CAN_ES_RXOK)) != 7) &&\
((Status & ~(CAN_ES_TXOK | CAN_ES_RXOK)) != 0))
{
uCanAErrFlag = (Status & 0x00000007);
if((Status & 0x00000007)==4)
{
un_FaultFlag.bit.bIDFault= 1;
}
}
}
else if((Status > 0)&&(Status <= 32))
{
ObjectNum = Status;
if((ObjectNum <= 4) && (ObjectNum >= 1))
{
CANMessageGet(CANA_BASE, ObjectNum, &CanA_RxObj, true);
SysCanReceive(&CanA_RxObj);
}
else if((ObjectNum <= 32) && (ObjectNum >= 5))
{
SysCanCtrl.all &= (~((UINT32)1 << (ObjectNum-5)));
}
else
{
//无效邮箱
}
CANIntClear(CANA_BASE,ObjectNum);
}

//清除CAN全局中断标志位
HWREGH(CANA_BASE + CAN_O_GLB_INT_CLR) = CAN_GLB_INT_CANINT0;

PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9;
}

 

1 个回复