现使用TMS570LS3173 的DCAN接口接收数据,数据大概为70帧*8=560B左右。
目前配置mailbox 1-16为FIFO模式,1-15的EOB为0非中断收包,16的EOB设置为1,且为中断收包;mailbox 17 配置为接收最后1帧数据,中断收包;
初步设想是:除最后一帧在mailbox 17中接收外,其余帧在FIFO中接收。每到达16帧后,产生1次中断,每次中断遍历读取1-16mailbox中的数据;最后
一次中断增加读取mailbox 17的数据,最后组合完成整个数据接收。
当发送数据大于16帧时,只能接收到mailbox 16第一次中断,后续的中断好像没有产生。从USBCAN2上确认数据已正确发出。
麻烦帮忙看看以下几个问题:
1. FIFO模式和单独配置1个mailbox是否能同时使用;
2. FIFO模式配置后,mailbox 17的中断无法产生;
3. 数据发送过来后,为什么只能产生1次中断(在读取数据时,已经清理了中断和NewDat位);
谢谢。
mailbox初始化代码如下:
void LeuCanRecvMBInit(canBASE_t * const pCanReg)
{
UINT32 i = 0;
CAN_MSGBOX_SET canBoxSet = {0x00U};
canBoxSet.canXtd = CAN_BOXXTD_EXTENDED;
canBoxSet.canDir = CAN_BOXDIR_RECEIVE;
//canBoxSet.canInt = CAN_BOXINT_RECEIVE;
if((canREG1 != pCanReg)&&(canREG2 != pCanReg))
{
return;
}
for(i=canMESSAGE_BOX1;i<canMESSAGE_BOX16;i++)
{
/*- 中间帧接收MB初始化*/
if(canREG1 == pCanReg)
{
canBoxSet.canID = 0x00BE0000;/*-< CANA*/
}
else
{
canBoxSet.canID = 0x00DE0000;/*-< CANB*/
}
canBoxSet.canMsk = 0x0FFE0000u;
canBoxSet.canInt = 0;
canBoxSet.canEob = 0;
canMessageBoxInit(pCanReg, &canBoxSet, i);
}
canBoxSet.canInt = CAN_BOXINT_RECEIVE;
canBoxSet.canEob = 1;
canMessageBoxInit(pCanReg, &canBoxSet, canMESSAGE_BOX16);
/*- 尾帧接收MB初始化*/
if(canREG1 == pCanReg)
{
canBoxSet.canID = 0x00BF0000;/*-< CANA*/
}
else
{
canBoxSet.canID = 0x00DF0000;/*-< CANB*/
}
canBoxSet.canMsk = 0x0FFF0000u;
canBoxSet.canInt =CAN_BOXINT_RECEIVE;
canBoxSet.canEob = 1;
canMessageBoxInit(pCanReg, &canBoxSet, canMESSAGE_BOX17);
return;
}
UINT8 canMessageBoxInit(canBASE_t * const pCanReg,const CAN_MSGBOX_SET *const pSet,UINT32 box)
{
UINT32 canIDTmp = 0x00U;
UINT32 canMskTmp = 0x00U;
UINT32 loopCnt = 0x00u;
UINT8 cmdTmp = 0x00U;
ASSERT_FS( pCanReg!=NULL );
ASSERT_FS( pSet!=NULL );
cmdTmp = pCanReg->IF1CMD;
pCanReg->IF1ARB = 0x00000000U;
pCanReg->IF1CMD = 0xA8U;
pCanReg->IF1NO = (UINT8)box;
/** Wait until bus is not busy*/
while(((pCanReg->IF1STAT & 0x80U) ==0x80U) && (loopCnt < 200u))
{
loopCnt++;
}
if(CAN_BOXXTD_STANDARD == pSet->canXtd)/** 标准帧则对ID和MSK左移18位*/
{
canIDTmp = (pSet->canID << 18u);
canMskTmp = (pSet->canMsk << 18u);
}
else /** 扩展帧字节赋值ID和MSK*/
{
canIDTmp = pSet->canID;
canMskTmp = pSet->canMsk;
}
pCanReg->IF1MSK = (( pSet->canXtd & 0x01U) << 31U) | 0x40000000U | ((canMskTmp & 0x1FFFFFFFU) << 0U);
pCanReg->IF1ARB = (0x80000000U | (( pSet->canXtd & 0x01U) << 30U)| (( pSet->canDir & 0x01U) << 29U) | ((canIDTmp & 0x1FFFFFFFU) << 0U));
pCanReg->IF1MCTL = (0x00001000U | (( pSet->canInt & 0x03U)<<10)|(( pSet->canEob & 0x1U)<<7)| pSet->canDlc);
pCanReg->IF1CMD = (UINT8)0xF8U;
pCanReg->IF1NO = (UINT8)box;
/** Wait until bus is not busy*/
while(((pCanReg->IF1STAT & 0x80U) ==0x80U) && (loopCnt < 200u))
{
loopCnt++;
}
pCanReg->IF1CMD = cmdTmp;
return pCanReg->IF1NO;
}
读取CAN mailbox的数据的代码
uint32 LeuCanReadData(canBASE_t *node, uint32 messageBox, uint8 * pucPayload, uint32 *pulLen)
{
uint32 ulVal = 0, size = 0;
uint8 i=0;
uint32 success = 0U;
uint32 s_canByteOrder_Big[] = {3U, 2U, 1U, 0U, 7U, 6U, 5U, 4U};
while ((canREG1->IF1STAT & 0x80U) ==0x80U)
{
} /* Wait */
canREG1->IF1CMD = 0x7F;//0x08U;
canREG1->IF1NO = (uint8) messageBox;
while ((canREG1->IF1STAT & 0x80U) ==0x80U)
{
} /* Wait */
ulVal = canREG1->IF1MCTL;
if((ulVal&0x8000)==0x8000)
{
size = ulVal & 0xf;
if(size > 0x8U)
{
size = 0x8U;
}
*pulLen = size;
for (i = 0U; i < size; i++)
{
*pucPayload = canREG1->IF1DATx[s_canByteOrder_Big[i]];
pucPayload++;
}
if((ulVal&0x4000)==0x4000)
{
success = 3U;
}
else
{
success = 1U;
}
}
else
{
success = 0U;
}
return success;
}
gaoyang9992006:
1. FIFO模式和单独配置1个mailbox是否能同时使用;
应该是可以的,这两者本身是没有什么互相占用相同资源的地方,就是有可以分时使用。
2. FIFO模式配置后,mailbox 17的中断无法产生;
是不是FIFO模式配置时候关闭了mailbox的相关中断源,没有用过只是猜测。
3. 数据发送过来后,为什么只能产生1次中断(在读取数据时,已经清理了中断和NewDat位);
进入中断后,都做了哪些和中断寄存器相关的工作,比如是不是关闭了中断入口,退出时候不近要清零标志,还要最后一步进行重启中断服务。