⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linmsg.c

📁 飞思卡尔车身控制技术研讨会资料 里面有LIN的主从节点源程序
💻 C
字号:
#define LINMSG_C
/******************************************************************************
*                                                       
*       Copyright (C) 2005 Freescale Semiconductor, Inc.
*       All Rights Reserved								              
*														                            
* Filename:     linmsg.c                
*														                            
* Revision:      										                    
*														                            
* Functions:    Message processing subsystem 
*												                            
* Description:  
*
* Notes:        
*
******************************************************************************/

#include <linbase.h>

#if !defined(LINAPI_1_0)

/****************************************************************************
 * Function prototypes 
 ***************************************************************************/
static void LinMemCopy( LIN_BYTE * dst, LIN_BYTE * src, LIN_BYTE len);


/****************************************************************************
 * Functions 
 ***************************************************************************/


 /***************************************************************************
 * Function :   LinMemCopy
 *
 * Description: Copy data from src to dst
 *
 * Returns:     none
 *
 * Notes:       
 *
 **************************************************************************/
void LinMemCopy( LIN_BYTE * dst, LIN_BYTE * src, LIN_BYTE len)
{
    while( len > 0 )
    {
        len-- ;
        dst[len] = src[len];
    }
    return;
}


/***************************************************************************
 * Function :   LIN_GetMsg
 *
 * Description: Find message and copy the message data to the buffer
 *
 * Returns:
 *  LIN_NO_ID       - msg is not configured for this node
 *  LIN_INVALID_ID  - msg is received by this node (but data is copied)
 *  LIN_MSG_NODATA  - msg data has not been received so far
 *  LIN_OK          - msg data is copied to the buffer
 *
 * Notes:       API function, OPTIM
 *
 **************************************************************************/
LINStatusType   LIN_GetMsg( LINMsgIdType msgId, LINMsgRefType msgData )
{
    LIN_BYTE    idx;
    LIN_BYTE    intMask;
    LIN_BYTE    retStatus;

    /* check requested Id */
    if ( msgId > (LIN_BYTE) LIN_FRAME_MAX_ID )
    {
        /* Id is not valid */
        return LIN_NO_ID;
    }

    /* Search message */
    idx = LinLookupTable[msgId];

    if ( (idx & LIN_MSG_NOT_IGNORED) == 0 )
    {
        /* message is ignored by this node */
        return LIN_NO_ID;
    }

    LIN_DBG_SET_PORT_7;
    intMask = LIN_DisableInt();         /* disable interrupts */

    /* If we transmit this message return error */
    if ( idx & LIN_MSG_SEND ) 
    {
        /* we send this message, but copy anyway */
        /* NB: not initialized data can be copied ! */

#if defined(MASTER)
        LinMemCopy( msgData, LinMsgBuf[idx & LIN_MSG_INDEX_MASK], LinLengthTable[msgId]);
#endif /* defined(MASTER) */

#if defined(SLAVE)
        /* Message's index is least 6 bits. */
        idx &= LIN_MSG_INDEX_MASK;

        LinMemCopy( msgData, LinMsgBuf[idx], LinMsgLen[idx]);
#endif /* defined(SLAVE) */

        /* don't change msg status */

        retStatus = LIN_INVALID_ID;
    }
    else
    {
        /* we receive this message */

        /* Message's index is least 6 bits. */
        idx &= LIN_MSG_INDEX_MASK;

                                 /* LinMsgStatus can be change from interrupt only to LIN_MSG_OK or */
                                 /* LIN_MSG_OVERRUN so we didn`t need close interrupt early  */
                                 /* ??? paranoia: LinMsgStatus can be changed to LIN_MSG_NODATA only from */ 
                                 /* LIN_Init if call it from interrupt */

        /* Check if there is data */
        if (( LinMsgStatus[idx] & LIN_MSG_NODATA ) != 0 )
        {
            /* no data -> don't copy */
            retStatus = LIN_MSG_NODATA;
        }
        else
        {    
            /* If message was found copy the data */

#if defined(MASTER)
            LinMemCopy( msgData, LinMsgBuf[idx], LinLengthTable[msgId]);
#endif /* defined(MASTER) */

#if defined(SLAVE)
            LinMemCopy( msgData, LinMsgBuf[idx], LinMsgLen[idx]);
#endif /* defined(SLAVE) */

            /* change message status */
            LinMsgStatus[idx] = LIN_MSG_NOCHANGE;

            retStatus   = LIN_OK;
        }    
    }
    
    LIN_EnableInt(intMask);             /* enable interrupts */
    LIN_DBG_CLR_PORT_7;

    return retStatus;
}

