亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? can.c

?? 基于TI公司Cortex-M3的uart超級(jí)通信開發(fā)
?? C
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
//!
//! If you specify a message object buffer that already contains a message
//! definition, it will be overwritten.
//!
//! \return None.
//
//*****************************************************************************
void
CANMessageSet(unsigned long ulBase, unsigned long ulObjID,
              tCANMsgObject *pMsgObject, tMsgObjType eMsgType)
{
    unsigned short usCmdMaskReg;
    unsigned short usMaskReg0, usMaskReg1;
    unsigned short usArbReg0, usArbReg1;
    unsigned short usMsgCtrl;
    tBoolean bTransferData;
    tBoolean bUseExtendedID;

    bTransferData = 0;

    //
    // Check the arguments.
    //
    ASSERT(CANBaseValid(ulBase));
    ASSERT((ulObjID <= 32) && (ulObjID != 0));
    ASSERT((eMsgType == MSG_OBJ_TYPE_TX) ||
           (eMsgType == MSG_OBJ_TYPE_TX_REMOTE) ||
           (eMsgType == MSG_OBJ_TYPE_RX) ||
           (eMsgType == MSG_OBJ_TYPE_RX_REMOTE) ||
           (eMsgType == MSG_OBJ_TYPE_TX_REMOTE) ||
           (eMsgType == MSG_OBJ_TYPE_RXTX_REMOTE));

    //
    // Wait for busy bit to clear
    //
    while(CANRegRead(ulBase + CAN_O_IF1CRQ) & CAN_IF1CRQ_BUSY)
    {
    }

    //
    // See if we need to use an extended identifier or not.
    //
    if((pMsgObject->ulMsgID > CAN_MAX_11BIT_MSG_ID) ||
       (pMsgObject->ulFlags & MSG_OBJ_EXTENDED_ID))
    {
        bUseExtendedID = 1;
    }
    else
    {
        bUseExtendedID = 0;
    }

    //
    // This is always a write to the Message object as this call is setting a
    // message object.  This call will also always set all size bits so it sets
    // both data bits.  The call will use the CONTROL register to set control
    // bits so this bit needs to be set as well.
    //
    usCmdMaskReg = (CAN_IF1CMSK_WRNRD | CAN_IF1CMSK_DATAA | CAN_IF1CMSK_DATAB |
                    CAN_IF1CMSK_CONTROL);

    //
    // Initialize the values to a known state before filling them in based on
    // the type of message object that is being configured.
    //
    usArbReg0 = 0;
    usArbReg1 = 0;
    usMsgCtrl = 0;
    usMaskReg0 = 0;
    usMaskReg1 = 0;

    switch(eMsgType)
    {
        //
        // Transmit message object.
        //
        case MSG_OBJ_TYPE_TX:
        {
            //
            // Set the TXRQST bit and the reset the rest of the register.
            //
            usMsgCtrl |= CAN_IF1MCTL_TXRQST;
            usArbReg1 = CAN_IF1ARB2_DIR;
            bTransferData = 1;
            break;
        }

        //
        // Transmit remote request message object
        //
        case MSG_OBJ_TYPE_TX_REMOTE:
        {
            //
            // Set the TXRQST bit and the reset the rest of the register.
            //
            usMsgCtrl |= CAN_IF1MCTL_TXRQST;
            usArbReg1 = 0;
            break;
        }

        //
        // Receive message object.
        //
        case MSG_OBJ_TYPE_RX:
        {
            //
            // This clears the DIR bit along with everything else.  The TXRQST
            // bit was cleared by defaulting usMsgCtrl to 0.
            //
            usArbReg1 = 0;
            break;
        }

        //
        // Receive remote request message object.
        //
        case MSG_OBJ_TYPE_RX_REMOTE:
        {
            //
            // The DIR bit is set to one for remote receivers.  The TXRQST bit
            // was cleared by defaulting usMsgCtrl to 0.
            //
            usArbReg1 = CAN_IF1ARB2_DIR;

            //
            // Set this object so that it only indicates that a remote frame
            // was received and allow for software to handle it by sending back
            // a data frame.
            //
            usMsgCtrl = CAN_IF1MCTL_UMASK;

            //
            // Use the full Identifier by default.
            //
            usMaskReg0 = 0xffff;
            usMaskReg1 = 0x1fff;

            //
            // Make sure to send the mask to the message object.
            //
            usCmdMaskReg |= CAN_IF1CMSK_MASK;
            break;
        }

        //
        // Remote frame receive remote, with auto-transmit message object.
        //
        case MSG_OBJ_TYPE_RXTX_REMOTE:
        {
            //
            // Oddly the DIR bit is set to one for remote receivers.
            //
            usArbReg1 = CAN_IF1ARB2_DIR;

            //
            // Set this object to auto answer if a matching identifier is seen.
            //
            usMsgCtrl = CAN_IF1MCTL_RMTEN | CAN_IF1MCTL_UMASK;

            //
            // The data to be returned needs to be filled in.
            //
            bTransferData = 1;
            break;
        }

        //
        // This case should never happen due to the ASSERT statement at the
        // beginning of this function.
        //
        default:
        {
            return;
        }
    }

    //
    // Configure the Mask Registers.
    //
    if(pMsgObject->ulFlags & MSG_OBJ_USE_ID_FILTER)
    {
        if(bUseExtendedID)
        {
            //
            // Set the 29 bits of Identifier mask that were requested.
            //
            usMaskReg0 = pMsgObject->ulMsgIDMask & CAN_IF1MSK1_IDMSK_M;
            usMaskReg1 = ((pMsgObject->ulMsgIDMask >> 16) &
                            CAN_IF1MSK2_IDMSK_M);
        }
        else
        {
            //
            // Lower 16 bit are unused so set them to zero.
            //
            usMaskReg0 = 0;

            //
            // Put the 11 bit Mask Identifier into the upper bits of the field
            // in the register.
            //
            usMaskReg1 = ((pMsgObject->ulMsgIDMask << 2) &
                            CAN_IF1MSK2_IDMSK_M);
        }
    }

    //
    // If the caller wants to filter on the extended ID bit then set it.
    //
    if((pMsgObject->ulFlags & MSG_OBJ_USE_EXT_FILTER) ==
       MSG_OBJ_USE_EXT_FILTER)
    {
        usMaskReg1 |= CAN_IF1MSK2_MXTD;
    }

    //
    // The caller wants to filter on the message direction field.
    //
    if((pMsgObject->ulFlags & MSG_OBJ_USE_DIR_FILTER) ==
       MSG_OBJ_USE_DIR_FILTER)
    {
        usMaskReg1 |= CAN_IF1MSK2_MDIR;
    }

    if(pMsgObject->ulFlags & (MSG_OBJ_USE_ID_FILTER | MSG_OBJ_USE_DIR_FILTER |
                              MSG_OBJ_USE_EXT_FILTER))
    {
        //
        // Set the UMASK bit to enable using the mask register.
        //
        usMsgCtrl |= CAN_IF1MCTL_UMASK;

        //
        // Set the MASK bit so that this gets transferred to the Message Object.
        //
        usCmdMaskReg |= CAN_IF1CMSK_MASK;
    }

    //
    // Set the Arb bit so that this gets transferred to the Message object.
    //
    usCmdMaskReg |= CAN_IF1CMSK_ARB;

    //
    // Configure the Arbitration registers.
    //
    if(bUseExtendedID)
    {
        //
        // Set the 29 bit version of the Identifier for this message object.
        //
        usArbReg0 |= pMsgObject->ulMsgID & CAN_IF1ARB1_ID_M;
        usArbReg1 |= (pMsgObject->ulMsgID >> 16) & CAN_IF1ARB2_ID_M;

        //
        // Mark the message as valid and set the extended ID bit.
        //
        usArbReg1 |= CAN_IF1ARB2_MSGVAL | CAN_IF1ARB2_XTD;
    }
    else
    {
        //
        // Set the 11 bit version of the Identifier for this message object.
        // The lower 18 bits are set to zero.
        //
        usArbReg1 |= (pMsgObject->ulMsgID << 2) & CAN_IF1ARB2_ID_M;

        //
        // Mark the message as valid.
        //
        usArbReg1 |= CAN_IF1ARB2_MSGVAL;
    }

    //
    // Set the data length since this is set for all transfers.  This is also a
    // single transfer and not a FIFO transfer so set EOB bit.
    //
    usMsgCtrl |= (pMsgObject->ulMsgLen & CAN_IF1MCTL_DLC_M);

    //
    // Mark this as the last entry if this is not the last entry in a FIFO.
    //
    if((pMsgObject->ulFlags & MSG_OBJ_FIFO) == 0)
    {
        usMsgCtrl |= CAN_IF1MCTL_EOB;
    }

    //
    // Enable transmit interrupts if they should be enabled.
    //
    if(pMsgObject->ulFlags & MSG_OBJ_TX_INT_ENABLE)
    {
        usMsgCtrl |= CAN_IF1MCTL_TXIE;
    }

    //
    // Enable receive interrupts if they should be enabled.
    //
    if(pMsgObject->ulFlags & MSG_OBJ_RX_INT_ENABLE)
    {
        usMsgCtrl |= CAN_IF1MCTL_RXIE;
    }

    //
    // Write the data out to the CAN Data registers if needed.
    //
    if(bTransferData)
    {
        CANDataRegWrite(pMsgObject->pucMsgData,
                        (unsigned long *)(ulBase + CAN_O_IF1DA1),
                        pMsgObject->ulMsgLen);
    }

    //
    // Write out the registers to program the message object.
    //
    CANRegWrite(ulBase + CAN_O_IF1CMSK, usCmdMaskReg);
    CANRegWrite(ulBase + CAN_O_IF1MSK1, usMaskReg0);
    CANRegWrite(ulBase + CAN_O_IF1MSK2, usMaskReg1);
    CANRegWrite(ulBase + CAN_O_IF1ARB1, usArbReg0);
    CANRegWrite(ulBase + CAN_O_IF1ARB2, usArbReg1);
    CANRegWrite(ulBase + CAN_O_IF1MCTL, usMsgCtrl);

    //
    // Transfer the message object to the message object specifiec by ulObjID.
    //
    CANRegWrite(ulBase + CAN_O_IF1CRQ, ulObjID & CAN_IF1CRQ_MNUM_M);

    return;
}

//*****************************************************************************
//
//! Reads a CAN message from one of the message object buffers.
//!
//! \param ulBase is the base address of the CAN controller.
//! \param ulObjID is the object number to read (1-32).
//! \param pMsgObject points to a structure containing message object fields.
//! \param bClrPendingInt indicates whether an associated interrupt should be
//! cleared.
//!
//! This function is used to read the contents of one of the 32 message objects
//! in the CAN controller, and return it to the caller.  The data returned is
//! stored in the fields of the caller-supplied structure pointed to by
//! \e pMsgObject.  The data consists of all of the parts of a CAN message,
//! plus some control and status information.
//!
//! Normally this is used to read a message object that has received and stored
//! a CAN message with a certain identifier.  However, this could also be used
//! to read the contents of a message object in order to load the fields of the
//! structure in case only part of the structure needs to be changed from a
//! previous setting.
//!
//! When using CANMessageGet, all of the same fields of the structure are
//! populated in the same way as when the CANMessageSet() function is used,
//! with the following exceptions:
//!
//! \e pMsgObject->ulFlags:
//!
//! - \b MSG_OBJ_NEW_DATA indicates if this is new data since the last time it
//! was read
//! - \b MSG_OBJ_DATA_LOST indicates that at least one message was received on
//! this message object, and not read by the host before being overwritten.
//!
//! \return None.
//
//*****************************************************************************
void
CANMessageGet(unsigned long ulBase, unsigned long ulObjID,
              tCANMsgObject *pMsgObject, tBoolean bClrPendingInt)
{
    unsigned short usCmdMaskReg;
    unsigned short usMaskReg0, usMaskReg1;
    unsigned short usArbReg0, usArbReg1;
    unsigned short usMsgCtrl;

    //
    // Check the arguments.
    //
    ASSERT(CANBaseValid(ulBase));
    ASSERT((ulObjID <= 32) && (ulObjID != 0));

    //
    // This is always a read to the Message object as this call is setting a
    // message object.
    //
    usCmdMaskReg = (CAN_IF1CMSK_DATAA | CAN_IF1CMSK_DATAB |
                    CAN

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲自拍偷拍麻豆| 中文字幕在线观看一区| 欧美日韩一级片在线观看| 91亚洲午夜精品久久久久久| 成人亚洲一区二区一| 成人黄色777网| 欧美视频一区二区三区| 欧美日本高清视频在线观看| 欧美一区二区三区影视| 精品国产91乱码一区二区三区| 欧美精品一卡两卡| 2017欧美狠狠色| 欧美激情艳妇裸体舞| 亚洲一区二区三区自拍| 日本伊人午夜精品| 97精品国产97久久久久久久久久久久| 99久久国产免费看| 欧美巨大另类极品videosbest | 免费欧美在线视频| 国产**成人网毛片九色| 欧美亚洲另类激情小说| 日韩欧美激情在线| 一区二区不卡在线视频 午夜欧美不卡在 | 91精品久久久久久久99蜜桃| 日韩精品一区国产麻豆| 日韩久久一区二区| 精品一区二区三区欧美| 欧美性猛交xxxx乱大交退制版| 久久综合999| 久久精品国产久精国产| 色婷婷狠狠综合| 久久久久99精品一区| 青娱乐精品在线视频| 欧美影片第一页| 国产精品成人免费精品自在线观看| 日韩电影一区二区三区| 欧美综合视频在线观看| 亚洲欧美日韩中文播放| 不卡一区二区中文字幕| 中文成人av在线| 国产剧情一区二区三区| 亚洲精品高清在线| 欧美性猛交xxxxxxxx| 91同城在线观看| 精品电影一区二区| 国产精品一级二级三级| 久久久电影一区二区三区| 激情综合色播激情啊| 精品国偷自产国产一区| 国产一区二区三区黄视频| 久久精品欧美日韩| 不卡av电影在线播放| 一级日本不卡的影视| 欧美日韩黄色一区二区| 激情欧美日韩一区二区| 中文字幕在线免费不卡| 欧美视频在线播放| 韩国av一区二区三区四区 | 视频一区欧美精品| 日韩精品一区二区三区三区免费| 国产乱淫av一区二区三区 | 在线观看视频一区二区欧美日韩| 亚洲成人一区二区在线观看| ww久久中文字幕| 色噜噜久久综合| 美国欧美日韩国产在线播放| 国产精品传媒入口麻豆| 日韩一区和二区| 国产精品 日产精品 欧美精品| 国产欧美日韩精品a在线观看| 欧美色窝79yyyycom| 国模无码大尺度一区二区三区| 国产精品免费av| 精品国产乱码久久久久久影片| 国产成人亚洲综合a∨婷婷 | 在线这里只有精品| 国产精品系列在线观看| 日韩高清在线观看| 一区二区三区免费观看| 久久精品夜色噜噜亚洲aⅴ| 欧美一区二区视频网站| 欧美性生活影院| 色综合天天综合网国产成人综合天| 久久99精品久久久久久动态图| 亚洲国产另类av| 亚洲电影视频在线| 亚洲综合一区在线| 亚洲午夜精品网| 亚洲香蕉伊在人在线观| 亚洲电影你懂得| 日本女人一区二区三区| 日韩精品91亚洲二区在线观看| 亚洲一二三区在线观看| 一区av在线播放| 久久精品国产在热久久| 精油按摩中文字幕久久| 国产乱一区二区| 99精品国产99久久久久久白柏| 色噜噜狠狠一区二区三区果冻| 99精品视频在线观看免费| 91久久一区二区| 欧美tickle裸体挠脚心vk| 中日韩av电影| 亚洲午夜久久久| 国产精品一区免费视频| 日本久久一区二区| 日韩精品一区国产麻豆| 亚洲欧洲在线观看av| 亚洲成人av福利| 成人成人成人在线视频| 欧美女孩性生活视频| 国产精品午夜在线观看| 偷偷要91色婷婷| 色综合久久久久久久| 久久久亚洲午夜电影| 久久成人综合网| 91美女在线看| 国产精品网站在线| 久久99这里只有精品| 精品1区2区3区| 亚洲最新视频在线播放| 成人av在线资源网站| 精品少妇一区二区三区| 天天av天天翘天天综合网色鬼国产| 精品一区二区精品| 7777精品伊人久久久大香线蕉经典版下载 | 欧美成人一区二区三区在线观看| 亚洲少妇30p| 毛片av一区二区| 久久久亚洲综合| 亚洲国产综合色| 欧美伊人久久大香线蕉综合69| 国产欧美精品一区aⅴ影院 | 精品乱人伦小说| 国内精品久久久久影院色 | 日韩国产欧美视频| 欧美欧美欧美欧美首页| 日韩激情视频网站| 欧美精品一区二区三区在线 | 日韩精品一区二区三区swag| 男女性色大片免费观看一区二区| 欧美三级韩国三级日本一级| 天天色 色综合| 久久精品夜色噜噜亚洲a∨| 成人综合婷婷国产精品久久免费| 国产精品美女一区二区三区| 97久久精品人人做人人爽50路| 亚洲最大成人综合| 日韩精品最新网址| 99久久伊人精品| 蜜桃视频在线观看一区| 国产精品嫩草99a| 91精品国产麻豆| 91片在线免费观看| 极品美女销魂一区二区三区| 综合自拍亚洲综合图不卡区| 91国偷自产一区二区三区成为亚洲经典 | 激情五月激情综合网| 亚洲女与黑人做爰| 日韩精品一区二区三区视频| 成人午夜短视频| 激情六月婷婷久久| 日韩成人一区二区| 亚洲一区在线视频观看| 久久久国产精品午夜一区ai换脸| 欧美日韩成人综合天天影院| 东方欧美亚洲色图在线| 久草这里只有精品视频| 亚洲午夜日本在线观看| 一区二区三区四区精品在线视频| 欧美va在线播放| 555夜色666亚洲国产免| 日本二三区不卡| 欧美影院一区二区三区| 色综合天天做天天爱| av电影天堂一区二区在线观看| 久久激情五月婷婷| 久久成人久久鬼色| 免费精品视频在线| 久久精品国产一区二区| 久久福利资源站| 国产精品2024| 99国内精品久久| 欧美日韩精品久久久| 欧美理论电影在线| 国产亚洲一二三区| 国产精品久久久久久久久快鸭| 国产精品污www在线观看| 亚洲欧美综合网| 午夜欧美视频在线观看| 精品一区二区三区蜜桃| 成人精品gif动图一区| 91精品福利在线| 国产亚洲综合在线| 亚洲精品国产品国语在线app| 五月天网站亚洲| 懂色av一区二区夜夜嗨| 欧美日韩不卡一区二区| 国产精品美女久久久久av爽李琼 | aaa欧美日韩|