TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS570LS3173 DCAN 采用FIFO接收数据 如何配置

现使用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位);

进入中断后,都做了哪些和中断寄存器相关的工作,比如是不是关闭了中断入口,退出时候不近要清零标志,还要最后一步进行重启中断服务。

赞(0)
未经允许不得转载:TI中文支持网 » TMS570LS3173 DCAN 采用FIFO接收数据 如何配置
分享到: 更多 (0)