/***************************************************************************
 * Function :   LIN_PutMsg
 *
 * Description: find and write message 
 *
 * Returns:
 *  LIN_NO_ID       - msg is not configured for this node
 *  LIN_INVALID_ID  - msg is transmitted by this node
 *  LIN_OK          - data is copied to the msg buffer
 *
 * Notes:        API function, OPTIM
 *
 **************************************************************************/
LINStatusType   LIN_PutMsg( LINMsgIdType msgId, LINMsgRefType msgData )
{
    LIN_BYTE    idx;
    LIN_BYTE    intMask;
    
    /* check requested Id */
    if ( msgId > (LIN_BYTE) LIN_FRAME_MAX_ID )
    {
        /* Id is not valid */
        return LIN_NO_ID;
    }

    /* Search message */
    idx = LinLookupTable[msgId];

    if ( (idx & LIN_MSG_NOT_IGNORED) == 0 )
    {
        /* message is ignored by this node */
        return LIN_NO_ID;
    }

    /* If we receive this message return error */
    if ( ( idx & LIN_MSG_SEND ) == 0 )
    {
        return LIN_INVALID_ID;
    }

    /* Node process this message. Message's index is least 6 bits. */
    idx &= LIN_MSG_INDEX_MASK;

    LIN_DBG_SET_PORT_7;
    intMask = LIN_DisableInt();     /* disable interrupts */

    /* If message was found then copy the data */

#if defined(MASTER)
    LinMemCopy( LinMsgBuf[idx], msgData, LinLengthTable[msgId]);
#endif /* defined(MASTER) */

#if defined(SLAVE)
    LinMemCopy( LinMsgBuf[idx], msgData, LinMsgLen[idx]);
#endif /* defined(SLAVE) */

    /* change the status */
    LinMsgStatus[idx] = LIN_MSG_NOCHANGE | LIN_MSG_UPDATED;
    
    LIN_EnableInt(intMask);         /* enable interrupts */
    LIN_DBG_CLR_PORT_7;

    return LIN_OK;
}

/***************************************************************************
 * Function :   LIN_MsgStatus
 *
 * Description: Return current message status 
 *
 * Returns:    
 * When message is specified as received:
 *  LIN_NO_ID           - msg is not configured for this node
 *  LIN_OK              - msg data changed since last LIN_GetMsg call;
 *  LIN_MSG_NOCHANGE    - msg data not received since last LIN_GetMsg call;
 *  LIN_MSG_NODATA      - msg data not received since driver initialization;
 *  LIN_MSG_OVERRUN     - msg data was overwritten by driver before read.
 *
 * When message is specified as transmitted:
 *  LIN_NO_ID           - msg is not configured for this node
 *  LIN_OK              - msg data transmitted since last LIN_PutMsg call;
 *  LIN_MSG_NOCHANGE    - msg data not transmitted since last LIN_PutMsg call;
 *  LIN_MSG_NODATA      - msg data not updated since driver initialization.
 * 
 * Notes:               API function, OPTIM
 *
 **************************************************************************/
LINStatusType   LIN_MsgStatus( LINMsgIdType msgId )
{
    LIN_BYTE    idx;

    /* check requested Id */
    if ( msgId > (LIN_BYTE) LIN_FRAME_MAX_ID )
    {
        /* Id is not valid */
        return LIN_NO_ID;
    }

    /* Search message */
    idx = LinLookupTable[msgId];

    if ( (idx & LIN_MSG_NOT_IGNORED) == 0 )
    {
        /* message is ignored by this node */
        return LIN_NO_ID;
    }

    /* Node process this message. Message's index is least 6 bits. */
    return ( LinMsgStatus[idx & LIN_MSG_INDEX_MASK] & LIN_MSG_STATUS_MASK );
}

#endif /* !defined(LINAPI_1_0) */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -